android

클린 아키텍처란? 복잡성 제거

liz_devel 2022. 8. 16. 15:27

깊은 모듈이란 무엇인가?

모듈: 무언가를 구현하고 인터페이스를 제공하는 것 (ex: 클래스, 퍼블릭 메소드)

추상화: 중요하지 않은 세부사항을 감췆누는 간소화된 뷰

깊은 모듈 vs 얕은 모듈: 하나의 간단한 요청으로 많은 작업이 완료된다

깊은 인터페이스의 예: File.open()

얕은 것들: 래퍼 클래스, 나쁜 추상화들

 

 

깊은 모듈은 사용 예시: 인터페이스만 알면 된다

얕은 모듈은 사용 예시: 퍼블릭 메소드가 너무 많거나 하나의 메소드로 작업이 안 되어서 여러 메소드를 불러서 작업해야 하는 경우

 

나쁜 추상화의 예)

특별히 하는 일 없이 존재하는 래퍼 클래스 또한 나쁨

인터페이스만 계속 제공하면서 감추려고 했던 것들을 굳이 노출시켜서 깊게 만들 수 있는 모듈을 얕게 만드는 경우

 

 

범용 인터페이스는 더 깊다

범용은 지금 비용이 들고, 특정 용도는 나중에 비용이 든다.

모듈을 범용으로 만들려면? 인터페이스:범용, 구현: 현재 요구사항

판단을 위한 질문들:

  • 현재 요구사항을 모두 만족시킬 수 있는 가장 심플한 인터페이스인가?
  • 이 메소드(퍼블릭 메소드)가 얼마나 많은 상황에서 사용될 수 있는가?
    ->답이 하나라면 이는 적신호(private로 감추든가 해야 함)
  • 이 API는 현재 나의 요구사항을 해결하는 데에 실제로 사용하기 편한가?
    -> 지금 당장의 문제도 해결하면서 실제로도 사용하기 편한가에 대해 다시 한번 생각할 필요 있음

 

정보 은닉 VS 정보 유출

  • 중요 원칙: 일반적인 케이스들을 최대한 심플하게 만들어라
  • 불필요한 정보 감추기
    -> 특정 클래스 안에 특정 정보가 있는데 이 정보가 노출됨으로써 누군가 사용한다고 생각하면 됨
    (원치않게 다른 개발자들이 사용하게 된다고 생각하면)
  • 정보 누출: 같은 지식이 여러 군데에서 사용된다
  • 적신호: 과다 노출
    -> 사용자가 일반적인 작업들을 위해서 명료하지 않은 기능들을 배워야 한다

 

 

복잡성을 아래로 끌어내리기

  • 심플한 인터페이스는 심플한 구현보다 낫다
  • 주의: 이를 남용하면 오히려 정보 유출로 이어질 수 있음
  • 중요 원칙: 아래의 경우에 끌어내리기
    - 기존에 있는 기능과 밀접하게 연관되어 있다면
    - 앱의 여러부분들을 더 단순하게 만들어준다면
    - 클래스의 인터페이스를 단순하게 만들어 준다면
//bad
bufferedReader.getBufSize()
bufferedReader.adjustBufSize()
bufferedReader.readNext()

//good
bufferedReader.readNext()

 

 

 

추상화 사이의 경계 찾기

이럴 때는 합치기

  • 정보가 공유된다
  • 함께 있는 것이 인터페이스를 단순하게 만들어 준다
  • 코드 중복을 없애준다
  • 적신호: 코드 반복은 제대로 추상화가 이뤄지지 않았음을 의미할 수 있다

 

이럴 때는 나누기

  • 특정 목적의 API가 범용 클래스 안에 있을 때
  • 다른 종류의 범용 매커니즘이 함께 있을 때

 

그럼 재사용성은?

  • 흔한 실수: 재사용성 확보를 DRY 원칙 차원에서만 바라봄
    -> 이 경우, 성급하게 공통 요소를 부모 클래스로 만들 수 있음.
    이 경우, 자식 클래스가 새롭게 만들어질 때 부모의 공통 요소를 잘 이해하고 있어야 함.
    (SOLID 원칙 중 리스코프 치환 원칙 참조) -> 자식이 코드량 감소의 대가를 치르는 형국
    * 코드 중복을 기계적으로 줄이는 것이 목적이 아님
    (재사용성은 인터페이스에 복합성에서 사용성을 더 낫게하는 측면으로 접근해야됨)

 

  • 반대로 중복 코드가 없는 한 하나의 클래스 / 메소드를 크게 만들어도 된다는 오해를 할 수 있음
    재사용성 != 하나의 기능/ 클래스가 앱의 여러 군데에서 재활용
    현실적으로 앱 프로젝트 내에서 그런 경우가 얼마나 될까?
    심지어 가장 많이 활용될 것 같은 유틸리티 클래스도 실제로는 활용되지 않는 경우가 많음 (멀티 모듈 참조)

 

  • 재사용성은 독립적인 요소로 타 모듈에서 참조될 수 있음을 의미

 

 

 

본 글은 The RED : 강사룡의 앱 안정성 및 확장성 강화를 위한 Android 아키텍처 강의를 듣고 강의 내용을 요약해서 정리한 글입니다.

반응형