헥사고날 아키텍처란?
헥사고날 아키텍처는 응용 프로그램의 비즈니스 로직을 외부 세계로 부터 격리시켜 객체지향원칙을 잘 지키게 하는 아키텍처입니다.
대중적으로 많이 사용하는 3계층 아키텍처에 비해 더욱 유연하고 테스트하기 쉬워진다는 장점이 있습니다.
이 헥사고날 아키텍처를 만들기 위해 핵심 로직은 중앙 도메인 영역에 위치하며, 입력과 출력을 처리하는 포트와 어댑터를 통해 외부와 소통합니다.
이러한 특징으로 포트 및 어댑터 아키텍처라고도 불립니다.
이 헥사고날 아키텍처의 핵심은 내부 영역과 외부 영역을 분리 하는 것 입니다.
내부 영역
💡 Domain Model Layer 및 Application Layer
위 그림에서 회색 부분이 내부 영역입니다.
Domain Model Layer는 DomainModel이 포함되는 계층입니다. 도메인 로직이 수행됩니다.
Application Layer는 UseCase와 Port가 포함되는 계층입니다. UseCase로 비즈니스 로직을 수행 하면서 특정 도메인 로직이 수행될 수 있도록 합니다. Port로는 내부 영역을 사용할 수 있게 하는 인바운드 포트와 외부 기술을 쓸 수 있게 하는 아웃바운드 포트로 구분할 수 있습니다.
추가로, 이 내부 영역의 경계를 바운디드 컨텍스트라고 합니다.
외부 영역
💡 Infrastructure Layer
회색 바깥 영역이 외부 영역입니다.
Infrastructure Layer는 Adapter와 WEB이나 DB와 같은 외부 기술이 포함되는 계층입니다.
위처럼 계층을 나누어 내부와 외부를 분리해 헥사고날 아키텍처가 가지는 장점을 가질 수 있는 것입니다.
헥사고날 아키텍처의 장단점
장점
- 도메인 비즈니스 모델에 집중
- 의존성이 안으로 들어오기 때문에 외부의 변화로 내부가 영향받지 않습니다.
- 모듈 일부 배포 용이
- 느슨한 결합으로 도메인별로 모듈을 분리할 수 있습니다.
- 기능 확장 용이
- 포트와 어댑터를 추가하면 기능 확장이 가능합니다.
- 쉬운 테스트 구성
- ISP를 지키기 때문에 모킹이 쉬워집니다.
- 유지보수 용의
- 도메인, 유스케이스, 포트, 어댑터로 분리되어 있으므로 유지보수하기 쉬워집니다.
단점
- 초기 개발 비용 증가
- 각각을 분리해야되기 때문에 초기 구조를 만들어가는 과정에 비용이 소요됩니다.
- 매핑 필요
- 유스케이스, 어댑터 등 서로 사용하는 클래스가 다릅니다. 이 다른 클래스를 매핑하는 작업이 필요합니다.
프로젝트 구조 예시
아래 구조는 제가 헥사고날 아키텍처를 만든다면 사용할 폴더 구조입니다. 참고하시면 됩니다.
project
├─adapter
│ ├─in
│ │ └─web
│ │ └─ProjectController.java
│ └─out
│ ├─entity
│ │ └─ProjectJpaEntity.java
│ ├─repository
│ │ └─ProjectJpaRepository.java
│ └─ProjectAdapter.java
│
├─application
│ ├─port
│ │ ├─in
│ │ │ └─ProjectUseCase.java
│ │ └─out
│ │ └─ProjectPort.java
│ └─service
│ └─ProjectService.java
└─domain
└─Project.java
💡 이해를 돕기 위해 dto나 mapper등은 제외했습니다.
'삽질' 카테고리의 다른 글
HttpUrlConnection, RestTemplate, WebClient의 특징과 장단점 (0) | 2023.12.31 |
---|---|
오픈소소는 공짜가 아니다. (0) | 2023.11.29 |
클라우드 네이티브란? (0) | 2023.11.27 |
REST API와 HTTP Header (0) | 2023.10.31 |
Mybatis selectKey 사용 방법 (0) | 2023.10.26 |