포스트

헥사고날 아키텍처 (Hexagonal Architecture)

헥사고날 아키텍처 (Hexagonal Architecture)

헥사고날 아키텍처로 들어가며..

현재, 오토 트레이딩 시스템을 구축하기 위한 계획을 구성하고 있다.

그 중 아키텍처의 문제에서 헥사고날 아키텍처를 선택하기로 했다. 이유는,

Adapter만 교체하면 시스템 모드를 변경할 수 있다. 예를 들면, Upbit REST api를 사용하다가 Kiwoom REST api로 변경하고 그에 맞는 전략도 교체할 수 있다.(확장성)

헥사고날 아키텍처(Hexagonal Architecture)란?

Ports and Adapters Architecture라고도 불르는 아키텍처 패턴이다.

-개념적 목적은

  • 도메인 로직(핵심 로직)을 외부(db, api, ui etc..)로부터 완전히 분리
  • 외부 시스템의 교체 용이
  • 테스트 용이
  • 의존성 방향이 core에 집중

쉽게 얘기하면 “비지니스 로직이 시스템의 중심, 외부 모든 기술은 플러그인처럼 연결된 구조”

헥사고날 아키텍처의 구성

gpt에게 도식화를 부탁하니 훌륭하게 도식화하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ REST API / Scheduler / Worker ]
                │
                ▼
        [ Input Adapter ]
                │
                ▼
         [ Application ]
                │
                ▼
            [ Domain ]
                │
                ▼
          [ Output Port ]
                │
                ▼
         [ Output Adapter ]
                │
                ▼
     [ DB / 거래소 API / Redis ]

여기서 구성요소로 크게 4가지

Domain

시스템의 규칙. 규칙만이 있고 주문이나 service를 직접하지 않고 알지도 못한다.

Application (usecase)

domain에서 정한 규칙에 의해 실제 기능을 수행한다.

Ports

외부 시스템과 연결되는 인터페이스. input과 output이 있다.

Adapters

domain의 규칙에 의해 매수라 정해지고 그걸 application이 주문을 시킴. 그리고 adpaters가 외부 api에 주문 실행.

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
public class OrderController {

    private final PlaceBuyOrderUseCase useCase;

    public OrderController(PlaceBuyOrderUseCase useCase) {
        this.useCase = useCase;
    }

    @PostMapping("/orders/buy")
    public void buy(@RequestBody BuyOrderRequest request) {
        useCase.execute(
                request.market(),
                request.movingAverage(),
                request.orderAmount()
        );
    }
}

여기서 역할 구분이 정확히 보이는데

Controller -> Input Adapter PlaceBuyOrderUseCase = Application Strategy / RiskPolicy / Order = Domain

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.