책 <클린아키텍처>의 [Part4 컴포넌트의 원칙]을 참조하여 재가공한 내용입니다.
책의 컴포넌트와 관련된 내용들을 제 입맛에 맞게 많이 빼고 더했습니다. 먼저 컴포넌트의 간략한 역사를 살펴보고, 그 설계 원칙과 관련된 내용들을 컴포넌트 그 내부와 관련된 내용과 컴포넌트간의 관계에 대한 내용으로 구분하여 정리하였습니다.
이 글에서는 먼저 컴포넌트의 정의와 (컴포넌트)플러그인 아키텍처를 간략히 이해하고 플러그인 아키텍처의 기원을 살펴보면서 컴포넌트가 탄생한 배경을 같이 설명하겠습니다.
컴포넌트 정의
컴포넌트는 배포단위다. 컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다.
간단히 생각해서 컴포넌트는 독립적인 배포가 가능한 단위라고 생각할 수 있습니다. 컴포넌트의 구체적인 형태는 컴파일형 언어의 경우 바이너리 파일의 결합체(Java - jar, Ruby - gem, .NET - DLL)이고 인터프리터형 언어의 경우 소스파일의 결합체입니다.
(컴포넌트) 플러그인 아키텍처
컴포넌트라는 단위의 기원을 거슬러 올라가다보면 플러그인 아키텍처가 탄생한 배경과 겹쳐져 있습니다.
책에 플러그인 아키텍처가 명시되어 있으나 사실상 자세한 설명이 없고, 웹 상에서도 직접적으로 플러그인 아키텍처를 설명해주는 글을 찾지 못하여 이클립스의 아키텍처를 살펴보는 것으로 그 내용을 대신합니다.
위 다이어그램은 대표적인 플러그인 아키텍처가 적용된 Eclipse의 개념도입니다.
위 다이어그램에서 보여지는 바와 같이 Eclipse는 그 핵심적인 기능은 Eclipse Platform이라는 하나의 컴포넌트 안에 구현이 되어 있고, 추가 기능들은 새로운 컴포넌트를 전기 코드 꼽 듯이 기존 컴포넌트에 이어 붙이는 형태로 구현할 수 있습니다. 이렇게 새로운 컴포넌트를 추가하는 것을 용이하게 하는 것을 플러그인 아키텍처라고 추정해 볼 수 있습니다.
플러그인 아키텍처의 역사(탄생 배경)
플러그인 아키텍처가 탄생하기 까지 그 설계의 성장 시기를 크게 3가지 시기로 나누어 볼 수 있습니다.
- 소프트웨어 개발 초창기
- 링킹로더의 탄생기
- 컴퓨팅 속도의 성숙기
소프트웨어 개발 초창기
*200
TLS
START, CLA
TAD BUFR
JMS GETSTR
CLA
TAD BUFR
FMS PUTSTR
FMP START
BUFR, 3000
GETSTR, 0
DCA PTR
NXTCH, KSF
(후략...)
위 코드는 (일부 생략되었지만) 키보드로부터 입력을 받아 버퍼에 저장하고, 이를 테스트하는 코드가 포함된 PDP-9 프로그램이라고 합니다. 여기서 주목할 것은 첫 줄에 쓰여 있는 "*200"이라는 코드입니다. 이는 200이라는 메모리 주소에 로드할 코드를 생성하라는 명령이라고 합니다. 이렇듯 소프트웨어 개발 초기에는 해당 소프트웨어가 로드 될 메모리의 주소를 개발자가 직접 입력해야 했습니다.
그리고 외부 라이브러리 함수의 경우 어플리케이션 코드에 포함시켜 컴파일을 시켰는데, 당시 메모리 자원이 비싸고 한정적이였던 특성상 그 라이브러리가 방대할 경우에는 컴파일 시간이 오래 걸렸다고 합니다. 그래서 고안한 방법이 외부 라이브러리와 어플리케이션을 각각 따로 메모리에 로드시키는 방식이었습니다. 예를 들면 아래와 같은 형태입니다.
메모리 주소 0번에 어플리케이션 코드를 로드하고, 메모리 주소 2000번에 외부 라이브러리 코드를 로드하는 형태입니다. 이와 같이 어플리케이션을 구동할 경우 외부 라이브러리를 먼저 로드하고 해당 주소와 관련된 정보를 어플리케이션 코드가 컴파일 되는 순간에 전달하고, 이후 컴파일된 바이너리를 실행하는 순서로 프로그램을 동작시켜야 했다고 합니다.
링킹로더의 탄생기
그런데 여기서 어플리케이션 코드가 추가될 경우 문제가 발생합니다.
어플리케이션 프로그램의 메모리 주소가 위와 같이 분절되기 때문입니다.
이를 해결하기 위해서 로드하는 순간에 메모리주소를 결정할 수 있는 로더가 탄생하게 됩니다. 그러면 어플리케이션 코드가 로드되는 순간에 어플리케이션의 메모리 주소와 외부 라이브러리의 주소를 결정할 수 있게 됩니다. 각각 다른 메모리 영역에 로드되기 때문에 이 둘을 연결(Linking)하는 작업도 이어집니다. 그래서 이 때 사용되는 프로그램을 링킹 로더라고 부르게 됩니다.
이 때부터 프러그래머는 프로그램을 개별적으로 컴파일하고 로드할 수 있게 됩니다. 이렇게 컴포넌트라는 개념이 형성되기 시작합니다.
컴퓨팅 속도의 성숙기
그런데 아직 플러그인 아키텍처에 도달하기 위해서는 한 가지가 남아있습니다. 그 것은 동적링크입니다. 링킹로더가 막 탄생했을 시기(약 1980년대 후반 까지)만 해도 아직 컴퓨팅 자원이 한정적이였을 때이고, 컴파일과 로드, 링크를 처리하는데 꽤 많은 시간이 소요되었습니다. 그러나 무어의 법칙이 등장한 이후 컴퓨팅 속도는 빠르게 증가하였고, 동적으로 프로그램을 로드하고 링크하는 것이 가능할 정도로 컴퓨팅 속도가 성숙하게 되었습니다. 이렇게 탄생하게 된것이 (컴포넌트) 플러그인 아키텍처 입니다.
다음 글에서 컴포넌트 설계 원칙에 대해서 다루도록 하겠습니다.
'IT기술 관련 > Software Architecture' 카테고리의 다른 글
[클린 아키텍처]#4 설계 원칙 - 개요, SRP (0) | 2020.10.25 |
---|---|
[클린 아키텍처]#3 프로그래밍 패러다임 - 함수형 패러다임 (0) | 2020.10.17 |
[클린 아키텍처]#2 프로그래밍 패러다임 - 객체지향 패러다임 (0) | 2020.09.08 |
[클린 아키텍처]#1 프로그래밍 패러다임 - 구조적 패러다임 (0) | 2020.09.06 |
JWT방식의 인증 기능(비공개) (0) | 2019.10.26 |