개요
레이어간의 원치 않는 종속성을 제거하고, 도메인 계층에서 비즈니스 로직에 온전히 집중할 수 있게하여 UI(User Interface)계층에서 비즈니스 로직을 가지지 않도록 구성하는것을 추구하는 아키텍처로 의존성 제어흐름의 제어를 포트와 어댑터 계층으로 나눠 분리하기에 포트 & 어댑터 아키텍처라고도 불리운다.
장단점
장점
•
아키텍처 확장에 용이하다.
•
SOLID 원칙을 쉽게 적용할 수 있다.
•
모듈 일부를 배포하는데 용이하다.
•
테스트를 위해 모듈을 모킹하는게 쉽기에 테스트 주도 개발을 하기 편하다.
•
비즈니스 로직은 오로지 도메인 로직만 보면되기에 디버깅이 편해진다.
단점
•
가벼운 기능을 위해서도 구현되야 하는 계층이 최소 포트와 어댑터 두 계층이 나눠지기에 비용이 발생할 수 있다.
•
스프링 부트 환경에서 IOC 컨테이너가 관리할 스프링 빈을 등록하는데 있어서 하나의 포트에 해당하는 구현체가 여럿일 경우 Config 계층을 통한 관리가 피룡해져서 도입하는 난이도가 올라간다.
아키텍처 구성
헥사고날 아키텍처의 구성
내부(도메인)와 외부(인프라)
•
도메인 영역은 내부 영역으로 비즈니스 로직을 캡슐화한 영역으로 기능적 요구사항에 의해 먼저 설계된다.
•
내부 영역을 제외한 영역들을 외부 영역이라 하며 내부 영역 설계 이후 설계한다.
포트와 어댑터
포트
: 내부 영역을 외부에 노출하는 공개된 API로 외부에서 호출하는 인바운드(Inbound)포트와, 내부 영역에 외부 영역을 사용하기 위해 호출하는 API로 아웃바운드(Outbound) 포트가 있다.
어댑터
: 외부 애플리케이션이나 서비스와 내부 비즈니스 영역(인바운드 포트)간에 데이터 교환을 위해 존재하는 인바운드 어댑터와, 내부 비즈니스 영역(아웃바운드 포트)와 외부 애플리케이션/ 서비스간에 데이터 교환을 위해 존재하는 아웃바운드 어댑터가 있다.
포트와 어댑터로 인해 변경되는 제어의 흐름
헥사고날 아키텍처의 의존성의 흐름
인바운드와 아웃바운드 포트로 인해 비즈니스 로직이 외부로 의존성이 흐르지 않는다. 모든 의존성을 코어를 향한다.
패키지 구조(예제)
com.midas.rpm
├── RpmApplication.java
├── RpmConfiguration.java
├── RpmConfigurationProperties.java
├── rpm
│ ├── adapter
│ │ ├── in
│ │ │ └── web
│ │ └── out
│ │ └── persistence
│ ├── application
│ │ ├── port
│ │ │ ├── in
│ │ │ └── out
│ │ └── service
│ └── domain
└── common
Plain Text
복사
참고
•
만들면서 배우는 클린 아키텍처
•
헥사고날 아키텍처(Mesh Korea)
•
Hexagonal Architecture (헥사고날 아키텍처) 패키지와 간단 구조