개발 관련 지식

Clean Architecture 정리 - 4부 컴포넌트 원칙(1)

고감귤 2025. 6. 21. 18:48

이 단원에서 말하는 컴포넌트는 '릴리즈 단위'를 의미한다.


어떤 컴포넌트에 어떤 클래스, 모듈을 포함시켜야 할까?

책에서는 세 가지 원칙을 제시한다.

  • REP (Reuse/Release Equivalence Principle): 재사용/릴리즈 등가 원칙
  • CCP (Common Closure Principle): 공통 폐쇄 원칙
  • CRP (Common Reuse Principle): 공통 재사용 원칙

 

REP: 재사용/릴리즈 등가 원칙

하나의 컴포넌트로 묶인 클래스는 반드시 함께 릴리즈되어야 한다.

  • 클래스 하나만 변경되더라도, 전체 컴포넌트를 릴리즈해야 한다.
  • 모든 클래스는 같은 버전 번호로 관리되어야 하며, 동일한 릴리즈 문서에 포함되어야 한다.

이 원칙을 따르면:

  • 릴리즈 버전으로 동일한 시점의 코드를 사용 중인지 확인할 수 있다.
  • 새 릴리즈가 나왔을 때 변경사항을 판단하고 통합 여부를 결정할 수 있다.

 

CCP: 공통 폐쇄 원칙

동일한 이유로 동일한 시점에 변경되는 클래스는 같은 컴포넌트로 묶어야 한다.

  • 서로 다른 변경 이유를 가진 클래스는 분리해야 한다.
  • 하나의 컴포넌트는 하나의 변경 이유만 가져야 한다. (개방-폐쇄 원칙과 유사)

이 원칙을 따르면:

  • 변경의 영향을 최소 범위로 제한할 수 있다.
  • 변경과 무관한 컴포넌트는 다시 테스트하거나 릴리즈하지 않아도 된다.

 

CRP: 공통 재사용 원칙

함께 사용되는 클래스만 같은 컴포넌트로 묶어야 한다.

  • 일부만 사용하는 경우가 많다면 분리할 필요가 있다. (인터페이스 분리 원칙과 유사)

이 원칙을 위반하면:

  • 일부 클래스만 사용하더라도 전체 컴포넌트에 의존하게 된다.
  • 사용하지 않는 클래스의 변경에도 영향을 받을 수 있다.
  • 재컴파일, 재검증, 재배포 부담이 생긴다.

 

컴포넌트 응집도에 대한 균형

세 원칙은 서로 긴장 관계에 있으며 균형을 잡아야 한다.

  • 프로젝트 초기: CCP + CRP 중심 → 변경과 사용 편의성 중시
  • 프로젝트 성장기: REP 중심 → 재사용성과 안정성 중시

→ 균형점은 고정되지 않고, 프로젝트의 성숙도에 따라 변화한다.


ADP: 의존성 비순환 원칙

릴리즈 단위인 컴포넌트 간의 의존성은 순환해서는 안 된다.

 

  • A는 다른 컴포넌트에 영향을 주지 않는다.
  • G가 바뀌면 많은 컴포넌트가 영향을 받는다.
  • D를 릴리즈하려면 E와 G를 고려해야 한다.
  • 전체 릴리즈는 다음 순서로 진행된다:
    1. G
    2. D, E
    3. F, C
    4. B
    5. H
    6. A

→ 컴포넌트 간 의존 관계를 명확히 알면, 시스템 빌드와 릴리즈 순서를 정할 수 있다.

 

순환 구조의 영향

기능 추가로 인해 순환 구조가 생기면

  • 컴포넌트 간 기능 분리가 어려워지고,
  • 전체가 하나의 덩어리처럼 작동하게 되며,
  • 빌드 순서를 판단할 수 없게 된다.

 

순환 구조를 끊는 방법

 

1. 의존성 역전 (DIP) 

  • G에 인터페이스 정의 → F가 구현하도록 함

2. 공통 컴포넌트 추출

  • G와 F가 공통으로 의존하는 부분을 새로운 컴포넌트로 분리

→ 컴포넌트 구조는 프로그램 성장에 따라 바뀔 수 있으므로, 지속적으로 순환 여부를 점검해야 한다.

 

※ 본 글은 『Clean Architecture』(로버트 C. 마틴 저) 4부를 기반으로 학습 목적으로 요약한 글입니다.

※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.