[클린 아키텍처] 14장. 컴포넌트 결합

혀어어언·2025년 8월 4일
0

📖 [14장] 컴포넌트 결합

📘 클린 아키텍처 북스터디 정리입니다

📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑‍💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장


✅ 핵심 요약 (Key Takeaways)

이 장의 핵심 문장은?

컴포넌트 의존성 그래프에 순환이 있어서는 안 된다

저자가 전달하고자 하는 메세지 요약

  • 시스템이 잘 작동하고 유지보수 가능하려면 컴포넌트 간 의존성 관계를 적절히 설계해야 함
  • 의존성은 반드시 비순환 그래프(DAG)를 따라야 하며, 릴리스 및 빌드 주기에 영향을 미치지 않도록 해야 함
  • 안정된 컴포넌트(많이 의존받는)는 추상화되어야 하며, 불안정한 컴포넌트(자주 변경되는)는 구체적 구현이어야 함
  • 의존성의 방향은 시스템의 추상화 수준과 변경 가능성을 고려해 설계되어야 함

💡 내용 정리

서론

컴포넌트 사이의 관계를 설명하는 세 원칙

  • ADP (Acyclic Dependencies Principle) – 의존성 비순환 원칙
  • SDP (Stable Dependencies Principle) – 안정된 의존성 원칙
  • SAP (Stable Abstractions Principle) – 안정된 추상화 원칙

ADP: 의존성 비순환 원칙

컴포넌트 의존성 그래프에 순환이 있어서는 안 된다

순환이 컴포넌트 의존성 그래프에 미치는 영향

  • 순환이 생기면 컴포넌트 분리가 어려워짐
    → 단위 테스트 수행 및 릴리즈 어려워지고 에러도 쉽게 발생
  • 모듈의 개수가 많아짐에 따라 빌드 관련 이슈가 기하급수적으로 증가
  • 의존성 그래프에 순환이 생기면 컴포넌트를 어떤 순서로 빌드해야 올바를 지 파악하기가 어려워짐

해결 방안

  1. 의존성 역전을 통해 인터페이스로 순환을 끊거나
  2. 공통된 의존 대상을 별도 컴포넌트로 추출해 두 컴포넌트가 해당 컴포넌트에 의존하도록 설계

비순환 방향 그래프(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의 세 원칙을 바탕으로 컴포넌트를 구성해야 함
  • 의존성 관리 지표는 설계의 의존성과 추상화 정도가 훌륭한 패턴과 얼마나 잘 부합하는 지 측정
  • 패턴은 경험을 반영하지만, 불완전한 값임을 염두에 둬야 함

0개의 댓글