4부, 컴포넌트 원칙

2021.10.26

  • SOLID 원칙이 벽과 방에 벽돌을 배치하는 방법을 알려준다면, 컴포넌트 원칙은 빌딩에 방을 배치하는 방법을 알려준다.

12장 컴포넌트

  • 컴포넌트는 배포 단위다. 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다.
    • 컴파일형 언어에서 컴포넌트는 바이너리 파일의 결합체. 인터프리터형 언어의 경우는 소스 파일의 결합체.
  • 소프트웨어 개발 초창기에는 메모리에서의 프로그램 위치와 레이아웃을 직접 제어함.
    • 지능적인 로더 사용으로 메모리에 재배치할 수 있는 형태의 바이너리를 생성하도록 컴파일러를 수정하는 것으로 개선이 되었다.
    • 프로그램도 규모가 커지고 시간이 지나면서 링킹 로더가 너무 느려져서 결국 링커와 로더가 분리되었다.
    • 링커는 링크가 완료된 재배치 코드를 만들어주고, 덕분에 로더의 로딩 과정이 아주 빨라졌다.
    • 각 모듈은 컴파일하는데 시간 소요가 얼마 안되었지만, 전체 소요시간은 다시 늘어났다.
    • 컴파일하고 링크하는데에 소요되는 시간은 결국 무어가 등장하며 해결.
  • 무어의 법칙 : 반도체 집적 회로, 즉 메모리의 성능은 24개월마다 2배로 증가한다는 법칙
  • 이로하여 공유 라이브러리 시대가 열렸다.
  • 여기까지 오는데 50년이 걸렸다.

13장 컴포넌트 응집도

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

  • 재사용 단위는 릴리즈 단위와 같다.
  • 릴리스 절차에는 적절한 공지와 함께 릴리즈 문서 작성도 포함되어야 한다.
  • 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 테마나 목적이 있어야 한다.
  • 위의 원칙만으로 모듈을 묶는 방법을 제대로 설명하기 힘들기 때문에, 아래 2가지의 원칙을 통해 보완할 수 있다.

CCP: 공통 폐쇄 원칙 Common Closure Principle

  • 동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라.
  • SRP(단일책임원칙)을 컴포넌트 관점에서 바라본 것.
  • 대다수의 어플리케이션에서 유지보수성은 재사용성보다 훨씬 중요하다.
  • 만약 변경을 단일컴포넌트만 제한할 수 있다면 해당 컴포넌트만 배포하는게 최선의 선택이다.

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

  • 컴포넌트 사용자들을 필요하지 않는 것에 의존하게 강요하지 말라.
  • 강하게 결합되어 있는 클래스들만 컴포넌트의 모듈로 사용하라.
  • 어떤 클래스를 묶어도 되는지보다 어떤 클래스를 묶어서 안되는지에 대해서 이야기한다.
  • ISP(인터페이스분리원칙)의 포괄적인 버전.
    • 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 말라.
  • 필요하지 않은 것에 의존하지 말라.
  • REP와 CCP는 포함 원칙, CRP는 배제 원칙.
  • 컴포넌트 응집도 원칙 다이어그램의 중간지점을 지키도록 노력해야 한다.clean-architecture
  • 이는 시간이 흘러가며 주의를 기울이는 부분이 변할 수 있다.
    • 프로젝트가 성숙하고, 다른 프로젝트가 파생된다면 점차 왼쪽으로 이동해 간다
  • 어떤 클래스들을 묶어 컴포넌트로 만들지 결정할 때, 재사용성과 개발 가능성의 교차지점을 반드시 고려해야 한다. ( 이 균형점은 거의 항상 유동적 )
  • 컴포넌트 구조는 시간이 지남에 따라 흐트러지며, 또 진화한다.

14장 컴포넌트 결합

ADP: 의존성 비순환 원칙

  • 컴포넌트 의존성 그래프에 순환이 있어서는 안된다.
  • 순환 의존을 막기 위한 2가지 해결책은 주단위 빌드와 의존성 비순환 원칙을 지키는 것이다.
  • 주단위 빌드
    • 현실적으로 힘들어 보임.
  • 순환 의존성 제거하기
    • 개발 환경을 릴리즈 가능한 컴포넌트 단위로 분리하는 것.
    • 해당 컴포넌트를 개발하는 개인 혹은 팀은 개발 & 릴리즈를 하여 다른 개발자들이 사용할 수 있게 만든다.
    • 컴포넌트 다이어그램은 비순환 방향 그래프(Directed Acyclic Graph )로 표현이 된다.
    • 컴포넌트 다이어그램의 의존성을 파악하고 있으면 시스템을 빌드하는 방법을 알 수 있다.
  • 순환이 컴포넌트 의존성 그래프에 비치는 영향
    • 여러 클래스 중 하나에 간단한 단위 테스트를 실행하는데 많고 다양한 라이브러리, 다른 사람의 작업물을 포함해야 한다면 의존성 그래프에 순환이 있기 때문이다.
  • 순환 끊기
    • DIP를 적용한다.
  • 흐트러짐
    • 애플리케이션이 성장함에 따라 구조는 흐트러지며 성장한다.
    • 항상 관심을 갖고 관찰하자.

하향식(top-down) 설계

  • 컴포넌트 구조는 프로젝트 초기에 설계할 수 없다.
    • 빌드하거나 유지보수할 소프트웨어가 없다면 빌드와 유지보수에 관한 지도 또한 필요 없기 때문이다.
  • 모듈들이 점차 쌓이기 시작하면, SRP(단일책임원칙)과 CCP(공통폐쇄원칙)에 관심을 갖기 시작한다.
  • 의존성 구조와 관련된 최우선 관심사는 변동성을 격리하는 일이다.
  • 애플리케이션이 성장함에 따라, 재사용 가능한 요소를 만드는 일에 관심을 기울이며, CRP(공통재사용원칙)이 영향을 미치기 시작한다.

SDP: 안정된 의존성 원칙

  • 안정성의 방향으로(더 안정된 쪽에) 의존하라.
  • 설계는 유지하다보면 변경은 불가피하다.
  • A가 작성한 모듈이 변경이 없었어도 B가 작성한 모듈에서 A에게 의존성을 두어버리면, A 모듈 변경도 힘든 일이 된다.
  • 안정성
    • 안정성은 변화가 발생하는 빈도와는 직접적인 관련이 없다.

SAP: 안정된 추상화 원칙

  • 컴포넌트는 안정된 정도만큼만 추상화되어야 한다.
  • 안정성과 추상화 정도 abstractness 사이의 관계를 정의한다.
  • 고수준의 정책을 가지고 있는 안정된 컴포넌트는 추상 컴포넌트여야 한다.
    • 인터페이스와 추상클래스로 구성되어 쉽게 확장할 수 있어야 한다.
  • 컴포넌트는 어떤부분은 추상적이면서 다른 부분은 안정적일 수 있다.

결론

  • 의존성 관리 지표는 설게의 의존성과 추상화 정도가 훌륭한 패턴이라고 생각하는 수준에 얼마나 잘 부합하는지를 측정한다.
  • 저자는 경험을 통해 좋은 의존성도 있으며 나쁜 의존성도 있다고 배웠다.