개린이 탈출기

[아키텍처] 헥사고날 아키텍처 (Hexagonal Architecture/ Port&Adapter Architecture) 본문

아키텍처-방법론

[아키텍처] 헥사고날 아키텍처 (Hexagonal Architecture/ Port&Adapter Architecture)

yooverd 2025. 3. 21. 18:49
728x90
반응형
SMALL

개요

헥사고날 아키텍처는 여러 소프트웨어 환경에 쉽게 연결할 수 있도록 애플리케이션의 핵심 비즈니스 로직을 외부로부터 분리시켜 외부 시스템과의 의존성을 최소화하여 독립성유연성을 높이는 거싱 목표이다.

헥사고날 아키텍처는 Port&Adapter Architecture 라고도 불리는데, Port 와 Adapter 인터페이스를 활용하여 애플리케이션을 외부 라이브러리나 툴과 분리시키기 때문이다.

 

헥사고날 아키텍처의 특징

내부영역(application)과 외부영역(infrastructure)을 명확히 분리한다는 것이 헥사고날 아키텍처의 가장 큰 특징이다.

  • 내부영역 : 순수한 비즈니스 로직을 표현한 캡슐화된 영역으로 기능적 요구사항에 따라 먼저 설계
  • 외부영역 : 내부 영역에서 기술을 분리하여 구성한 영역으로 내부 영역 설계 이후 설계

이러한 분리를 통해 다음과 같은 부가효과가 발생한다.

  • 도메인 비즈니스 모델에 집중한 개발
  • 원하는 기능 확장에 용이 (해당 기능에 대한 포트/어댑터 추가하면 됨)
  • 쉬운 테스트 구성
    • 모든 외부 기술들은 포트를 통해 비즈니스 로직과 연결되기 때문에, 본인의 역할을 수행하기 위한 Port만 사용하여 모킹어댑터를 통해 테스트를 쉽게 수행할 수 있음. 또한 내부 비즈니스 로직을 테스트할 때 외부에 의존성이 없기 대문에 모킹 필요성이 적어짐
    • 관심사 분리로 인해 코드 수정 시, 해당 계층만 확인하면 됨 (ex. 외부 연결 문제 -> Adater 확인, 인터페이스 정의 변경 -> Port 확인, 비즈니스 로직 동작 문제 -> Domain/Business Logic 확인)
  • 많아지는 코드
    • 계층 분리만을 위한 인터페이스, 매핑 객체 등이 늘어나며 코드가 늘어남

 

헥사고날 아키텍처 주요 구성요소

(출처 : https://mesh.dev/20210910-dev-notes-007-hexagonal-architecture/ )

 

내가 생각하는 헥사고날 아키텍처의 주요 구성요소 중 Port, Adapter, Domain, BusinessLogic 에 대해 조금 더 설명을 덧붙여보겠다.

 

Port

외부-내부 간 접근을 위한 명세를 제공하는 인터페이스 계층이다.

외부에서 내부로 flow가 흐르면 Input Port 를, 내부에서 외부로 flow가 흐르면 Output Port 를 사용한다.

 

 

Adapter

Port를 통해 인프라와 실제로 연결하는 부분을 담당하는 계층이다.

 

Driving Adapter (=Primary Adapter)

사용자의 요청을 받아들일 때 사용되는 Adapter 로 WebApplication 의 Controller 등을 예시로 들 수 있다.

Input Port 에 application 계층의 구현체 (ex UseCase 구현체)가 주입됨 https://curiousjinan.tistory.com/entry/spring-hexagonal-architecture

 

Driven Adapter (=Secondary Adapter)

도메인 모델의 처리에 사용되는 Adapter 로, Persistence Adapter 등을 예시로 들 수 있다.

Output Port 에 외부시스템 구현체 (ex UseCase 구현체)가 주입됨 https://curiousjinan.tistory.com/entry/spring-hexagonal-architecture

 

Domain

application 계층의 Domain 개체는 바깥으로 향하는 어떤 의존성도 없이 순수한 자바객체(POJO)이다.

(예외적으로 Database의 데이터를 이용하여 Entity를 만드는 경우 의존성이 생기는 경우도 있어 Entity와 Value Object도 도메인 계층에 포함된다.)

 

Business Logic

도메인 로직과 객체, 외부 의존성 간의 상호작용을 조정하고 여러 작업을 조합하여 최종 결과를 만들어내는 작업이 이루어지는 계층이다.

 

 

위의 글들만 보고 이해가 잘 되지 않아서 나름대로 그림을 그려보았는데,

나중에 내가 보기 위해 함께 첨부해놓는다.

만일 보고 더 헷갈린다면 그냥 이 그림은 잊어버리길 추천한다.

더보기

 

- (서비스 관련 외부요청 발생)Driving Adapter 가 Service Port (InputPort)사용 → 해당 Service 구현체가 주입되어 사용됨 → usecase 로직 시작!

 

- (DB 관련 내부요청 발생) 해당 usecase클래스(?)가 Repository Port (OutputPort) 사용 → DB에 맞는 Driven Adapter가 주입되어 사용됨 → DB 연결!

 

 

헥사고날 아키텍처(=포트&어댑터 아키텍처)를 채택하고나면 도메인의 영역이 외부와 확실하게 분리되므로 개발 시 도메인 영역에 집중할 수 있어 보인다. 그래서인지 종종 헥사고날 아키텍처와 함께 DDD 설계가 함께 언급되곤 한다.

만일 나중에 DDD 방법론으로 프로그램을 설계한다면 헥사고날 아키텍처를 고려해볼 것 같다.

 

 

 

참고

https://reflectoring.io/spring-hexagonal/

https://cantcoding.tistory.com/107

https://ivory-room.tistory.com/91

 

728x90
반응형
LIST