[클린 아키텍처] 13장. 컴포넌트 응집도

혀어어언·2025년 7월 31일
0

📖 [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와의 유사성

  • CCP는 컴포넌트 수준의 SRP

CRP: 공통 재사용 원칙(Common Resuse Principle)

컴포넌트 사용자들을 필요하지 않는 것에 의존하게 강요하지 말라

  • 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 함
  • 의존하는 컴포넌트가 있다면 해당 컴포넌트의 모든 클래스에 대해 의존함을 확실히 인지해야 함
  • 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안 됨

ISP와의 관계

  • CRP는 ISP의 포괄적인 버전
  • ISP: 사용하지 않은 메서드가 있는 클래스에 의존하지 말 것
  • CRP: 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말 것

컴포넌트 응집도에 대한 균형 다이어그램

상충되는 세 가지 원칙

  • REP와 CCP는 포함 원칙: 컴포넌트를 더욱 크게 만듦
  • CRP는 배제 원칙: 컴포넌트를 더욱 작게 만듦
  • REP와 CRP에 중점을 두면, 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 미침
  • 반대로 CCP와 REP에만 과도하게 집중하면 불필요한 릴리스가 너무 빈번해짐

현재의 관심사에 따른 최적지점 찾기

  • 이 균형 삼각형에서 개발팀이 현재 관심을 기울이는 부분을 충족시키는 위치를 찾아야 함
    - 예시: 프로젝트 초기에는 CCP의 중유성 > REP의 중요성(개발 가능성이 재사용성보다 중요)

프로젝트 성숙도에 따른 컴포넌트 구조 변화

  • 일반적으로 프로젝트는 삼각형의 오른쪽에서 시작. 오직 재사용성만 희생
  • 프로젝트가 성숙하고, 그 프로젝트로 부터 파생 프로젝트 시작 시, 점차 왼쪽으로 이동
  • 컴포넌트의 구조는 시간과 성숙도에 따라 변함

결론

결합도에 대한 과거의 인식

  • REP, CCP, CRP가 의미하는 것보다 훨씬 단순
  • 응집도를 모듈은 단 하나의 기능한 수행해야 한다는 속성 정도로 단순하게 이해

현재

  • 컴포넌트 응집도에 대한 세 가지 원칙은 응집도가 가질 수 있는 훨씬 복잡한 다양성을 설멸해줌
  • 컴포넌트를 결정할 때, 재사용성과 개발가능성이라는 상청하는 힘을 반드시 고려해야 함
    - 이들 사이에서 앱의 요구에 맞게 균형을 잡는 일은 중요함
    - 이들 균형점은 거의 유동적
  • 시간의 흐름에 따라 프로젝트의 초점이 변경되면 그에 따라 컴포넌트를 구성하는 방식도 진화해야 함

0개의 댓글