13장 컴포넌트 응집도

컴포넌트란?

 

컴포넌트는 배포할 수 있는 가장 작은 단위이며 흔히 .jar(java archive resource)이 컴포넌트에 해당한다.

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

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

 

 

 

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

 

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

 

컴포넌트는 소프트웨어 컴포넌트 릴리즈 절차를 통해 추적 관리되고 릴리즈 번호가 부여되어 해당 컴포넌트를 재사용되게 해야한다. 이는 새로운버전이 언제 출시되고 무엇이 변했는지를 개발자들이 알아야하기 때문이다. 그래야 기존 컴포넌트 릴리즈를 사용했던 개발자들이 새로운 버전을 쓸지의 여부를 알 수 있다.

 

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

 

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

 

 

 

CCP 공통 폐쇄 원칙

 

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

 

CCP는 SRP(단일책임원칙)을 컴포넌트 관점에서 다시 정의한셈이다. SRP는 단일 클래스의 변경이유가 여러 액터에 의하면(여러 이유가있으면) 안된다고 말하듯이 CCP에서도 단일 컴포넌트는 변경의 이유가 여러개 있어서는 안 된다고 말한다.

 

CCP를 통해 소프트웨어를 릴리즈, 재검증, 배포하는 일과 관련된 작업량을 최소화할 수 있다.

 

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

 

CCP는 동일한 유형의 변경에 대해 닫혀있는 클래스들을 하나의 컴포넌트를 묶어 변경이 필요한 요구사항이 발생한경우 그 변경이 영향을 주는 컴포넌트들이 최소한으로 한정될 가능성이 높아지게끔 적용 될 수 있다. 이는 OCP에서 얻은 교훈을 확대 적용한 셈이다.

 

SRP(클래스관점) & CCP(컴포넌트관점) 두 원칙을 요약하자면 "동일한 시점에 동일한 이유로 변경되는 것들을 한데 묶고, 서로 다른 시점에 다른 이유로 변경되는 것들은 서로 분리하라." 이다.

 

 

 

CRP 공통 재사용 원칙

 

같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함 해야한다는 원칙이다. 이전에 나왔던 원칙과 비슷하게 CRP도 클래스와 모듈을 어느 컴포넌트에 위치 시킬지 결정할때 도움을 주는 원칙이다.

 

간단한 사례로 컨테이너 클래스와 해당 클래스의 이터레이터 클래스를 예로 들 수 있다. (Iterator는 하나의 객체로서, 객체가 저장된 컨테이너 사이를 이동하면서 각 객체를 선택해 주는 역할을 한다.)

둘 클래스는 서로 강하게 결합 되어있기 때문에 함께 재사용된다. 이처럼 CRP는 각 컴포넌트에 어느 모듈과 클래스를 포함시킬지 설명하지만 동일한 컴포넌트로 묶어서는 안되는 클래스가 무엇인지도 설명해준다.

 

어떤 컴포넌트가 다른 컴포넌트를 사용하면 의존성이 생긴다. 단 하나의 클래스를 사용하더라도 그 의존성은 약해지지 않는다.

그러므로 의존성으로 인해 사용되는 컴포넌트가 변경 될 때마다 사용하는 컴포넌트도 변경해야할 가능성이 높다. 재컴파일, 재검증, 재배포해야할 가능성은 여전히 남아있으며 심지어 사용되는 컴포넌트에서 발생한 변경이 사용하는 컴포넌트와는 전혀 관련이 없는 경우도에도 말이다.

 

즉, 의존하는 컴포넌트가 있다면 해당 컴포넌트의 모든 클래스에 대해 의존함을 확실히 인지하며 강하게 결합 되지않은 클래스들을 동일한 컴포넌트에 위치시키면 안된다. 그래야 컴포넌트를 재배포 할 때 소중한 우리의 노력을 허비하지 않게 된다. 😄

 

ISP(인터페이스분리원칙) & CRP(공통재사용원칙) ISP는 사용하지 않은 메서드가 있는 클래스에 의존하지 않는 것이며 CRP는 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 않는것이다. 요약하자면 "필요하지 않은 것에 의존하지 말라" 이다.

 

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

REP, CCP는 포함 원칙이며 컴포넌트를 더욱 크게 만들고 CRP는 배제원칙이며 컴포넌트를 더욱 작게만든다.

 

각 변은 반대쪽 꼭지점에있는 원칙을 포기했을 때 감수해야할 비용을 나타낸다.

오로지 REP와 CRP에 대해서만 중점을 두면, CCP원칙이 충분히 적용되지 않았기 때문에 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 미친다. 반대로 CCP와 REP에 대해서만 과도하게 집중되면 불필요한 릴리즈가 너무 빈번해진다.

'📚 Book > Clean Architecture' 카테고리의 다른 글

15장 아키텍처란?  (0) 2020.02.22
14장 컴포넌트 결합  (0) 2020.02.22
11장 DIP: 의존성 역전 원칙  (0) 2020.02.19
10장 ISP: 인터페이스 분리 원칙  (0) 2020.02.19
8장 OCP: 개방-폐쇄 원칙  (0) 2020.02.19