Clean Architecture 정리 - 컴포넌트 원칙 (2)
2025. 7. 5. 15:36

지난 글에 이어서 정리.

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부를 기반으로 학습 목적으로 요약한 글입니다.

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