Java

Hexagonal Architecture이란? 기본 개발 방법 (Adapter, Port, Service)

15호의 개발자 2022. 6. 8. 12:00
반응형

Hexagonal Architecture이란? 기본 개발 방법 (Adapter, Port, Service)

 

 


 

 

Layered Architecture vs Hexagonal Architecture

 

 

Layered Architecture(계층화 아키텍처, 레이어드 아키텍처)를 적용해서 어플리케이션을 만들 때는 비즈니스 로직, 유효성(valudation) 체크, DB 접근 등의 로직이 Controller나 Service 단에 몰아서 작성되는 경우가 많다. 코드를 한 곳에 몰아서 작성하면 코드 길이가 길어짐에 따라 유지보수나 리팩토링이 어려워지므로 이런 방식은 지양해야 한다.

 

이를 개선하기 위해 Hexagonal Architecture(헥사고날 아키텍처, 육각형 아키텍처)를 적용하는 방법이 있다. Hexagonal Architecture 방식을 적용하면 프로그램 소스 간 의존성과 결합도를 느슨하게 할 수 있고, 같은 종류의 프로그램 소스 간에는 응집도를 높일 수 있다. 결론적으로 유지보수나 리팩토링도 쉬우며 확장성에도 용이하다. 이는 어플리케이션 외부 기술과 실제 비즈니스 로직의 분리를 통해 이루어진다.

 

 


 

Hexagonal Architecture란?

 

 

핵사고날 아키텍처는 Hexagonal이라는 말에서도 알 수 있듯이 육각형 구조로 이루어진다. 이는 가상적인 의미이긴 하지만 Hexagonal Architecture를 이해하는 데에 큰 도움이 된다.

 

hexagonal architecture 기본 구조

 

핵사고널 아키텍처의 기본 구조는 위와 같다. 어플리케이션 로직이 중심에 위치해있고, Port를 통해 Controller나 Adapter에 접근할 수 있다. 외부에서 들어오거나 나가는 요청을 Adapter에서 처리하며, Adapter와 Service(비지니스 로직)에 접근할 때는 Port를 통한다. Port와 Adapter는 헥사고날 아키텍처에서 중요한 역할을 하므로 Hexagonal Architecture를 Port & Adapter Architecture라고 부르기도 한다.

 

 

 

 

각 영역에 대한 세부 설명

 

1. Adapter (어댑터)

 

크게 inbound(외부에서 내부로 들어오는 요청), outbound(내부에서 외부로 나가는 요청)로 나눌 수 있으며, In Adapter와 Out Adapter로 부른다. 패키지 구분시 도메인별로 내부 패키지를 분리하고, 같은 성격의 업무는 같은 패키지로 묶는다.

 

이때 Out Adapter를 Persistence Adapter라고 부르기도 하는데, 이는 DB(Database)와 붙어 있는 어댑터를 의미한다. persistence 패키지는 entity나 persistence adapter, mapper 등을 포함한다.

 

 

(세부 설명)

  • entity(엔티티)
    • DB의 테이블과 1:1로 매핑되는 entity이며, 데이터 등록이나 조회 등에 사용된다. CRUD 호출시, 파라미터(VO)를 entity로 변환한 후 조회된 entity를 리턴값(VO)으로 변환해서 처리한다.
  • Persistence Adapter
    • Out Port의 구현체로, Service단에서 데이터베이스에 접근하기 위해 필요하다.
  • Mapper
    • 실제 DB에 접근하는 파일로, DAO 성격을 가진다.

 

 

2. Port (포트)

 

Port는 인터페이스(I/F)이다. 포트도 어댑터와 같이 성격에 따라 In Port와 Out Port로 구분한다.

 

In Port는 외부에서 Adapter를 통해 들어온 요청을 처리하기 위해 비즈니스 로직(즉, Service)에 접근하기 위한 기능이 명세되어있는 interface이다.

 

Out Port는 내부에서 외부의 기술이나 서비스를 사용하기 위한 기능이 명세되어있는 interface이다. Persistence Adapter와 붙어있어서 DB 데이터를 조회하는 등에 사용한다.

 

 

3. Service (서비스)

 

Service는 외부에서 들어온 요청의 처리를 위해 In Port 인터페이스를 구현한 클래스이다. 주요 비즈니스 로직이 담겨있다.

 

 

 


 

Hexagonal Architecture 기본 개발 방법

 

 

 

헥사고널은 여러 개의 육각형을 연결시켜서 사용할 때 비로소 그 장점이 극대화된다. 두 어플리케이션 로직을 연결하여 사용하는 경우를 예로 들면 위와 같다.

 

왼쪽 서비스에서 오른쪽 서비스로 연결되는 부분은, 왼쪽의 Out Adapter와 오른쪽의 In Controller(Adapter) 부분이다. Rest API를 이용하는 경우라면 식별하기 쉽게 Out Adapter를 Rest Adapter라고 칭하기도 한다.

 

 

 

 

 

헥사고날 아키텍처로 비즈니스 수준의 어플리케이션을 설계할 때는 위와 같이 복잡해질 것이다. 육각형의 6면에 다른 육각형들을 이어 붙이고, 그 육각형에도 또 다른 육각형들을 이어나가면서 설계하면 된다. 

 

 

 

 

헥사고날 아키텍처 방식을 적용해 개발할 때는,

비지니스 로직이 담긴 service에서 인프라 영역인 adapter로 접근할 수는 있지만, 그 반대인 adapter에서 service로 접근하는 건 불가능하게 개발해야 한다. 또한 Service와 Adapter에 접근할 때는 반드시 Port와 Adapter를 통해서만 접근하도록 만들어야 한다.

 

이렇게 개발해야만 Hexagonal Architecture의 장점을 극대화할 수 있다. 예를 들어 DB가 변경되는 등 외부 기술적인 부분이 변경되는 경우, 비즈니스 로직의 수정을 최소화하고 Adapter와 Port만 수정함으로써 대응이 가능해진다. 이것이 바로 Hexagonal Architecture를 사용하는 가장 큰 장점이다.

 

 

 

반응형