Skip to content

Latest commit

 

History

History
85 lines (51 loc) · 5.34 KB

13장.md

File metadata and controls

85 lines (51 loc) · 5.34 KB

13장 컴포넌트 응집도

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

  • 우리는 무언가 공유 컴포넌트를 사용할때 반드시 릴리즈 노트를 확인해야 한다. 재사용할 컴포넌트가 서로 호환되는지를 알아야 하기 때문
  • 이 원칙은 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되야 함을 의미
  • 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 한다.
  • 하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 한번에 릴리즈할 수 있어야 한다.(동일한 릴리즈 버전 번호가 같아야 하며 동일한 릴리즈로 추적 관리되고 동일한 릴리즈 문서에 포함되어야 한다.)
  • 이 원칙을 지키지 않으면 "이치에 맞지 않게" 된다.
  • 다음으로 살펴볼 두가지 원칙은 REP를 엄격하게, 하지만 제약을 가하는 측면으로 정의한다.

CCP : 공통 폐쇄 원칙

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

  • 이 원칙은 단일 책임 원칙을 컴포넌트 관점에서 다시 쓴것인데 SRP에서 단일 클래스는 변경의 이유가 여러개 있어서는 안되선 안된다라는 원칙과 동일하게 단일 컴포넌트는 변경의 이유는 단 하나여야 한다.

  • 애플리케이션은 특히 재사용성보다는 유지보수성이 중요한데, 만약에 변경을 해야할 때 이런 변경이 여러곳에 퍼져있기 보다는 한곳에 모여있는 것이 수정이 편하다.

    또한 변경이 생기면 이것만 재 배포 하면 된다.

  • 따라소 CCP는 같은 이유로 변경될 가능성이 있는 클래스는 모두 한곳으로 묶을 것을 권한다.

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

  • 이 원칙은 개방 폐쇄 원칙과도 밀접하게 관련되어있다.

SRP와의 유사성

CCP는 컴포넌트 수준의 SRP로 생각하면 된다.

CRP : 공통 재사용 원칙

  • 이 원칙은 같이 재사용되는 경향이 있는 클래스와 모듈들은 같읕 컴포넌트에 포함해야 한다.
  • 개별 클래스는 대체로 단독으로 재사용 되는 경우는 거의 없으며 대체로 재사용 가능한 클래스는 재사용 모듈의 일부로써 해당 모듈의 다른 클래스와 상호작용 하는 경우가 많다.
  • 간단한 예로 컨테이너 클래스와 해당 클래스의 이터레이터 클래스를 들 수 있다. 해당 클래스들은 강하게 결합되어 있기 때문에 함께 재 사용되므로 반드시 동일한 컴포넌트에 위치해야한다.
  • CRP는 동일한 컴포넌트에 묶어야 하는 것 뿐만 아니라 묶어서는 안되는 것도 정의한다.
  • 어떠한 컴포넌트가 특정 컴포넌트를 사용하게 되면 두 컴포넌트 사이에는 의존성이 생겨난다.
  • 이러한 의존성으로 인해 사용되는 컴포넌트가 변경될 때마다 사용되는 컴포넌트도 변경될 수 있다. (설령 변경하지 않아도 되는 경우에도 재컴파일, 재검증, 재배포를 해야하는 가능성은 여전히 존재한다.)
  • 따라서 의존하는 컴포넌트가 있다면 해당 컴포넌트의 모든 클래스에대해 의존합을 확실히 인지할 필요가 있다.
  • 한 컴포넌트에 속한 클래스들은 더 작게 그룹지을 수 없다.(한 컴포넌트에 포함된 클래스라면 그것은 분리가 불가능)

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

사실 응집도에 관한 세 원칙은 서로 상충된다.

  • REP와 CPP는 포함원칙 두 원칙은 컴포넌트를 더욱 크게 만든다.
  • CRP는 배재 원칙 컴포넌트를 더 작게 만든다.

우리는 아키텍처를 구성할 때 이 원칙들의 균형을 잘 잡아야 한다.

각 변들은 꼭지점을 포기했을때 생기는 비용을 나타낸다.

image

REP와 CRP에만 집중할 때

  • 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 끼침

CCP와 REP에만 집중할 때

  • 불필요한 릴리즈가 너무 빈번해진다.

개발하며 균형 잡기

  • 초기 CCP가 REP보다 훨씬 중요한데 개발 가능성이 재사용성 보다 훨씬 중요하기 때문이다. 프로젝트의 시작은 삼각형의 오른쪽에서 시작하는 편이며 이때는 재사용성만 포기하게 된다.
  • 성숙기 그 프로젝트로 부터 파생된 또 다른 프로젝트가 시작되면 삼각형은 점차 왼쪽으로 이동한다.

결론

과거에는 응집도를 '모듈은 단 하나의 기능만 수행해야 한다.' 정도로 이해한 적도 있었지만 사실 컴포넌트 응집도에 대한 사항은 위 세가지 원칙이 더 복잡하다는 것을 설명해준다.

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

저 삼각형에서 균형을 잘 유지하는 것이 중요하며 프로젝트가 진행되어 감에 따라서 저것은 항상 변할 수 있다는 것을 생각해야한다.