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 아키텍처 강의를 듣고 강의 내용을 요약해서 정리한 글입니다.
반응형