코딩스토리

Clean Architecture 스터디[13장] 컴포넌트 응집도 본문

Clean Architecture

Clean Architecture 스터디[13장] 컴포넌트 응집도

라크라꾸 2022. 2. 5. 01:52

컴포넌트란?

컴포넌트는 배포할 수 있는 가장 작은 단위

흔히 .jar(java archive resource)이 컴포넌트에 해당

여러 컴포넌트를 서로 링크하여 실행 가능한 파일이나 .war파일과 같은 단일 아카이브 파일로도 만듦

잘 설계된 컴포넌트는 독립적으로 배포, 개발이 가능해야 함

 

REP 재사용/릴리즈 등가 원칙

"재사용단위는 릴리즈 단위와 같다."
dependencies {
	...
    //Lottie
    implementation 'com.airbnb.android:lottie:4.2.0'
    
}

 

개발자는 Maven, Gradle와 같은 모듈 관리 도구를 사용하여 다음과 같이 다른사람들이 만들어 놓은 라이브러리를 적용해 재사용을 한다. 만약, Maven이나 Gradle를 통해 라이브러리를 가져오는데, 릴리스 번호가 부여되지 않는다면, 컴포넌트의 호환성을 보증할 방법이 없어지게 된다.  새로운 릴리스가 나오게 되면, 개발자는 새 릴리스의 변경사항을 보고, 기존 버전을 쓸지 여부를 결정을 해야 하기 떄문에, 릴리스 문서 작성도 포함해야 한다.

 

REP를 소프트웨어 설계와 아키텍쳐 관점에서 보게되면 단일 컴포넌트는 단순히 뒤죽박죽 임의로 선택된 클래스와 모듈로 구성되어서는 안된다. 컴포넌트를 구성하는 모듈들은 서로 공유하는 중요한 테마나 목적이 있어야 한다.

 

하나의 컴포넌트로 묶인 클래스는 반드시 모듈과 함께 릴리즈 될수있어야하며 클래스, 모듈 모두 버전번호가 같고 동일한 릴리즈로 추적관리 될 수 있어야한다.

 

CCP 공통 폐쇄 원칙

동일한 이유로 동일 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라
서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라.

단일책임원칙(SRP)가 Class수준이라면, CCP는 컴포넌트 수준의 원칙이다.

CCP를 통해 단일 컴포넌트로 제안하면, 해당 컴포넌트만 재배포 하면 되기 때문에 소프트웨어를 릴리즈, 재검증, 배포하는 일과 관련된 작업량을 최소화할 수 있다.

CCP는, 클래스는 변경에 닫혀있고 확장에는 열려있어야한다는 OCP(개방 폐쇄원칙)와도 밀접한 관련이 있다.

 

CRP 공통 재사용 원칙

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

공통 재사용 원칙도 클래스와 모듈을 어느 컴포넌트에 위치시킬지 결정할 때 도움되는 원칙이다.

 

대체로 재사용 가능한 클래스는 재사용 모듈의 일부로써 모듈내 다른 클래스와 상호작용 하는 경우가 많다.

 

따라서 이러한 클래스들은 동일한 컴포넌트에 포함되어야 하고, 이를 다르게 말하면, 컴포넌트 내부에서는 클래스들 사이에 수많은 의존성이 있으리라 예상할 수 있다. 이러한 의존성을 통해 서로 강하게 결합되어 있기에, 함께 재사용된다.

 

A라는 컴포넌트가 B라는 컴포넌트를 사용하게 되면, A는 B에 의존적인 컴포넌트가 된다.

 

이 같은 의존성으로 인해 사용되는 B컴포넌트가 변경될 때마다 사용하는 A컴포넌트도 변경해야 할 가능성이 높다. 또는, 사용하는 컴포넌트를 변경하지 않더라도, 재컴파일, 재검증, 재배포를 해야 하는 가능성은 여전히 남아있게 된다.

 

이를 방지하기 위해 인터페이스 분리원칙(ISP)에서는 사용하지 않는 메서드가 있는 클래스에 의존하지 말라고 했다면, CRP는 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말라고 조언한다.

 

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

 

  • REP와 CCP는 포함원칙으로, 컴포넌트의 크기를 크게 만들고, CRP는 배제의 원칙으로 컴포넌트를 작게 만든다.
  • REP - 릴리즈에 따라 컴포넌트의 크기가 커짐
  • CCP - 단일 컴포넌트가 가지고 있는 책임에 대한 변경이 올 때 커짐
  • CRP - 컴포넌트내에 재사용 클래스의 수많은 의존성에 의해 내부의 응집도가 커지므로, 컴포넌트의 크기는 작아짐
  • REP와 CRP에만 중점을 두면, 변경이 생겼을 때, 많은 컴포넌트에 영향을 미친다.
  • CCP와 REP에 집중하면 불필요한 릴리즈가 많아진다.
프로젝트의 컴포넌트 구조는 시간과 성숙도에 따라 변한다.

 

결론

어느 클래스들을 묶어서 컴포넌트를 만들지 결정할 때, 재사용성과 개발가능성이라는 상충하는 힘을 반드시 고려해야 한다.

 

Comments