개발 공부/SOLID 원칙

SOLID 원칙 과 컴포넌트 설계 원칙 ②

수달하나 2024. 5. 11. 10:56

Component 단위의 설계 원칙

배포 가능한 가장 작은 단위를 컴포넌트라고 정의하면 컴포넌트를 구성하기 위해서 SOLID 원칙을 잘 활용하여 설계 하는것이 중요하다.

이후 배포 과정에서 여러 컴포넌트 또한 상호작용을 하며 하나의 어플리케이션을 구성하게 된다면 컴포넌트가 지향해야 하는 원칙또한 존재한다.

 

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

컴포넌트의 재사용 단위는 릴리스 단위와 같다.

새로운 릴리스가 나온다는 소식을 통해서 개발자는 새로운 변경 사항을 살펴보고 기존 버전을 계속 사용할 것인지에 대한 여부를 결정하기 때문에 릴리스 절차에 적절한 공지와 함께 릴리스 문서 작성도 포함되어야 한다.

 

재사용을 쉽게 하기 위해서 하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호를 동일하게 유지해야 하며 동일한 번호로 추적 관리될 수 있도록 하는 것이 이상적인 원칙이다.

 

CCP : 공통 폐쇄 원칙 Common Closure Principle

이 원칙은  SRP (단일 책임 원칙) 와 OCP(개방 폐쇄 원칙) 원칙을 컴포넌트 단위로 확장한 개념이다.

 

SRP 에서 단일 클래스는 변경의 이유가 여러 개 있어서는 안된다고 하듯이 공통 폐쇄 원칙에서도 단일 컴포넌트의 변경 이유가 여러개 있어서는 안 된다는 것 이다.

변경이 여러 컴포넌트 도처에 분산되어 발생하기보다는 변경 모두가 단일 컴포넌트 에서 발생하는 편이 낫고 이러한 제한이 가능하다면 해당 컴포넌트만 재배포 하면 되기 때문이다. 

 

CCP 에서는 OCP 에서 확인한 개념을 확대 적용하여 변경이 필요한 요구사항이 발생했을 때 그 변경에 영향을 주는 컴포넌트들이 최소한으로 한정될 수 있도록 설계해야 한다.

 

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

CRP 원칙은 같이 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함되어야 한다는 것을 의미한다.

개별클래스가 단독으로 재사용되는 경우는 거의 없고 대체로 재사용 가능한 클래스는 재사용 모듈의 일부로써 해당 모듈의 다른 클래스와 상호작용하는 경우가 많은에 이런 클래스들이 동일한 컴포넌트에 포함되어야 한다는 것 이다.

 

하지만 CRP 원칙의 핵심은 어떤 클래스들을 하나의 모듈안에 포함시키느냐 보다 어떠한 클래스들을 포함시키지 않을것인가 에 집중하는것이 더 옳다고 얘기한다.

특정 컴포넌트가 다른 컴포넌트를 사용하면 두 컴포넌트 사이에는 의존성이 생기게 되고 그 과정에서 단 하나의 클래스만을 사용한다고 했을 때, 사용하는 클래스가 많던 적던 컴포넌트 간의 의존성의 결합력 에는 영향을 미치지 못한다.

의존하고 있는지 아닌지에 대한 여부만이 중요할 뿐 이다.

따라서 컴포넌트가 변경될 때 사용하는 클래스가 변경되지 않더라도 재컴파일, 재 검증, 재 배포를 해야 하는 가능성이 남아있는 것 이다. 

 

따라서 특정 컴포넌트의 일부 클래스에 의존하더라도 해당 컴포넌트안에 있는 모든 클래스에 의존하고 있음을 반드시 명확하게 인지하고 있어야 한다.

하나의 컴포넌트에 의존할 때 해당 컴포넌트의 일부 클래스만을 사용하는 일이 발생하지 않도록 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안되는 것 이다.

 

컴포넌트 균형 다이어그램

원칙을 다 지키면서 컴포넌트를 설계하는 것은 사실상 불가능하다.

컴포넌트의 확장을 지향하는 REP 원칙과 CCP 원칙 그리고 축소를 지향하는 CRP 원칙은 서로 상충되는 방향성을 가진다.

또한 REP 원칙을 축소했을 때는 재사용률이 저하되지만 CCP 원칙과 CRP 원칙을 강화할 수 있다는 장점이 있고 CCP 원칙을 축소했을 때는 컴포넌트의 변경이 빈번해진다는 단점이 있지만 REP 원칙과 CRP 원칙을 강화 할 수도 있다.

마찬가지로 CRP 원칙을 축소시키면 불필요한 릴리스가 계속 발생되지만 REP 원칙과 CCP 원칙을 강화 할 수 있다.

 

이 세가지의 원칙들 간 균형을 지키면서 컴포넌트를 설계하는 것이 중요하다.

어떤 서비스를 개발할 것인지 혹은 개발의 진행 시기에 따라서 중요하게 생각해야 하는 요소가 달라질 수 있기 때문에 삼각관계의 Trade off 를 잘 생각하며 컴포넌트를 구성하는 것을 연습해야 할 것이다.