이번 포스팅은 헥사고날 아키텍쳐에 대해서 알아볼 예정이며 필자의 경우 해당 아키텍쳐에 대해서 지식을 습득한 이후 토이 프로젝트에 적용 해볼 생각이다.

헥사고날 아키텍처란?
헥사고날 아키텍쳐는 응용 프로그램의 비지니스 로직을 외부 세계로부터 격리시켜 유여한고 테스트가 쉬운 구조를 만드는 것입니다.
이를 위해 핵심 비지니스 로직은 중앙의 도메인 영역에 위치하며, 입력과 출력을 처리하는 포트와 어댑터를 통해 외부와 소틍을 합니다.
해당 아키텍쳐의 핵심은 도메인과 비지니스 로직을 외부 요소에 의존하지 않고, 프레젠테이션 계층, 데이터 소스 계층 같은 외부 요소들이 도메인에 의존하도록 만듭니다.
위의 내용으로 프로그래머는 아래와 같은 효과를 볼 수 있습니다.
- 관심사의 분리를 통하여 외부 요소에 영향을 받지 않고 비지니스에 집중할수있습니다.
- 도메인과 비지니스 모델을 중심에 두어 응집도를 높이며 코어 중심 설계가 가능합니다.
- 포트와 어댑터를 이용하여 느슨한 결합을 유지함으로써 유연성과 테스트에 용이하며, 서비스 확장을 위한 유지보수에 효과적입니다.
아래 그래프를 보면 기존 레거시에 스파게티 소스가 출시 이후 어떠한 문제를 발생시키는지 볼 수 있습니다. (필자는 몸소 경험을 진행하고있습니다..)

시간에 지남에 따라 코드에 대한 의존성이 높아지게 되며 그에 따르는 전반적인 생산성과 비용이 악화 될 수 있습니다.헥사고날 아키텍쳐는 이러한 의존성에 대한 부분을 철저하게 분리함으로써 서비스 확장, 개발 능률, 품질 향상 등에 효과를 기대할 수 있으며, 대규모 프로젝트에 적용하기 적합하다고 기대할 수 있습니다.
헥사고날 아키텍쳐의 단점
- 포트와 어댑터를 구성함으로 구현의 복잡성이 올라가게 됩니다.
- 아키텍쳐를 처음에 구축하는데 시간과 노력이 소모되며 초반에 개발 시간이 증가가 됩니다.
용어 정리
헥사고날 아키텍처의 포트와 어댑터는 중요한 개념이며 이를 잘 알고 숙지하는것이 중요합니다.
Port (포트)
어플리케이션 관점에서는 in/out이 되는 엔드포인트로 볼수 있으며, 내부 도메인을 외부로 부터 노출한 API로 인바운드/아웃바운드로 구분을 할수있다.
- 인바운드 포트 : 내부 영역을 사용하기 위해 노출된 API
- 아웃바운드 포트 - 내부 영역이 외부 영역을 사용하기 위한 API
내/외부의 의존성을 담당하고 있는 인터페이스입니다.
Adapter (어댑터)
외부의 요소와 같은 저수준 레이어가 도메인 로직에 접근하기 위하여 포트를 사용할 수 있게 하며, 실제로 연결하는 구현체로 볼수 있습니다.
Primary Adapters (프라이머리 어댑터)
외부 요소로부터 중심 도메인을 동작시키는 역할로써 인바운드 포트를 사용합니다.
Secondary Adapters (세컨더리 어댑터)
중심 도메인으로부터 외부요소를 동작시키는 역할로써 아웃바운드 포트를 사용합니다.
UserCase (유스케이스)
단순한 인터페이스로 외부에서 호출하여 실제 내부 비지니스 도메인 구현체에게 위임하는 역할을 가집니다.
레이어드 아키텍처 (Layered Architecture)

일반적으로 많이 사용되는 레이어드 아키텍쳐 구조입니다.
- 레이어는 계층에 맞는 책임을 가지고 있으며 인접한 레이어와 상호작용 합니다.
- 레이어는 자신의 아래 레이어에 종속됩니다.
- 레이어는 자신의 세부 구현체를 추상화하여 상위 계층에게 제공합니다.
헥사고날 아키텍처와 레이어드 아키텍처의 차이점
레이어드 아키텍처는 자신의 아래 레이어에 종속하게 된다. 이를 확장해서 생각을 하게 되면 결과적으로 가장 상위에 Presentation Layer의 변경은 가장 하위 레이어까지 종속이 연관되어 전체 어플리케이션에 영향을 주게된다.
간단한 구조와 모듈형식으로 나뉘는 레이어 계층의 효과를 볼 수 있으나 지속적인 확장에서는 어려움을 겪을 확률이 높다.
헥사고날 경우는 이러한 종속관계를 역전시켜 내부의 도메인 로직에 외부가 의존할 수 있게하는 의존관계 역전을 가지게 된다. 이로써 기존의 도메인을 안전하게 보호하며 확장에 용이 할 수 있다.
https://tech.osci.kr/hexagonal-architecture/
https://cantcoding.tistory.com/107
'Spring' 카테고리의 다른 글
Spring Boot Batch 적용하기 - 3 (0) | 2024.10.20 |
---|---|
Spring Scope와 ObjectProvider, proxyMode (0) | 2024.10.20 |
Spring Boot Batch 적용하기 - 2 (0) | 2024.09.21 |
Spring Boot Batch 적용하기 - 1 (1) | 2024.09.18 |
Spring Boot + Quartz 적용하기 - 3 (1) | 2024.09.17 |