헥사고날 아키텍처란
- Hexagonal은 사전적 의미로 '육각형 건축물’을 의미한다.
- 소프트웨어 설계에 사용되는 아키텍처 패턴중 하나로 여러 소프트웨어 환경에 쉽게 연결할 수 있도록, MSA와 같이 느슨하게 결합된 애플리케이션 구성요소를 만드는 것을 목표로 하는 아키텍처이다.
- 도메인의 비즈니스 로직을 외부 라이브러리 및 툴로부터 분리 할 때 포트와 어댑터로 사용하기 때문에 포트&어댑터 아키텍처라고도 부른다.
(막상 6각형 네이밍보다는 포트&어댑터 아키텍처가 조금 더 맞는 표현이라 생각한다.)
헥사고날 핵심
도메인 비즈니스 로직이 외부요소에 의존하지 않게 만들고, 프레젠테이션 계층(controller)과 데이터 소스 계층(persistence) 같은 외부 요소들이 도메인 계층에 의존하도록 한다.
비즈니스 로직(코어)가 외부와 인터페이스로 소통하여 외부 코드나 로직의 주입을 막는 것, 즉 외부 라이브러리 및 툴로부터 분리시키는 것이 헥사고날의 핵심이다.
핵사고날 구성
- 구글에 헥사고날을 검색하면 대표적으로 아래와 같은 그림이 나온다.
- 헥사고날 아키텍처는 내부 코어 영역(도메인)과 외부(인프라)로 구분된다.
- 내부 영역은 순수한 비즈니스 로직을 표현하며 캡슐화 된 영역이고 기능적 요구사항에 따라 먼저 설계한다.
- 외부 영역은 내부 영역에서 기술을 분리하여 구성한 영역이고 내부 영역 설계 이후 설계한다.
포트와 어댑터
포트
- 포트는 애플리케이션 입장에서 클라이언트, 또는 애플리케이션의 end-point라고 볼 수 있다.
- 포트는 내부 비즈니스 영역을 외부 영역에 노출한 API이고 인바운드 / 아웃바운드 포트로 구분한다.
- 인바운드 포트는 내부 영역 사용을 위해 노출된 API 이고, 아웃바운드 포트는 내부 영역이 외부 영역을 사용하기 위한 API 이다.
어댑터
어댑터는 인프라나 Web과 같은 저수준 layer들이 도메인 로직에 접근할 수 있는 포트를 사용할 수 있도록 한다.
- Primary(Driving) 어댑터 - 어댑터와, 애플리케이션을 동작시키는 역할을 한다.
(주로 UI쪽이 들어가고 인바운드 포트를 사용한다.) - Secondary(Driven) 어댑터 - 어댑터와, 애플리케이션에 의해 동작되는 역할을 가진 부분이다. 주로 인프라와 연결되는 부분이 들어간다.
간단정리
Primary(Driving) 어댑터에 의해(Driven) Secondary 어댑터가 호출된다.
헥사고날 장점
1. SOLID 원칙을 쉽게 적용
2. 도메인 비즈니스 모델에 집중
- DIP를 통해 의존성이 도메인에서 밖으로 나가는 부분이 없으므로 외부 요소를 신경쓰며 개발 할 필요가 없다.
3. 모듈 일부를 배포하는 게 용이
- 기술과 실제 비즈니스 로직의 분리, 각 도메인 별 비즈니스 로직 분리를 통해 느슨한 결합을 가져간다.
4. 아키텍처 및 기능 확장이 용이
- 원하는 기능에 대한 포트와 해당 포트를 사용할 어댑터를 추가해주면 된다.
5.쉬운 테스트 구성
- 모든 외부 기술들은 포트를 통해 비즈니스 로직과 연결되기 때문에, 본인의 역할을 수행하기 위해 필요한 Port만 사용하여 모킹어댑터를 통해 테스트를 쉽게 수행 할 수있다. 또한 내부 비즈니스 로직을 테스트할 때 외부에 의존성이 없기 때문에 모킹 필요성이 적어진다.
6. 개발 비용감소
- 모든 의존성이 도메인을 향하기 때문에 계층간 의존성이 낮아지고 유연해지기 때문에 요구사항에 빠르게 대처할 수 있고, 테스트도 쉽게 적용가능하다.
7. SoC(관심사 분리)
- 외부와의 연결에 문제가 생기면 어댑터를 확인하면 되고, 인터페이스의 정의를 변경하고자 한다면 Port를, 마지막으로 비즈니스 로직이 제데로 동작하지 않는다면 도메인 로직만 확인하면 되기 떄문에 결국 쉬운 테스트를 가능하게 해주기도 한다.
헥사고날 단점
코드량이 많아진다.
- 도메인 계층이 영속성, UI같은 외부 계층과 철저히 분리되어야 하기 때문에 엔티티에 대한 모델을 각 계층에서 유지보수 해야한다.
(ORM 프레임워크는 DB 구조 및 객체 필드와 컬럼의 매핑을 서술한 메타데이터를 담고 있는 엔티티 클래스를 필요로 한다. 하지만 도메인 계층은 영속성 계층을 모르기 때문에, 두 계층에서 각각 엔티티를 만들어주어야 하고 도메인 계층과 영속성 계층이 데이터를 주고 받을 때, 두 엔티티를 서로 매핑하는 과정이 생기게 된다.)
불 필요한 오버헤드
- 아키텍처를 도입하기 전 포트, 어댑터 등 알아야할 개념이 생기고, 아키텍처를 구현하기 위해서 포트(인터페이스)를 생성해야 하고 도메인 모델의 여러 표현 사이를 매핑할 객체를 만들어야 한다.
정리하며
- 다음 블로깅은 MSA와 헥사고날을 적용하여 프로젝트를 진행한것을 가져와 회고록을 다시 정리할 예정이다.
참고자료
https://cantcoding.tistory.com/107
https://haandol.github.io/2022/02/13/demystifying-hexgagonal-architecture.html
https://herbertograca.com/2017/09/14/ports-adapters-architecture/#implementation-and-technology-isolation
https://mesh.dev/20210910-dev-notes-007-hexagonal-architecture/
'CS > 디자인패턴&아키텍쳐' 카테고리의 다른 글
테스트 주도 개발(TDD)란? (1) | 2023.11.13 |
---|---|
MSA(MicroService Architecture)에 대해서 (2) | 2023.10.28 |