개발 관련 지식
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를 고려해야 한다.
- 전체 릴리즈는 다음 순서로 진행된다:
- G
- D, E
- F, C
- B
- H
- A
→ 컴포넌트 간 의존 관계를 명확히 알면, 시스템 빌드와 릴리즈 순서를 정할 수 있다.
순환 구조의 영향
기능 추가로 인해 순환 구조가 생기면
- 컴포넌트 간 기능 분리가 어려워지고,
- 전체가 하나의 덩어리처럼 작동하게 되며,
- 빌드 순서를 판단할 수 없게 된다.
순환 구조를 끊는 방법
1. 의존성 역전 (DIP)
- G에 인터페이스 정의 → F가 구현하도록 함
2. 공통 컴포넌트 추출
- G와 F가 공통으로 의존하는 부분을 새로운 컴포넌트로 분리
→ 컴포넌트 구조는 프로그램 성장에 따라 바뀔 수 있으므로, 지속적으로 순환 여부를 점검해야 한다.
※ 본 글은 『Clean Architecture』(로버트 C. 마틴 저) 4부를 기반으로 학습 목적으로 요약한 글입니다.
※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.