Hexagonal Architecture - 헥사고날(육각형) 아키텍처
-
각 계층에서 하던 일들을 "내부와 외부"라는 개념으로 나누어 각각에 맞는 별도의 인터페이스를 정의
-
"내부"의 로직은 오직 "외부"를 통해서만 접근 가능
- 모든 외부 시스템과의 직접적인 상호작용은 "어댑터"의 역할
- 각 서비스에서 비즈니스 로직에 맞게 정의된 인터페이스는 "포트"
- 즉, 외부 서비스와의 상호 작용(어답터)는 비즈니스 로직과의 작업을 정의한 인터페이스(포트)랑만 서로 통신
-
모든 비즈니스 로직은, 오직 외부에서 내부 방향 / 내부에서 외부 방향으로만 호출이 가능
- 인바운드 어댑터 -> 인바운드 포트 -> 비즈니스 로직
- 비즈니스 로직 -> 아웃바운드 포트 -> 아웃바운드 어댑터
어댑터와 포트
어댑터 (Adapter)
서비스의 입장에서 이 서비스가 사용하는 외부 시스템과의 직접적인 구현 및 상호 작용을 처리
- 외부 시스템(UI) 으로부터 들어온 Request가 가장 처음 만나는 Controller는 "인바운드 어댑터"
- 메시지 브로커(kafka)로부터 Consume 하는 동작을 처리하는 로직 핸들러는 "인바운드 어댑터"
- DB(MySQL..)에 직접적으로 접근하여 다양한 작업(CRUD)을 처리하기 위한 DAO는 "아웃 바운드 어댑터"
포트(Port)
비즈니스 로직 입장에서 어댑터와 통신하기 위한 동작을 정의한 인터페이스
- Controller 로부터 들어온 요청으로부터 특정 비즈니스 로직을 수행하기 위한 동작을 정의한 인터페이스
- Consume한 메세지를 처리하기 위한 비즈니스 로직의 동작을 정의한 인터페이스
-> "인바운드 포트"
- 비즈니스 로직에서 DB 접근을 위해서 정의한 Repository 인터페이스는 "아웃바운드 포트"

Adapter
를 통해 외부 서비스의 의존성을 분리하여 언제든 쉽게 교체하여 유연한 확장성 있는 대처를 하고, 포트를 통해서 내부 비즈니스 로직과 인터페이스를 분리하여 내부 로직의 구현은 인터페이스와 무관 하게 개발 가능하도록 사용하는 Architecture
이다.