본문 바로가기
아키텍쳐를 고민하기

단위 크기:패키지 응집도의 원칙

by simplify-len 2020. 9. 5.

Photo by Scarbor Siu on Unsplash

로버트 마틴의 클린 소프트웨어의 책 내용을 발췌하여, 정리 후 저의 내용과 함께 적어내렸습니다.

들어가기 

여기서 우리는 앞서 언급한 6가지 원칙 중, 패키지 응집도와 관련된 원칙 3가지를 살펴볼 예정입니다.
패키지 응집도 원칙 세 가지는 개발자가 어떻게 클래스를 패키지에 분류해 넣을지 결정할 때 도움이 됩니다.이 원칙을 적용하기 전 클래스와 클래스 상호 관계가 일부분이라도 밝혀져 있어야 한다. 즉, 이 원칙들은 클래스를 분류할 때 '상향식'접근 방법을 따릅니다.

1. 재사용/릴리즈 등가 원칙(Release-Reuse Equivalency Principle) -REP

 재사용의 단위가 릴리즈의 단위다.

 이 부분을 읽으면서 가장 먼저 드는 생각은, "나는 패키지를 내가 아닌 다른 사람이 재사용가능하게 만들어 놓은 패키지가 있었던가?" 였습니다. 크게 레이어드 아키텍쳐라 불리는 Layer 단위로 명시적인 뜻을 가진 클래스를 표현해내는 것에만 집중하지는 않았나? 라고 생각했습니다.

REP 원칙이란? 재사용(패키지) 단위는 결코 릴리즈 단위보다 작을 수 없다. 즉, 재사용 가능하다 라는 말은 결코 하나의 클래스로서 이루어 질수 없다 라는 것을 의미합니다.

 재사용이 가능하다라는 말은 반드시 릴리즈된 다음 추적(ex, git, 도메인 히스토리)되어야 하고, 잠재적인 사용자들에게 필요한 통보, 안전성, 지원에 대한 보장을 제공하는 시스템이 존재해야만 한다는 것을 의미합니다. 재사용성은 반드시 패키지에 기반을 두어야 하기 때문에, 재사용 가능한 패키지는 재사용 가능한 클래스를 포함해야 합니다. 

또한, REP는 패키지의 내부 구조에 대해서, 잠재적인 재사용자의 입장에서 봐야 합니다. 만약 패키지에 재사용될 소프트웨어가 들어 있다면, 그 패키지에는 재사용을 목적으로 설계되지 않은 소프트웨어는 들어 있지 않아야 합니다. 패키지의 모든 클래스가 재사용 가능하든지, 모든 그렇지 않든지 해야 합니다. 그러므로, 패키지의 재사용성만이 유일한 기준이 아닙니다. 패키지 안의 모든 클래스는 동일한 재사용자를 대상으로 해야 하며, 어떤 사람의 관점에서 봤을 때, 한 패키지에서 일부 클래스는 필요하지만 일부는 전혀 쓸모없으면 안됩니다.


2. 공통 재사용 원칙(Common Reuse Principle) - CRP

패키지 안의 클래스들은 함께 재사용되어야 한다. 어떤 패키지의 클래스 하나를 재사용한다면 나머지도 모두 재사용한다.

 1번의 일부 내용과 겹치는 것처럼 보이지만, CRP 원칙은 어떤 클래스들이 하나의 패키지에 포함되어야 하는지 결정할 때 도움이 됩니다. 이 원칙에 따르면 자주 함께 재사용되는 클래스들은 동일한 패키지에 속해 있음을 증명합니다.

공통 재사용 원칙(CRP)은 단독으로 재사용되는 클래스는 없다라는 가정아래, 재사용 가능한 클래스들은 재사용 가능에 대해 같은 추상적 범주에 속해 있는 다른 클래스와 협력할 때, 이들은 모두 동일한 패키지에 속해 있다는 것을 의미합니다. 이런 패키지 안을 보면 서로 상당한 정도의 의존 관계를 맺고 있는 클래스들을 보게 될 것입니다.

CRP 원칙은 또한, 어떤 클래스들을 같은 패키지에 넣어야 한다는 것만을 말하는 것이 아닌, 어떤 클래스를 같은 패키지에 넣지 않아야 할지도 말해줍니다. 즉, A,B의 모듈이 존재하는데, 이 때, A가 B에 의존적이다 라고 말했을 때, B모듈을 릴리즈 할 경우, A모듈도 릴리즈 검증을 해야합니다. 비록, B모듈에서 A모듈에 전혀 상관없는 클래스 하나에 대한 변경 때문일지라도,

따라서 어떤 패키지에 의존한다면 그 패키지의 모든 클래스에 의존하는지 확실히 해두어야 한다. 다시 말해, 패키지에 넣은 클래스들이 서로 뗄 수 없는 관게여서 일부에만 의존하고 나머지에는 의존하지 않는 일이 불가능한지 확실히 해두어야 한다. 그렇지 않다면 필요 이상으로 재검증과 재배포해야 하는 일이 많아져서 상당한 노력을 낭비하게 될 것입니다.


3. 공통 폐쇄 원칙(Common-Closure Principle) - CCP

같은 패키지 안의 클래스들은 동일한 종류의 변화에는 모두 폐쇄적이어야 한다. 패키지에 어떤 변화가 영향을 미친다면, 그 변화는 그 패키지의 모든 클래스에 영향을 미쳐야 하고 다른 패키지에는 영향을 미치지 않아야 한다.

CCP 는 대상이 패키지인 단일 책임 원칙과 동일하다. 클래스를 변경할 이유가 여러 가지면 안된다는 SRP와 마찬가지로, 이 원칙도 패키지를 변경할 이유가 한 가지여야 한다는 것을 말합니다.

CCP는 우리에게 동일한 이유로 변할 것 같은 클래스들은 한 장소에 모아놓으라고 권장합니다. 클래스 2개가 물리적으로나 개념적으로나 단단히 결합되어 있어서 언제나 함께 변경되야 한다면, 이들은 같은 패키지에 속합니다. 이렇게 하면 소프트웨어를 릴리즈, 재검증, 재배포하는 일에 관련된 작업량을 최소로 줄일 수 있습니다.

그러나 SRP와 다르게 주의해야 될 점은, 패키지에 대해서 폐쇄에 대해서 전략적으로 생각해야 합니다. 왜냐하면, 우리의 애플리케이션은 100% 정적이지 않고, 동적으로 끊임없이 변경되기 때문입니다.


마무리

  재사용 등가원칙, 공통 재사용 원칙, 공통 폐쇄 원칙등은 패키지의 응집도와 관련된 내용입니다. 그리고, 위 내용을 이해했더라면, 패키지들은 단순하게 재사용을 하기 위해서, 공통으로 재사용하기 위해서, SRP는 단 하나의 책임만 수행하는 것이라 말하기 힘듭니다.

 패키지의 응집도를 위해 잘 만들기 위한 방법으로 재사용 등가 원칙은, 단순히 재사용만을 위한 원칙이 아닌- 추적 가능하다 라는 것과 패키지의 모든 클래스가 재사용 가능하든지, 모든 그렇지 않든지 해야 합니다. 라는 내용은 또 다른 관점에서 생각해볼 수 있는 내용이였습니다.

댓글