본문 바로가기

클린 아키텍처

4부 컴포넌트 원칙 - 컴포넌트

컴포넌트란?

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

 

ex) 자바의 경우 jar파일이 하나의 컴포넌트가 될 수 있다. 예를 들어 마인크래프트의 모드 같은경우 jar파일을 이용하여 플러그인(모드 변경) 할 수 있다. 이때 이 jar하나는 마인크래프트라는 시스템의 구성요소로 적용 할 수 있으며 하나의 기능을 온전히 수행하는 작은 단위가 된다.

 

이 책에서의 컴포넌트

런타임 플러그인 형태로 결합할 수 있는 동적 링크 파일

 

Why?

1) 컴포넌트의 역사

소프트웨어 초창기에는 메모리에서 프로그램 위치와 레이아웃을 프로그래머가 직정 제어했다.

또한 라이브러리 함수를 하나의 애플리케이션 코드에 포함시켜 컴파일 했다.

 

문제 

  • 컴파일 후 프로그램의 위치가 한번 결정되면 재배치 불가능
  • 함수 라이브러리가 크면 클수록 컴파일시간은 길어짐

 

 이에 컴파일 시간을 단축시키기 위해 프로그래머들은 함수 라이브러리의 소스코드와 애플리케이션 코드를 분리하였다. 

애플리케이션을 로드하기 전에 함수 라이브러리를 특정 메모리위치에 로드하고(이 당시에 함수 라이브러리 로드는 전원이 꺼지더라도 삭제되지 않는 비휘발성 코어 메모리를 사용했다고 한다.) 어플리케이션을 컴파일 후 로드하는 방식으로 사용했다.

 

문제

  • 애플리케이션의 크기 증가에 의한 단편화

 

2) 재배치 로더의 등장

단편화되는 문제의 해결책은 지능적인 로더를 만드는 것이 였다.

 

지능적인 로더는 재배치 코드가 자리할 위치정보를 전달받고, 재배치 코드에는 로드한 데이터에서 어느 부분을 수정해야 정해진 주소에 로드할 수 있는지를 알려주는 플래그가 삽입되었다. (바이너리를 참조하는 메모리의 시작주소)

 

이렇게해서 프로그래머는 함수 라이브러리를 로드할 위치와, 애플리케이션을 로드드할 위치를 로더에게 지시하면 실제로 로더는 차례로 메모리로 로드하면서 재배치 하는 작업을 처리했다.

이를 통해 프로그래머는 오직 필요한 함수만을 로드할 수 있게 되었다.

이를 배경으로 링킹로더(프로그램을 로드하는 동시에 링크를 수행하는 로더)

 

3) 링커

링킹 로더의 등장으로 프로그램을 갤별적으로 컴파일하고 고드할수 있는 단위로 분할할 수 있게 되었다.

하지만 시간이 갈수록 프로그램은 커지게 되고 링킹 로더 마저도 너무 느려지게 되었다.

이에 해결책은 링크와 로더의 분리 였다.

  • 링커 : 링크가 완료된 재배치 코드를 생성
  • 로더 : 메모리에 로드

하지만 C나 또 다른 고수준 언어가 등장하면서 링커에서 또다시 많은 시간이 소요되었다.

이를 해견한건 하드웨어의 발전이었다.

메모리는 저렴해지고, 속도도 놀랄 만큼 빨라져서 링크시간은 초단위 수준이 될 정도로 감소했다.

 

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

4부 컴포넌트 원칙 - 컴포넌트 결합도  (0) 2023.02.13
4부 컴포넌트 원칙 - 컴포넌트 응집도  (0) 2023.02.06
3부 설계원칙-DIP  (0) 2023.01.16
3부 설계원칙-ISP  (0) 2023.01.16
3부 설계원칙-LSP  (0) 2023.01.16