📖 [14장] 컴포넌트 결합
📘 클린 아키텍처 북스터디 정리입니다
📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장
✅ 핵심 요약 (Key Takeaways)
이 장의 핵심 문장은?
컴포넌트 의존성 그래프에 순환이 있어서는 안 된다
저자가 전달하고자 하는 메세지 요약
- 시스템이 잘 작동하고 유지보수 가능하려면 컴포넌트 간 의존성 관계를 적절히 설계해야 함
- 의존성은 반드시 비순환 그래프(DAG)를 따라야 하며, 릴리스 및 빌드 주기에 영향을 미치지 않도록 해야 함
- 안정된 컴포넌트(많이 의존받는)는 추상화되어야 하며, 불안정한 컴포넌트(자주 변경되는)는 구체적 구현이어야 함
- 의존성의 방향은 시스템의 추상화 수준과 변경 가능성을 고려해 설계되어야 함
💡 내용 정리
서론
컴포넌트 사이의 관계를 설명하는 세 원칙
- ADP (Acyclic Dependencies Principle) – 의존성 비순환 원칙
- SDP (Stable Dependencies Principle) – 안정된 의존성 원칙
- SAP (Stable Abstractions Principle) – 안정된 추상화 원칙
ADP: 의존성 비순환 원칙
컴포넌트 의존성 그래프에 순환이 있어서는 안 된다
순환이 컴포넌트 의존성 그래프에 미치는 영향
- 순환이 생기면 컴포넌트 분리가 어려워짐
→ 단위 테스트 수행 및 릴리즈 어려워지고 에러도 쉽게 발생
- 모듈의 개수가 많아짐에 따라 빌드 관련 이슈가 기하급수적으로 증가
- 의존성 그래프에 순환이 생기면 컴포넌트를 어떤 순서로 빌드해야 올바를 지 파악하기가 어려워짐
해결 방안
- 의존성 역전을 통해 인터페이스로 순환을 끊거나
- 공통된 의존 대상을 별도 컴포넌트로 추출해 두 컴포넌트가 해당 컴포넌트에 의존하도록 설계
비순환 방향 그래프(DAG)
- 의존성은 방향성을 가지되, 반드시 순환이 없어야 한다는 설계 규칙
진화하는 컴포넌트 구조
컴포넌트 의존성 구조는 시스템의 논리적 설계에 발맞춰 성장 및 진화해야 함
- 컴포넌트 의존성 다이어그램은 앱의 빌드가능성과 유지보수성을 보여주는 지도와 같음
- 따라서 컴포넌트 구조는 프로젝트 초기에 설계 불가능
SDP: 안정된 의존성 원칙
안정성의 방향으로 (더 안정된 쪽에) 의존하라
- 변경이 쉽지 않은 컴포넌트가 변동이 예상되는 컴포넌트에 의존하게 만들어서는 안 됨
- 변경 가능성이 큰 컴포넌트가 안정된 컴포넌트를 의존하는 구조여야 유지보수성이 좋음
안정성
안정성 지표
Fan-in: 컴포넌트로 들어오는 의존성
Fan-out: 컴포넌트에서 나가는 의존성
I(불안정성) = Fan-out / (Fan-in + Fan-out)
- Fan-in이 많고 Fan-out이 적은 컴포넌트일수록 안정적
모든 컴포넌트가 안정적이어야 하는 것은 아니다
- 컴포넌트 구조 설계시 기대하는 것은 불안정한 컴포넌트와 안정된 컴포넌트가 함께 존재하는 상태
추상 컴포넌트
- 추상컴포넌트는 안정적이기 때문에 불안정한 컴포넌트가 의존할 수 있는 대상
SAP: 안정된 추상화 원칙
컴포넌트는 안정된 정보만큼만 추상화되어야 한다
고수준 정책을 어디에 위치시켜야 하는가?
- 컴포넌트가 최고로 안정된 상태이면서도 동시에 변경에 충분히 대응할 수 있도록 유연하게 만드려면?
→ OCP(개방 폐쇄 원칙)
→ 추상클래스는 OCP 원칙을 준수함
안정된 추상화 원칙
- 안정된 추상화 원칙: 안정성과 추상화 정도 사이의 관계 정의
- 안정된 컴포넌트는 추상 컴포넌트여야하고, 이를 통해 안정성이 컴포넌트를 확장하는 일을 방해해서는 안 됨
- 불안정한 컴포넌트는 반드시 구체 컴포넌트여야 함
- 따라서 안정적인 컴포넌트라면 반드시 인터페이스와 추상 클래스로 구성되어 쉽게 확장할 수 있어야 함
- 의존성은 추상화의 방향으로 향하게 됨
- 컴포넌트는 어떤 부분은 추상적이면서 다른 부분은 안정적일 수 있음
추상화 정도 측정하기
주계열과 배제 구역
- 주계열 근처: 이상적인 상태 (안정성과 추상화 정도의 균형)
- (0,0): 고통의 구역 – 안정적이면서 추상화되지 않음 → 변경 어려움
- (1,1): 쓸모없는 구역 – 추상적이지만 아무도 의존하지 않음
주계열 과의 거리 지표
- 거리 공식:
D = |A + I - 1|
- 컴포넌트가 주계열에 대체로 일치하도록 설계되었는 지 분석 가능
관리 한계를 결정하기 위한 목적으로 사용 가능 -> 분산을 통해 다른 컴포넌트에 비해 극히 예외적인 컴포넌트 식별 가능
- 각 컴포넌트의 D 값을 시간에 따라 그려볼 수 있음
결론
- 시스템은 ADP, SDP, SAP의 세 원칙을 바탕으로 컴포넌트를 구성해야 함
- 의존성 관리 지표는 설계의 의존성과 추상화 정도가 훌륭한 패턴과 얼마나 잘 부합하는 지 측정
- 패턴은 경험을 반영하지만, 불완전한 값임을 염두에 둬야 함