개성있는 개발자 되기

4부 컴포넌트 원칙 - (1) 컴포넌트 본문

Web Development/Clean Architecture

4부 컴포넌트 원칙 - (1) 컴포넌트

정몽실이 2020. 3. 15. 16:16

1. 컴포넌트

 

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

ex) 자바의 jar파일, 루비의 gem파일, 닷넷에서 DLL

 

잘 설계된 컴포넌트라면 반드시 독립적으로 배포 가능한, 따라서 독립적으로 개발 가능한 능력을 갖춰야 한다.

 

1) 컴포넌트의 간략한 역사

 

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

즉, 프로그램을 빌드하기 위해서 어떤 소스가 어느 메모리 주소에 위치해야 하는지 프로그래머가 설정했어야했다.

 

    - 컴파일 후 프로그램의 위치가 한번 결정되면 재배치가 불가능

    - 함수 라이브러리가 크면 클수록 컴파일은 더 오래 걸림

 

따라서 컴파일 시간을 단축시키기 위해 프로그래머는 함수 라이브러리의 소스코드를 애플리케이션 코드로부터 분리했다. 애플리케이션을 실행할 때, 바이너리 함수를 먼저 로드한 다움 애플리케이션을 로드했다.

 

① 함수라이브러리를 개별적으로 컴파일

② 컴파일된 바이너리를 메모리의 특정위치에 로드

 

하지만 애플리케이션의 규모가 커지면 커질수록 결국 추가공간을 할당해야 했다.

 

2) 재배치성 로더

 

Loader : 소스코드를 메모리에 재배치할 수 있는 형태의 바이너리를 생성하는 지능적 Loader 를 만들고, 이 Loader를 사용해서 컴파일러를 수정하자는 아이디어가 나왔다.

 

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

 

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

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

 

Linking Loader : 프로그램을 로드하는 동시에 링크까지 수행한다. 링크란, 외부 정의(함수 정의)를 로드할 위치가 정해졌다면, 외부 참조(함수 호출)를 이 외부 정의에 링크시키는 작업을 말한다.

 

3) 링커

 

위와 같은 링킹 로더는 대체로 수십에서 수백 개의 바이너리 라이브러리를 읽고 외부 참조를 해석해야 했으므로 속도에 제한이 있었다.

 

따라서 로드와 링크를 두 단계로 분리한다.

 

    - 링커 : 링크 과정을 처리하는 애플리케이션

    - 링커를 사용해서 한번 만들어둔 실행 파일은 언제라도 빠르게 로드할 수 있게 되었다.

 

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

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

 

이렇게 액티브 X와 공유 라이브러리 시대가 열렸고, .jar파일도 등장하기 시작했다. 다수의 .jar 파일 또는 다수의 공유 라이브러리를 순식간에 서로 링크한 후, 링크가 끝난 프로그램을 실행할 수 있게 되었다.

 

이러한 공유 라이브러리를 컴포넌트로 생각할 수 있으며, 컴포넌트 플러그인 아키텍처가 탄생했다.

 

결론

위에서 계속 설명한 컴포넌트는 런타임에 플러그인 형태로 결합할 수 있는 동적 링크파일이라고 생각하면 되겠다.

 

 

 

 

 

 

Comments