본문 바로가기
IT정보&정보처리기사

마이크로서비스의 레이어 아키텍처

by Technocrat 2024. 3. 6.

소프트웨어 설계에서 컴포넌트나 기능을 관리하기 위해 레이어 아키텍처를 사용한다. 레이어 즉 계층은 기준에 의거하여 이루어지는데 이러한 계층구조를 따라 소프트웨어 컴포넌트나 기능을 분류, 관리하는 접근법이 레이어 아키텍처이다.
마이크로서비스도 레이어 아키텍처를 적용 할 수 있는데, 도메인주도 4계층을 적용해 보면 아래와 같이 된다.
 
사용자 인터페이스 계층 ---- 렌더링, 요청 접수, 응답 전송, 데이터 변환
애플리케이션 계층 ----------- 트랜젝션 처리, 애플리케이션 조율, 도메인 객체 접근
도메인 계층 -------------------- 도메인 상태와 동작(비즈니스 로직 구현)
인프라 계층 -------------------- 외부 리소스의 다른 계층 접근 지원(데이터연동, 메시징 접근)
 
레이어 아키텍처는 이해하기 쉽고 기능 분할이나 구조화를 진행하기 쉬워 소프트웨어 컴포넌트를 조합해서 개발하는 설계 방식에 적합하다. 다만 확장성이 부족한데 추상적인 것이 구체적인 것에 의존하는 관계가 이루어진다. (소프트웨어 컴포넌트가 인프라 구현에 의존) 따라서 인프라(통신 프로토콜, 데이터베이스)가 변경되면 애플리케이션에 영향을 끼쳐 프로그램을 수정해야 하는 경우가 생길 수 있다. 프로그램 변경 없이 인프라만 수정되기 어려운 구조가 된다.
이런 결점을 보완하기 위해 제어 반전(Inversion of Control, IoC)라는 개념이 도입되었다.
예를 들면 애플리케이션 프로그램이 통신 프로토콜에 의존하는 구조를 가질 때 IoC를 적용하면 애플리케이션 프로그램이 통신 프로토콜에 의존하지 않고 통신 프로토콜 구현을 호출하는 형태를 취한다.(콜백이나 의존성 주입을 이용)
의존성 주입(Dependency Injection, DI)은 객체지향에서 널리 사용되는데 Spring도 DI컨테이너로 시작되었다.
이처럼 IoC를 도입해서 제어 반전을 적용한 아키텍처가 헥사거널 아키텍처이다. 
 

 
헥사거널(Hexagonal)은 육각형을 뜻한다. 이는 불특정 데이터 입출력에 대응할 수 있도록 확장성을 갖는 것이 특징이다. 
중심에는 도메인(비즈니스 로직)이 있고 주변에는 그 도메인을 호출하는 입력측과 도메인에 의해 실행되는 출력측이 구성되어 있다. 이러한 입출력은 포트와 어댑터를 통해 연계된다. 어댑터는(Adaptor) 외부 기능과 상호작용을 하며 외부 기능 단위로 교체될 수 있다. 이를테면 REST용 어댑터나 데이터베이스용 어댑터 등을 개별적으로 구현하고 제공할 수 있다. 
추상화된 프로그래밍 인터페이스를 도메인에 제공하는 것이 포트다(Port). 포트를 통해 외부 기능에 접근하는 코드를 도메인 내에 구현하면 외부 기능을 변경해도 도메인이 영향을 받지 않는다. 포트와 어댑터를 이용하여 외부 기능에 의존하지 않는 비즈니스 로직(도메인)을 설계 및 구현 할 수 있기 때문에 외부 기능을 쉽게 교체할 수 있다.
아래 그림처럼 레이어 구조와 헥사거널 구조를 결합하여 마이크로서비스 아키텍처에 적용하면 사용자 인터페이스 계층과 인프라 계층의 드라이버들이 헥사거널의 포트, 어댑터에 배치된다.