본문 바로가기
아키텍처/클린 아키텍처

클린 아키텍처 - 컴포넌트 결합 - SDP

by SSaMKJ 2023. 2. 11.

컴포넌트 결합 

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

 

SDP

  • 안정된 의존성 원칙(Stable Dependencies Principle)

안정성의 방향으로(더 안정된 쪽에) 의존하라.

  • 설계는 결코 정적일 수 없다. 설계를 유지하다 보면 변경은 불가피하다.
  • 변경이 쉽지 않은 컴포넌트가 변경이 예상되는 컴포넌트에 의존하게 만들어서는 절대 안 된다.
  • 변경을 쉽게 하기 위해 만든 컴포넌트에 변경이 어려운 컴포넌트가 의존하게 되면 변경을 쉽게 할 수 없게 된다. 변경이 큰 도전이 되어 버린다.

안정성

  • 안정성(stability)는 어떤 의미일까?
  • 동전을 옆면으로 세워보라. 동전은 안정적인가? 아무도 건들지 않으면 동전은 오래 서 있을 것이다. 그러면 안정적인가? 아마 그렇게 생각 안 할 것이다.
  • 소프트웨어에서 안정성은 변경을 만들기 위해 필요한 작업량과 관련된다.
  • 소프트웨어 컴포넌트를 변경하기 어렵게 만드는 데는 많은 요인이 존재하지만, 가장 확실한 방법은 수많은 다른 컴포넌트가 해당 컴포넌트에 의존하게 만드는 것이다.
  • 사소한 변경이라도 의존하는 모든 컴포넌트를 만족시키면서 변경하려면 상당한 노력이 들기 때문이다.

[그림 8-1. 안정된 컴포넌트]

  • 그림 8-1은 안정된 컴포넌트다. 세 컴포넌트가 X에 의존하며, 따라서 X 컴포넌트는 변경하지 말아야 할 이유가 3가지나 되기 때문이다.
  • 이 경우 X는 세 컴포넌트를 책임진다(responsible)라고 말한다.
  • 반대로 X는 어디에도 의존하지 않으므로 X가 변경되도록 만들 수 있는 외적인 영향이 전혀 없으므로 독립적(independent)라고 말한다.

[그림 8-2. 불안정한 컴포넌트]

  • 그림 8-2의 Y는 상당히 불안정한 컴포넌트다. 어떤 컴포넌트도 Y에 의존하지 않으므로 Y는 책임성이 없다고 말할 수 있다.
  • 또한 Y는 세 개의 컴포넌트에 의존하므로 변경이 발생할 수 있는 외부 요인이 세 가지다.
  • Y는 의존적이라고 말한다.

안정성 지표

  • 컴포넌트로 들어오고 나가는 의존성의 개수를 세어 보면 안정성을 측정할 수 있다.
    • Fan-in: 안으로 들어오는 의존성. 컴포넌트 내부의 클래스에 의존하는 컴포넌트 외부의 클래스 개수
    • Fan-out: 바깥으로 나가는 의존성. 컴포넌트 외부의 클래스에 의존하는 컴포넌트 내부의 클래스 개수
    • I(불안정성):
    • I=\text{Fan-out}\div(\text{Fan-out} + \text{Fan-in})
    • 이 지표는 [0,1] 범위의 값을 갖는다. I=0이면 최고로 안정된 컴포넌트. I=1이면 최고로 불안정한 컴포넌트.

