지난 글에 이어서 정리.
https://goto-helloworld.tistory.com/120
SDP (Stable Dependencies Principle) — 안정된 의존성 원칙
더 안정된 컴포넌트에 의존하라
[ 안정적인 컴포넌트는 쉽게 변경되지 않기 때문이다. ]
컴포넌트의 크기, 복잡도, 간결함 등 변경을 쉽게 하지 못하게 하는 다양한 요소가 있지만,
여기서는 "얼마나 많은 컴포넌트들이 의존하고 있는가"에 주목한다.
많은 컴포넌트가 의존한다는 건, 사소한 변경에도 연쇄적으로 영향을 준다는 뜻이다.
결과적으로 해당 컴포넌트는 변경이 어렵다. (= 안정적인 컴포넌트다. )
안정성 지표: 컴포넌트의 수치화된 안정성
안전성 지표는 들어오고 나가는 의존성의 개수를 계산한다.
- Fan-in: 다른 컴포넌트가 이 컴포넌트를 얼마나 사용하는가
- Fan-out: 이 컴포넌트가 다른 컴포넌트를 얼마나 사용하는가
I (불안정성): I = Fan-out ÷ (Fan-in + Fan-out)
- I = 0 [ 매우 안정적 ] → 아무에게도 의존하지 않음.
- I = 1 [ 매우 불안정 ] → 다른 컴포넌트에게만 의존하고, 책임지지 않음.
SDP를 만족하려면, 컴포넌트는 자신보다 더 안정적인 컴포넌트를 의존해야한다.
즉, 의존 방향이 갈수록 I 값은 작아져야 한다.
모든 컴포넌트가 안정적일 필요는 없다
모든 컴포넌트가 안정적이라면, 시스템은 변화에 대응하기 어렵다.
시스템은 안정성과 유연성을 동시에 가져야 한다.
I가 작아지고 있지만, SDP를 위반한 사례
이 구조는 I가 작아지는 방향으로 진행하고 있지만, SDP를 위배한다.
→ 유연 컴포넌트가 바뀌면, 안정 컴포넌트도 영향을 받는다.
→ 안정성을 보장받아야 할 컴포넌트가 구조적으로 위험해진다.
해결 방법: DIP 적용
A는 더 이상 B를 직접 참조하지 않고, 인터페이스를 통해 간접적으로 의존한다.
이 인터페이스는 별도의 컴포넌트로 생성 및 정의되며, 실제 구현은 B가 맡는다.
이렇게 되면 A는 인터페이스에만 의존하게 되어 B의 변화에 영향을 받지 않게 된다.
구조적으로도 안정된 컴포넌트가 변경에 휘둘리지 않도록 보호된다.
또한, 이 방식은 의존성 방향도 안정된 쪽을 향하도록 재구성해 전체 구조가 SDP를 만족하게 한다.
SAP (Stable Abstractions Principle) — 안정된 추상화 원칙
컴포넌트의 안정성과 추상화 정도 사이의 균형을 설명한다.
안정된 컴포넌트가 추상적이면, 다른 컴포넌트가 이를 확장하여 유연하게 사용할 수 있다.
- 안정된 컴포넌트는 추상 클래스/인터페이스로 구성돼야 한다
- 불안정한 컴포넌트는 구체 클래스로 구성돼야 한다
추상화 정도
- Nc: 컴포넌트의 전체 클래스 수
- Na: 그중 추상 클래스와 인터페이스 수
- A = Na ÷ Nc
- A = 0 → 컴포넌트가, 전부 구체 클래스로 이루어짐
- A = 1 → 컴포넌트가, 전부 추상 클래스로 이루어짐
A, I(불안정성) 의 좌표 공간
컴포넌트를 A, I 값을 기준으로 2차원 공간에 배치할 수 있다.
주계열 (Main Sequence)
I = A 를 만족하는 대각선이 이상적인 위치다.
추상화 정도와 안정성의 균형이 맞는 컴포넌트가 이 선에 위치한다.
고통의 구역 (Zone of Pain)
매우 안정적이지만 구체적이다.
쉽게 바꾸기 어렵다.
예시:
- String, Integer 등 변경될 일 없는 타입
- DB 스키마와 같은 컴포넌트
변동성이 큰 컴포넌트라면, 구조적으로 피하도록 노력해야한다.
쓸모없는 구역 (Zone of Uselessness)
추상 클래스는 많은데, 아무도 구현하거나 참조하지 않는 상황
→ 시스템에 기여하지 않는 코드임으로, 정리 대상일 수 있다.
배제 구역 벗어나기
이유없이 컴포넌트가 위 두 영역에 존재한다면, 주계열 선에 최대한 가까워지도록 해야한다.
주계열에 가까울수록 균형을 갖추고 변화에 유연하면서도 안정적이다.
주계열과의 거리 (D 지표)
- D = |A + I - 1|
- D = 0 → 주계열에 정확히 위치
- D = 1 → 주계열에서 가장 멀리 있음
![]() |
![]() |
→ 이 지표로 설계된 구조를 평가하거나, 리팩토링 후보를 식별할 수 있다.
→ 시간에 따른 D 값 변화를 추적하면, 개선이 필요한 컴포넌트를 추려낼 수 있다.
※ 본 글은 『Clean Architecture』(로버트 C. 마틴 저) 4부를 기반으로 학습 목적으로 요약한 글입니다.
※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.
'아키텍처' 카테고리의 다른 글
Clean Architecture 정리 – 5부 16장 아키텍처의 독립성 (4) | 2025.07.19 |
---|---|
Clean Architecture 정리 – 5부 15장 아키텍처 (0) | 2025.07.13 |
Clean Architecture 정리 - 4부 컴포넌트 원칙(1) (0) | 2025.06.21 |
Clean Architecture 정리 - 3부 11장 의존성 역전 원칙 (1) | 2025.06.15 |
Clean Architecture 정리 - 3부 10장 인터페이스 분리 법칙 (0) | 2025.06.14 |