개성있는 개발자 되기

4부 컴포넌트 원칙 - (2) 컴포넌트 응집도 본문

Web Development/Clean Architecture

4부 컴포넌트 원칙 - (2) 컴포넌트 응집도

정몽실이 2020. 3. 15. 16:46

컴포넌트를 어떤 클래스로 구성할지 결정하는데 도움이 되는 세 가지 원칙을 설명한다.

 

REP : 재사용/릴리스 등가 원칙 Reuse/Reloease Equivalence Principle

CCP : 공통 폐쇄 원칙 Common Closure Principle

CRP : 공통 재사용 원칙 Common Reuse Principle

 


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

 

컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 함을 뜻하는 원칙

 

컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 한다. 따라서 반드시 함께 릴리스할 수 있어야 한다.

 

쉽게 Git으로 비유해서 생각해보면, 배포 버전(릴리스번호)이 있어야 컴포넌트들이 재사용될 수 있으며, 변경사항을 추적할 수 있다.

 

2) CCP : 공통 폐쇄 원칙

 

동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라

 

단일책임원칙(SRP)을 컴포넌트 관점에서 다시 쓴 것이다. SRP에서 단일 Class는 변경의 이유가 한개만 존재해야 하듯이, CCP 에서도 마찬가지로 단일 Component는 변경의 이유가 오직 한개여야 한다는 뜻이다.

 

이러한 변경이 여러 컴포넌트에 분산되어 발생하기보다는, 차라리 변경 모두가 단일 컴포넌트에서 발행하는 편이 낫다.

유지보수성을 위해서는 변경을 하고자할 때, 단일 컴포넌트로 제한할 수만 있다면, 그부분만 수정하면 되기 때문이다.

 

CCP는 이 이유로, 변경될 가능성이 있는 클래스는 모두 한곳으로 묶을 것을 권한다.

 

3) CRP : 공통 재사용 원칙

 

재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 한다.

 

Container 클래스와 Iterator 클래스는 서로 강하게 결합되어 있기 때문에 함께 재사용된다. 따라서 이들 클래스는 반드시 동일한 컴포넌트에 위치해야 한다.

 

CRP는 또한, 어떤 클래스를 한곳에 묶어서는 안되는지에 대해서 훨씬 더 중요성을 두고 있다. 즉, 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안된다고 말한다.

 

ISP (인터페이스 분리 완칙)의 포괄적인 버전으로 볼 수 있다. ISP 는 사용하지 않은 메서드가 있는 클래스에 의존하지 말라고 조언한다. CRP는 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말라고 조언한다.

 

즉, 필요하지 않은 것에 의존하지 말라는 뜻을 의미하고 있다.

 

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

 

뛰어난 아키텍트라면 이 세가지 원칙들이 균형을 이루는 방법을 찾아야 한다.

 

다이어그램의 각 Edge는 반대쪽 Edge에 있는 원칙을 포기했을 때 감수해야할 비용을 나타낸다.

 

    - 오로지 REP와 CRP에만 중점을 두면, 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 미친다.

    - 반대로 CCP와 REP에만 과도하게 집중하면 불필요한 릴리스가 너무 빈번해진다.

 

프로젝트 초기에는 CCP 더 중점을 둘것이다. 유지보수가 쉬워야 하기 때문이다.  그러나 시간이 지날 수록 삼각형의 왼쪽으로 점점 진화하게 된다.

 

결론

컴포넌트를 만들 때, 재사용성과 개발가능성이라는 상충하는 힘을 반드시 고려해야 한다.

 

더보기

개발 가능성을 고려해서 변경 가능성이 있는 코드를 하나의 컴포넌트에 모아두고, 변경이 필요할 때 이 단일컴포넌트만 변경하도록 개발했다고 생각해보자.

이러한 컴포넌트는 재사용성이 떨어질 가능성이 있다. 여러 메소드를 하나의 컴포넌트에 포함시켰기 때문에, 재사용하고자 할때, 필요없는 클래스까지 포함시켜야 할수 있기 때문이다.

Comments