본문 바로가기

삽질

헥사고날 아키텍처

헥사고날 아키텍처란?

헥사고날 아키텍처는 응용 프로그램의 비즈니스 로직을 외부 세계로 부터 격리시켜 객체지향원칙을 잘 지키게 하는 아키텍처입니다.

대중적으로 많이 사용하는 3계층 아키텍처에 비해 더욱 유연하고 테스트하기 쉬워진다는 장점이 있습니다.

 

이 헥사고날 아키텍처를 만들기 위해 핵심 로직은 중앙 도메인 영역에 위치하며, 입력과 출력을 처리하는 포트어댑터를 통해 외부와 소통합니다.

이러한 특징으로 포트 및 어댑터 아키텍처라고도 불립니다.

출처 :  https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKyq5u%2FbtrvwKfcB3K%2F8WE58ESDnRzkfPuWBm2w00%2Fimg.png

 

 

이 헥사고날 아키텍처의 핵심은 내부 영역외부 영역을 분리 하는 것 입니다.

내부 영역

💡 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등은 제외했습니다.