헥사고날 아키텍처 적용해보기
1. 헥사고날 아키텍처란?
개인 프로젝트를 진행하면서 확장성이 좋고, 유지보수가 편한 패키지 구조에 어떤 게 있을까 알아보다가 헥사고날 아키텍처라는 구조를 알게 되었다.
그래서 이번 포스팅에서는 헥사고날 아키텍처는 어떤 구조를 가지고 있으며 기존 3-Layer 아키텍처에 비해 어떠한 이점이 있는지 정리해보고자 한다.
헥사고날 아키텍처 (Hexagonal Architecture)
헥사고날 아키텍처는 포트 앤 어댑터 (Port and Adapter) 아키텍처라고 불리며, 고수준의 비즈니스 로직을 표현하는 내부(도메인) 영역과 내부 영역에서 기술을 분리하여 구성한 영역인 외부(인프라) 영역으로 구분한다.
포트와 어댑터는 각각 내부 영역과 외부 영역에 존재하는데 내부 영역은 외부 영역과 연계되는 포트를 지니고 있으며, 외부 영역에는 외부에서 들어오는 요청과 외부로 반환하는 응답 또는 데이터 등과 관련된 어댑터가 존재한다.
내부 영역
내부 영역은 순수한 비즈니스 로직을 표현하는 기술 독립적인 영역이며, 외부 영역과 연계되는 포트를 지닌다. 순수한 비즈니스 로직을 표현하므로 내부 영역은 외부 영역에 직접 의존하지 않고 포트를 통해 통신하며, 외부 영역의 어댑터가 내부 영역의 포트에 의해 구현된다.
외부 영역
외부 영역은 인터페이스 구현을 담당하는 저수준 영역이며, 외부에서 들어오는 요청을 처리하거나 외부로 데이터나 응답을 전송하는 어댑터를 지닌다. 외부 영역에서 내부 영역으로 접근하기 위해서는 내부 영역의 포트와 어댑터가 연결되어야 하며 어댑터는 포트에 의존해서 구현된다.
어댑터와 포트
포트는 애플리케이션 입장에서 Consumer, 또는 애플리케이션에서 나가거나 들어오는 End Point라고 볼 수 있다. 포트는 내부 비즈니스 영역을 외부 영역에 노출한 API이고 인바운드 / 아웃바운드 포트로 구분한다.
- 인바운드 포트: 내부 영역 사용을 위해 노출된 API
- 아웃바운드 포트: 내부 영역이 외부 영역을 사용하기 위한 API
어댑터는 인프라나 Web과 같은 저수준 Layer들이 도메인 로직에 접근할 수 있는 포트를 사용할 수 있도록 해준다.
- Primary 어댑터: 애플리케이션을 동작시키는 역할로, 주로 UI 쪽이 들어간다. 인바운드 포트를 사용한다.
- Secondary 어댑터: 주로 인프라와 연결되는 부분이다. 아웃바운드 포트를 사용한다.
헥사고날 아키텍처의 장점
- 도메인 비즈니스 모델에 집중
- DIP로 의존성이 도메인에서 밖으로 나가는 부분이 없으므로 외부 요소를 신경쓰며 개발할 필요가 없기 때문
- 모듈 일부를 배포하는 게 용이
- 기술과 실제 비즈니스 로직의 분리, 각 도메인 별 비즈니스 로직 분리를 통해 느슨한 결합을 가져가기 때문
- 기능 확장이 용이
- 원하는 기능에 대한 포트와 해당 포트를 사용할 어댑터만 추가하면 되기 때문
- 쉬운 테스트 구성
- 모든 외부 기술들은 포트를 통해 비즈니스 로직과 연결되므로 본인의 역할 수행을 위한 포트만 사용하여 모킹 어댑터를 통해 테스트를 쉽게 수행 가능
- 개발 비용의 감소
- 모든 의존성이 도메인을 향하므로 계층 간 의존성이 낮아지고 유연해지기 떄문에 요구사항에 빠르게 대처 가능
- 관심사 분리의 장점
- 외부와의 문제가 발생하면 어댑터를, 인터페이스를 변경하고자 한다면 포트를, 비즈니스 로직이 제대로 동작하지 않는다면 도메인 로직만을 확인하면 되기 때문
헥사고날 아키텍처의 단점
- 코드가 많아짐
- 도메인 계층이 영속성, UI 같은 외부 계층과 철저히 분리되어야 하기 때문에 엔티티에 대한 모델을 각 계층에서 유지보수해줘야 한다.
- 불필요한 오버헤드
- 아키텍처를 도입하기 전에 포트와 어댑터에 대해 알아야 할 개념이 생기고, 아키텍처를 구현하기 위해서는 포트를 생성해야 하며, 도메인 모델의 여러 표현 사이를 매핑할 객체를 생성해야 한다.