본문 바로가기
SW core/SW Architecture

컴포넌트 결합 - SAP (안정된 추상화 원칙)

by ocwokocw 2021. 2. 10.

- 이 글은 로버트 C.마틴의 Clean Architecture를 기반으로 작성되었습니다. (가능하면 책을 읽어보는것을 추천한다.)

- 고수준의 정책

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

 

시스템에서 업무규칙은 안정된 (I = 0, 즉 불안정성이 작은컴포넌트여야 한다. (I 개념을 모른다면 ocwokocw.tistory.com/37 글을 먼저 숙지해야 한다.) 업무규칙은 고수준의 정책이기 때문이다. 반면 불안정한(I = 1) 컴포넌트는 변동성이 큰 컴포넌트여야 한다.

 

이 문장만 읽었을 때 이상함을 느껴야 한다. "업무규칙은 안정된 컴포넌트 여야 한다"는 말이 당연한 얘기인가? 앞서 SDP 원칙에서 안정된 컴포넌트는 변경을 하기가 어렵다고 하였다. 그런데 SOLID 원칙에서는 고수준의 시스템의 업무규칙을 유연하게 하기 위해 인터페이스를 분리하거나, 단일 책임을 갖도록 하고, 의존성을 역전시키면서 온갖 난리를 쳤다. 이 얘기를 종합해보면 "업무규칙을 변경하기 어렵게 설계하라는 소리인가?라는 결론에 이른다.

 

컴포넌트가 안정적이면서도 변경에 유연하게 만들 수 있는가? 답은 SOLID-OCP 의 추상클래스에 있다. OCP 에서는 저수준의 컴포넌트가 고수준의 컴포넌트에 의존하게 하거나 정보 은닉을 위해 인터페이스를 사용하였다. 이점을 잘 생각해보길 바란다.


- SAP(안정된 추상화 원칙)

SAP는 이름 그대로 안정성과 추상화의 관계 정의이다. 안정된 것은 추상 컴포넌트이며, 불안정한것은 구체 컴포넌트이다. SAP와 SDP를 결합하면 컴포넌트에 대한 DIP 이다. 왜 이렇게 말을할 수 있는지 천천히 생각해보자. 이해를 쉽게 하기 위해 SDP, SAP, DIP 순으로 생각해보자.

  • SDP - 앞서 SDP 에서는 컴포넌트가 의존하는 쪽(화살표가 가리키는 쪽)의 I (불안정성)값이 낮아야 한다고 했다. 그렇다면 컴포넌트 관계에서 화살표 방향으로 갈수록 안정성이 있는 컴포넌트라는 말이 된다. 
  • SAP - 안정된것은 추상 컴포넌트라고 하였다. 이제 두 개를 조합해보면 "화살표 방향으로 갈수록 추상화 레벨이 커진다."는 얘기가 된다. 
  • DIP - 화살표 방향으로 갈수록 추상화 레벨이 커진다는 것은 DIP의 "구체 컴포넌트는 추상 컴포넌트에 의존해야 한다." 개념을 컴포넌트 레벨에서 적용했다는 의미이다.

SOLID - DIP의 추상화 정도는 0 아니면 1이다. 구체 클래스(Concrete Class) 이거나 추상 클래스(Abstract Class) 이기 때문이다. 반면 컴포넌트는 SDP와 유사한 개념으로 0 ~ 1 범위의 값을 가질 수 있다.


- 추상화 정도 측정

SDP에서 I 를 이용하여 불안정성을 나타내듯이 SAP에서는 A를 이용하여 추상화 정도는 나타낸다.

  • Nc: 컴포넌트의 클래스 개수(Concrete Class 뿐만이 아니라 인터페이스, 추상 클래스도 포함한다.)
  • Na: 컴포넌트의 추상 클래스 + 인터페이스
  • A: 추상화 정도, Na / Nc

A는 0 ~ 1 범위의 값을 가지며 0 이면 추상 클래스가 하나도 없음을 1 이면 모두 추상 클래스이거나 인터페이스임을 나타낸다.


- 추상화 정도와 불안정성

불안정성 I와 추상화 정도 A를 결합하여 A / I 그래프를 그려보자.

A 를 나타내는 Y축의 (0,1)은 안정적이고 추상화된 컴포넌트이며, I 를 나타내는 X축의 (1,0) 은 불안정하며 구체적인 컴포넌트이다. 사실 위의 그림에서 두 지역(고통의 구역과 쓸모없는 구역)은 사실 부채꼴모양인데 그리기가 귀찮아서 네모로 표시하였다.

  • 고통의 구역 : A (추상화 정도)가 낮아 구체적이면서 I (불안정성)가 낮아 타 컴포넌트에서 참조를 많이 하며 구체적인 컴포넌트라는 말이 된다. DB의 엔티티나 사용하는 라이브러리가 여기에 해당된다. DB의 엔티티는 변경가능성이 커서 고통스럽지만, 라이브러리는 보통 변동성이 크지 않아서 괜찮다. 사실은 변동성도 영향을 미치므로 또 하나의 축으로 생각할 수 있다.
  • 쓸모없는 구역 : A (추상화 정도)가 크면서 I (불안정성)도 큰 컴포넌트이다. 만약 여러분이 인터페이스를 정의했는데, 참조하는 컴포넌트가 없다면? 추상화를 한 의미가 있을까?

따라서 변동성이 큰 컴포넌트를 두 지역으로부터 떨어트리는것이 이상적이라 할 수 있겠다. 두 지역에서 가장 먼 지점은 어디일까? 바로 (0,1) -> (1,0)를 잇는 직선일 것이다. 컴포넌트들을 좌표계의 점으로 생각한다면 모니터링 할 수 있을까? 

점(해당 컴포넌트)과 이 직선사이의 거리를 구한다면 해당 컴포넌트가 얼마나 이상적인 직선에 가까운지, 아니면 고통의 구역이나 쓸모없는 구역에 가까운지 알 수 있을것이다.


- 주의점

주의할 점이 있는데, 무조건 좋은것이라 이 지표를 맹신하면 부작용이 따를 수 있다는점이다. 

 

책임있는 아키텍처 설계자이거나 품질팀의 담당자라면 이 지표를 일종의 위험신호로 참고하면 될 일이다. 특히 사람이 많으면 지표를 정해놓고 무조건 따르라고 하거나 단순하게 수치를 넘으면 어떤 이유를 말해도 무시하는 경향이 있는데, 이는 실무팀을 무시하는점이 될 수 있다는 점에 유의해야 한다.

댓글