Today I Learned

04 컴포넌트 (1) 본문

클린 아키텍처

04 컴포넌트 (1)

하이라이터 2021. 7. 23. 03:21
728x90

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

 

  • 컴포넌트는 무엇인가?
  • 컴포넌트를 구성하는 요소는 무엇인가?
  • 컴포넌트를 결합하여 시스템을 구성하는 방법

12장. 컴포넌트

컴포넌트 : 배포 단위. 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위

(ex. 자바의 jar 파일, 루비의 gem 파일, 닷넷의 DLL)

 

컴파일형 언어 - 바이너리 파일의 결합체가 컴포넌트

인터프리터형 언어 - 소스 파일의 결합체가 컴포넌트

 

컴포넌트는 .war와 같은 단일 아카이브,  .jar나 .dll같은 동적 로드 플러그인, .exe 같은 실행파일 등으로 배포할 수 있다.

컴포넌트가 어떤 형태로 배포되든, 독립적으로 개발, 배포 가능하도록 설계해야한다.

 

컴포넌트의 간략한 역사

1. 초창기

메모리에서의 프로그램 위치와 레이아웃을 프로그래머가 직접 제어. 프로그램의 위치가 한번 결정되면, 재배치가 불가능

프로그래머가 라이브러리 함수의 소스코드를 애플리케이션 코드에 직접 포함시켜 단일 프로그램으로 컴파일

-> 함수 라이브러리가 클수록 컴파일 시간 증가 (라이브러리가 소스코드)

2. 함수 라이브러리의 소스코드를 애플리케이션 코드로부터 분리

함수 라이브러리를 개별적으로 컴파일하고 컴파일된 바이너리를 메모리의 특정 위치에 로드한 후, 애플리케이션 코드를 컴파일

메모리 위치가 고정되어있어 라이브러리와 애플리케이션이 커지면 메모리 단편화가 발생

 

3. 재배치가 가능한 바이너리

함수 라이브러리와 애플리케이션을 로드할 위치를 지정하고 연결하는 링킹로더를 사용하여 메모리에 재배치

프로그램을 개밸젹으로 컴파일하고 로드할 수 있는 단위로 분할할 수 있게 됨

프로그램이 커지며 링킹 로더 수행시간 증가 (링크와 로드가 동시에 수행)

 

4. 로드와 링크를 두 단계로 분리

느린 링크 과정을 링크가 완료된 재배치 코드로 만들어주는 링커로 분리. 링커를 사용해 만든 실행파일로 로드만 빠르게 수행

각 모듈의 컴파일은 빠르나, 전체 모듈 컴파일 속도는 여전히 느렸고 링커에서는 더 많은 시간이 소요

로드는 빨랐으나, 컴파일-링크 시간의 병목 구간 해결안됨

 

5. 하드웨어의 발전

프로그래머가 프로그램을 성장시키는 속도보다 하드웨어 성능으로 링크 시간이 줄어드는 속도가 더 빨라지시 시작

현재의 소프트웨어 컴포넌트는 런타임에 플러그인 형태로 결합할 수 있는 동적 링크 파일


13장. 컴포넌트 응집도

어떤 클래스를 어떤 컴포넌트에 포함시켜야 될까? 이는 중요한 결정이므로 소프트웨어 엔지니어링 원칙의 도움을 받아야 한다.

  • REP : 재사용/릴리스 등가 원칙 Reuse/Release Equivalence Priciple
  • CCP : 공통 폐쇄 원칙 Common Closure Principle
  • CRP : 공통 재사용 원칙 Common Reuse Principle

 

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

재사용 단위는 릴리스 단위와 같다.

 

재사용 가능한 컴포넌트, 컴포넌트 라이브러리의 수가 급격히 증가하며 메이븐, 라이닝언, RVM 같은 모듈관리 도구가 등장

릴리스 버전을 통해 새 릴리스의 변경 사항을 살펴버고, 기존 버전을 계속 쓸지 여부를 결정할 수 있음

 

단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 한다

= 하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스할 수 있어야 한다.

 

CCP : 공통 폐쇄 원칙

동일한 이유로 동일한 시점에 변경되는 클래스끼리 같은 컴포넌트로 묶여야 한다.

 

따라서 물리적 또는 개념적으로 강하게 결합되어 항상 함께 변경되는 클래스들은 하나의 컴포넌트에 속해야 한다.

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

 

CCP는 컴포넌트 수준의 SRP(단일 책임 원칙)이며, OCP(개방 폐쇄 원칙)과도 밀접한 관련이 있다.

단일 컴포넌트는 변경의 이유가 여러개 있어서는 안되며, 동일한 유형의 변경에 대해 닫혀있는 클래스들을 하나의 컴포넌트에 묶어 변경에 대한 영향을 최소화해야한다.

 

CRP : 공통 재사용 원칙

컴포넌트 사용자들을 필요하지 않은 것에 의존하게 강요하지 말라.

 

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

반대로 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 위치시켜서는 안된다.

사용하지 않은 컴포넌트로 인해 재컴파일, 재검증, 재배포를 하게 될 수 있다.

 

CCP는 ISP(인터페이스 분리 원칙)의 포괄적인 버전이다.

ISP는 사용하지 않은 메서드가 있는 클래스에 대한 의존, CRP는 사용하지 않는 클래스를 가진 컴포넌트에 의존을 금지한다.

 

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

728x90

'클린 아키텍처' 카테고리의 다른 글

05 아키텍처 (1)  (0) 2021.08.06
04 컴포넌트 (2)  (0) 2021.07.30
03 설계 원칙 (2)  (0) 2021.07.16
03 설계 원칙 (1)  (0) 2021.07.09
02 벽돌부터 시작하기: 프로그래밍 패러다임  (0) 2020.02.02
Comments