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

클린 아키텍처 - 컴포넌트

by SSaMKJ 2023. 2. 11.

컴포넌트 component

  • 컴포넌트는 배포 단위다. 컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다. 자바의 경우 jar, 루비에서는 gem 파일, 닷넷에서는 DLL이다.
  • 여러 컴포넌트를 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있다.

컴포넌트 응집도

  • 컴퍼넌트 응집도와 관련된 세 가지 원칙
  • REP: 재사용/릴리스 등가 원칙(Reuse/Release Equivalence Principle)
  • CCP: 공통 폐쇄 원칙(Common Closure Principle)
  • CRP: 공통 재사용 원칙(Common Reuse Principle)

REP: 재사용/릴리스 등가 원칙

재사용 단위는 릴리스 단위와 같다.

  • 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 한다.
  • 하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스할 수 있어야 한다.
  • 하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호가 같아야 하며, 동일한 릴리스로 추적 관리되고, 동일한 릴리스 문서에 포함되어야 한다.

CCP: 공통 폐쇄 원칙

  • 동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라.
  • 서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라.
  • 애플리케이션에서 코드가 반드시 변경되어야 한다면, 이러한 변경이 여러 컴포넌트 도처에 분산되어 발생하기보다는, 차라리 변경 모두가 단일 컴포넌트에서 발생하는 편이 낫다.
  • SRP와의 유사성
    • CCP는 컴포넌트 수준의 SRP이다.

CRP: 공통 재사용 원칙

컴포넌트 사용자들은 필요하지 않는 것에 의존하게 강요하지 말라.

  • 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 한다.
  • 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말라.

컴포넌트 응집도에 대한 균형 다이어그램

  • 응집도에 관한 세 원칙이 서로 상충된다.
  • REP와 CCP는 포함(include)원칙이다. 즉, 두 원칙은 컴포넌트를 더욱 크게 만든다.
  • CRP는 배제(exclusive)원칙이며, 컴포넌트를 더욱 작게 만든다.
  • 이 원칙들 사이에서 균형을 이루는 방법을 찾아야 한다.

[그림 6-1 결합도 원칙들의 균형 다이어그램]

  • 응집도에 관한 세 원칙이 서로 어떻게 상호작용하는지 보여준다. 다이어그램의 각 변은 반대쪽 꼭지점에 있는 원칙을 포기했을 때 감수해야 할 비용을 나타낸다.
  • REP와 CRP에만 집중한 경우 ==> 사소한 변경이 생겼을 때 너무 여러 컴포넌트에 영향을 끼친다.
  • CCP와 REP에만 집중한 경우 ==> 불필요한 릴리스가 빈번해 진다.
  • CCP와 CRP에만 집중한 경우 ==> 릴리스를 고려하지 않고 컴포넌트를 묶었으므로 다른 컴포넌트에서 사용하기가 어렵다.

  • 시간이 흐르면서 개발팀이 주의를 기울이는 부분 역시 변한다.
    • 예를 들어 프로젝트 초기에는 CCP가 REP보다 훨씬 더 중요한데, 개발 가능성(developability)이 재사용성보다 더욱 중요하기 때문이다.
    • 일반적으로 프로젝트는 삼각형의 오른쪽에서 시작하는 편이며, 이때는 오직 재사용성만 희생하면 된다. 프로젝트가 성숙하고, 그 프로젝트로부터 파생된 또 다른 프로젝트가 시작되면, 프로젝트는 삼각형에서 점차 왼쪽으로 이동해 간다. 즉, 프로젝트의 컴포넌트 구조는 시간과 성숙도에 따라 변한다는 뜻이다.

결론

  • 과거에는 컴포넌트 응집도를 모듈은 단 하나의 기능만 수행해야 한다.는 속성 정도로 단순하게 이해 했었다.
  • 하지만 컴포넌트 응집도에 관한 세 가지 원칙은 응집도가 가질 수 있는 훨씬 복잡한 다양성을 설명해 준다.
  • 어느 클래스들을 묶어서 컴포넌트로 만들지를 결정할 때, 재사용성과 개발 가능성이라는 상충하는 힘을 반드시 고려해야 한다.
  • 두 힘을 현재 상황에 맞게 잘 분배했더라도, 내년이 되면 맞지 않을 수 있다.
  • 시간이 흐름에 따라 프로젝트의 초점이 개발 가능성에서 재사용성으로 바뀌고, 그에 따라 컴포넌트를 구성하는 방식도 조금씩 흐트러지고 또 진화한다.

컴포넌트 결합

  • 컴포넌트 사이의 관계에서 3가지 원칙을 설명할 것이다.
  • 개발 가능성과 논리적 설계 사이의 균형을 다룹니다.
  • 컴포넌트 구조와 관련된 아키텍처를 침범하는 힘은 기술적이며, 정치적이고, 가변적이다.

 

 

클린 아키첵처 전체 보기 

클린 아키텍처란? 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 

댓글