📖 [13장] 컴포넌트 응집도
📘 클린 아키텍처 북스터디 정리입니다
📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장
✅ 핵심 요약 (Key Takeaways)
이 장의 핵심 문장은?
컴포넌트를 결정할 때는 재사용성과 개발 가능성이라는 상충하는 힘 사이에서 균형을 잡아야 한다.
저자가 전달하고자 하는 메세지 요약
- 컴포넌트 응집도에 관련된 세 가지 원칙(REP, CCP, CRP)은 서로 상충하지만 동시에 균형을 이루어야 하는 원칙임
- REP: 함께 재사용되는 클래스는 함께 릴리스되어야 함
- CCP: 같은 이유로 변경되는 클래스는 함께 있어야 함
- CRP: 사용하지 않는 클래스에 의존하지 않도록 피해야 함
- 시스템의 성숙도나 팀의 관심사에 따라 컴포넌트 구조의 최적 지점은 달라질 수 있음
💡 내용 정리
서론
- 어떤 클래스를 컴포넌트에 포함시킬지에 대한 결정은 중요한 원칙
컴포넌트 응집도와 관련된 세 가지 원칙
- REP: 재사용/릴리스 등가 원칙
- CCP: 공통 폐쇄 원칙
- CRP: 공통 재사용 원칙
REP: 재사용/릴리스 등가 원칙(Reuse/Release Equivalence Principle)
재사용 단위는 릴리스 단위와 같다
- 우리는 소프트웨어 재사용의 시대에 살고 있음
- 단일 컴포넌트는 응집성 높은 클래스와 모듈로 구성되어야 함
- 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 함
REP 실천
- 하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스 할 수 있어야 함
- 하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호가 같아야 하며, 동일한 릴리스로 추적 관리되고, 동일한 릴리스 문서에 포함되어야 함
CCP: 공통 폐쇄 원칙(Common Closure Principle)
"컴포넌트 관점에서의 SRP 원칙"
동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라
서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라
CCP 실천
- 변경될 가능성이 있는 클래스는 모두 한 곳으로 묶을 것
- 물리적 또는 개념적으로 강하게 결합되어 항상 함께 변경되는 클래스들은 하나의 컴포넌트에 속해야 함
OCP와의 관련성
- CCP에서 말하는 "폐쇄"는 OCP에서 말하는 "폐쇄"와 뜻이 같음
- 전략적 폐쇄: 발생할 가능성이 있거나 과거게 발생했던 대다수의 공통적인 변경에 대해서 클래스가 닫혀 있도록 설계
SRP와의 유사성
CRP: 공통 재사용 원칙(Common Resuse Principle)
컴포넌트 사용자들을 필요하지 않는 것에 의존하게 강요하지 말라
- 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 함
- 의존하는 컴포넌트가 있다면 해당 컴포넌트의 모든 클래스에 대해 의존함을 확실히 인지해야 함
- 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안 됨
ISP와의 관계
- CRP는 ISP의 포괄적인 버전
- ISP: 사용하지 않은 메서드가 있는 클래스에 의존하지 말 것
- CRP: 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말 것
컴포넌트 응집도에 대한 균형 다이어그램
상충되는 세 가지 원칙
- REP와 CCP는 포함 원칙: 컴포넌트를 더욱 크게 만듦
- CRP는 배제 원칙: 컴포넌트를 더욱 작게 만듦
- REP와 CRP에 중점을 두면, 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 미침
- 반대로 CCP와 REP에만 과도하게 집중하면 불필요한 릴리스가 너무 빈번해짐
현재의 관심사에 따른 최적지점 찾기
- 이 균형 삼각형에서 개발팀이 현재 관심을 기울이는 부분을 충족시키는 위치를 찾아야 함
- 예시: 프로젝트 초기에는 CCP의 중유성 > REP의 중요성(개발 가능성이 재사용성보다 중요)
프로젝트 성숙도에 따른 컴포넌트 구조 변화
- 일반적으로 프로젝트는 삼각형의 오른쪽에서 시작. 오직 재사용성만 희생
- 프로젝트가 성숙하고, 그 프로젝트로 부터 파생 프로젝트 시작 시, 점차 왼쪽으로 이동
- 컴포넌트의 구조는 시간과 성숙도에 따라 변함
결론
결합도에 대한 과거의 인식
- REP, CCP, CRP가 의미하는 것보다 훨씬 단순
- 응집도를
모듈은 단 하나의 기능한 수행해야 한다는 속성 정도로 단순하게 이해
현재
- 컴포넌트 응집도에 대한 세 가지 원칙은 응집도가 가질 수 있는 훨씬 복잡한 다양성을 설멸해줌
- 컴포넌트를 결정할 때, 재사용성과 개발가능성이라는 상청하는 힘을 반드시 고려해야 함
- 이들 사이에서 앱의 요구에 맞게 균형을 잡는 일은 중요함
- 이들 균형점은 거의 유동적
- 시간의 흐름에 따라 프로젝트의 초점이 변경되면 그에 따라 컴포넌트를 구성하는 방식도 진화해야 함