본문 바로가기

Design/Architecture

[Clean Architecture] 컴포넌트 사이의 관계와 원칙(3) : SAP

SAP(안정된 추상화 원칙)이란?

컴포넌트는 안정된 정도만큼만 추상화되어야 한다.

고수준 정책은 어디에 위치시켜야하는가?

  • 고수준 아키텍처나 정책 결정과 관련된 소프트웨어는 자주 변경해서는 절대로 안 되는 소프트웨어
  • 고수준 정책을 캡슐화하는 소프트웨어는  반드시 안정된 컴포넌트(I=0)에 위치해야 한다.
  • 하지만 안정된 컴포넌트에 위치 시킨다면 변경이 어려운 단점이 있음. (유연성이 떨어짐)
  • 추상 클래스를 통해 컴포넌트가 최고로 안정된 상태(I=0)이면서도 동시에 유연하게 만들 수 있다.

안정된 추상화 원칙 (Stable Abstractions Principle)

  • 안정성과 추상화 정도 사이의 관계를 정의.
  • 안정된 컴포넌트는 추상 컴포넌트여야 함(인터페이스와 추상 클래스로 구성).
    이를 통해 안정성이 컴포넌트를 확장하는 일을 방해해서는 안됨을 이야기함.
  • SAP와 SDP를 결합하면 컴포넌트에 대한 DIP와 같은 의미를 가지게 됨. => 의존성은 추상화의 방향으로 향한다.

 

추상화 정도 측정

추상화 정도는 A지표를 통해서 측정가능하다.

이는 컴포넌트의 클래스 총 수 대비 인터페이스와 추상 클래스의 개수를 단순히 계산한 값이다.

Nc: 컴포넌트의 클래스 개수
Na: 컴포넌트의 추상 클래스와 인터페이스의 개수
A: 추상화 정도. A=Na/Nc 
  • A는 0과 1사이값.
  • A가 0이면 추상 클래스가 하나도 없다는 뜻.
  • A가 1이면 컴포넌트는 오직 추상 클래스만을 포함한다는 뜻.

주계열

 

[Clean Architecture] A/I 그래프

  • 최고로 안정적(I=0) 이며 추상화된(A=1) 컴포넌트는 (0,1)에 위치.
  • 최고로 불안정(I=1) 이며 구체화된(A=0) 컴포넌트는 (1,0)에 위치.
  • 모든 컴포넌트가 (0,1), (1,0)에 위치해야한다고 강요할 수 없으므로, 합리적인 지점의 궤적에 위치하도록한다.

 

[Clean Architecture] 배제 구역(Zone of Exclusion)

  1. 고통의 구역
    - (0,0) 주변의 친구들.
    - 추상적이지 않아 확장할 수 없고, 안정적이라 변경하기도 힘듦.
    - 일부 소프트웨어의 엔티티가 이 구역에 위치. DB스키마가 변경되면 고통스러움.
    - 구체적인 유틸리티 라이브러리도 이 구역에 위치. 예를 들면 String 컴포넌트로 변동성이 거의 없음.
       하지만 변경이 일어나면 혼란초래.
    - 변동성이 없는 컴포넌트는 (0,0) 구역에 위치하더라도 해롭지 않다.
    - 문제가 되는 컴포넌트는 변동성이 있는 컴포넌트이다.
    - 따라서 고통의 구역에서 세번째 축으로 변동성을 고려해 볼 수 있음.
  2. 쓸모없는 구역
    - (1,1) 주변의 친구들.
    - 최고로 추상적이지만, 누구도 그 컴포넌트에 의존하지 않음. 따라서 쓸모가 없다.
  3. 배제 구역 벗어나기
    - 변동성이 큰 컴포넌트는 고통의 구역과 쓸모없는 구역(배제 구역)을 벗어나야 한다.
    - 이는 (1,0)과 (0,1)을 잇는 선분이다.(주계열)
    - 주계열에 위치한 컴포넌트는 자신의 안정성에 비해 '너무 추상적'이지도 추상화 정도에 비해 '너무 불안정'하지도 않다.
    - 추상화된 수준에 어울릴 정도로만 다른 컴포넌트에 의존, 구체화된 수준에 어울릴 정도로만 다른 컴포넌트에 의존.
    - 가장 바람직한 지점은 주계열의 두 종점 (0,1), (1,0)
    - 뛰어난 아키텍트라면 대다수의 컴포넌트가 두 종점에 위치하도록 만들기 위해 매진.

주계열과의 거리(D)

주계열 위 또는 가까이 위치한 컴포넌트가 바람직하다면, 얼마나 이 상태로 부터 멀리 떨어져 있는지 측정하는 지표.

D = |A + I - 1|
  • D가 0에 가까울수록 이상적
  • D가 0에서 가깝지 않다면 해당 컴포넌트는 재검토한 후 재구성할 수 있다.
  • D지표의 평균과 분산을 통해 다른 컴포넌트에 비해 예외적인 컴포넌트 추출 가능

 

결론

의존성 관리 지표를 통해, 설계의 의존성과 추상화 정도가 내가 생각하는 훌륭한 수준에 얼만큼 부합하는지 측정할 수 있다. 

다만 지표는 하나의 참고용일 뿐 항상 맞는 것은 아니라는 것을 염두해 두도록 하자!