[그림 9-1. 안정성 예제 1]

  • 그림 9-1에서 Cc컴포넌트는 외부에서 의존하는 클래스가 3개, 내부에서 외부 컴포넌트를 의존하는 클래스가 1개이다. 즉, Fan-in=3, Fan-out=1 이며, I=1/4다.
  • I 값이 1이면, 어떤 컴포넌트도 이 컴포넌트에 의존하지 않지만(Fan-in_=0), 해당 컴포넌트는 다른 컴포넌트에 의존한다(_Fan-out > 0)는 뜻이다. 이 상태는 컴포넌트가 가질 수 있는 최고로 불안정한 상태다.
  • 자신에게 의존하는 컴포넌트가 없으므로, 이 컴포넌트는 변경하지 말아야 할 이유가 없지만 이 컴포넌트가 다른 컴포넌트에 의존한다는 사실은 언젠가는 해당 컴포넌트를 변경해야 할 이유가 있다는 뜻이다.
  • 반대로 I값이 0-이면 해당 컴포넌트에 의존하는 다른 컴포넌트가 있지만(Fan-in > 0), 해당 컴포넌트 자체는 다른 컴포넌트에 의존하지 않는다(_Fan-out_=0)는 뜻이다. 이 컴퍼넌트는 최고로 안정된 상태다. 자신에게 의존하는 컴포넌트가 있으므로 변경하기가 어렵지만 변경을 강요 받지는 않는다.
  • SDP에서 컴포넌트의 I 지표는 그 컴포넌트가 의존하는 다른 컴포넌트들의 I보다 커야 한다고 말한다. 즉, 의존성 방향으로 갈수록 I 지표 값이 감소해야 한다.

모든 컴포넌트가 안정적이어야 하는 것은 아니다.

  • 모튼 컴포넌트가 최고로 안정적인 시스템이라면 변경이 불가능하다. 바람직한 상황이 아니다.
  • 컴포넌트 구조를 설계할 때 기대하는 것은 불안정한 컴포넌트도 있고 안정된 컴포넌트도 존재하는 상태다.[그림 9-2. 세 컴포넌트로 구성된 시스템의 이상적인 구성]
  • 그림 9-2의 다이어그램을 보면 위쪽에는 변경 가능한 컴포넌트가 보이고, 아래의 안정된 컴포넌트에 의존한다. 다이어그램에서 불안정한 컴포넌트를 관례적으로 위쪽에 두는데, 이 관례를 따르면 상당히 유용하다. 위로 향하는 화살표가 있으면 SDP를 위배하는 상태가 되기 때문이다.

[그림 9-3. SDP 위배]

  • 그림 9-3은 SDP가 어떻게 위배될 수 있는지를 보여준다.
  • Flexible은 변경하기 쉽도록 설계한 컴포넌트다. Flexible이 불안정한 상태이기를 바란다. 하지만 Stable 컴포넌트에서 작업하던 개발자가 Flexible에 의존성을 걸게 되었다. 이로 인해 SDP를 위배하는데, Stable의 I 지표는 Flexible의 I 지표보다는 더 작기 때문이다.
  • DIP를 도입하면 이 문제를 해결할 수 있다.

  • [그림 9-4. DIP 적용]
  • Stable Flexible에 대한 의존성을 끊을 수 있고, 두 컴포넌트는 모두 UServer에 의존하도록 강제한다. UServer는 매우 안정된 상태(I = 0)이며, Flexible은 자신에게 맞는 불안정성을 그대로 유지할 수 있다. 이제 모든 의존성은 I가 감소하는 방향으로 향한다.

클린 아키첵처 전체 보기 

클린 아키텍처란? https://blog.kjslab.com/199
클린 아키텍처 - 설계원칙 - SRP https://blog.kjslab.com/200 
클린 아키텍처 - 설계원칙 - OCP https://blog.kjslab.com/201 
클린 아키텍처 - 설계원칙 - LSP https://blog.kjslab.com/202 
클린 아키텍처 - 설계원칙 - ISP https://blog.kjslab.com/203  
클린 아키텍처 - 설계원칙 - DIP & SOLID 요약 https://blog.kjslab.com/204 
클린 아키텍처 - 컴포넌트 https://blog.kjslab.com/205 
클린 아키텍처 - 컴포넌트 결합 - ADP https://blog.kjslab.com/206   
클린 아키텍처 - 컴포넌트 결합 - SDP https://blog.kjslab.com/207
클린 아키텍처 - 컴포넌트 결합 - SAP & 결론 https://blog.kjslab.com/208 

댓글