Hanpy's Blog

두 글자 이상 입력하세요.

Backend · Core Concepts

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

애플리케이션 내부가 외부의 영향을 최소한으로 받으며 독립적으로 존재할 수 있도록 설계가능한 Hexagonal Architecture에 대해 알아봅시다.

Hanpy약 5분

소프트웨어 개발을 하다 보면 "어떤 아키텍처를 사용해야 코드 유지보수가 쉽고, 변경사항에 강하게 만들 수 있을까?"라는 고민이 들기 마련입니다. 이러한 고민을 해결하기 위해 다양한 아키텍처가 존재하며, 가장 전통적이고 많이 쓰이는 아키텍처 중 하나가 Layered Architecture(레이어드 아키텍처)입니다. 하지만 최근에는 보다 현대적이고 유연한 설계를 위한 아키텍처로 Hexagonal Architecture(헥사고날 아키텍처)가 큰 인기를 끌고 있습니다.

헥사고날 아키텍처는 도메인 중심 설계를 바탕으로 어플리케이션을 구성하는 아키텍처이며, 애플리케이션 내부가 외부의 영향을 최소한으로 받으며 독립적으로 존재할 수 있도록 설계합니다. 이 아키텍처를 깊이 이해하면, 보다 변화에 강하고 유지보수가 용이한 소프트웨어를 설계할 수 있습니다.


헥사고날 아키텍처의 핵심 개념과 원리

헥사고날 아키텍처는 알리스터 콕번(Alistair Cockburn)에 의해 제안된 아키텍처로, 다른 이름으로 Port and Adapter Architecture라고도 불립니다. 이 아키텍처는 중심에 도메인(Domain)을 두고, 이를 둘러싼 애플리케이션(Application), 그리고 외부 환경과의 상호작용을 위한 Port와 Adapter라는 구조로 이루어져 있습니다.

헥사고날 아키텍처가 강조하는 가장 중요한 개념은 바로 독립성과 중심성입니다. 이는 의존성을 항상 외부에서 중심으로 향하게 하여, 도메인이 외부의 영향을 최소화하고 핵심 로직을 유지하는 것이 목표입니다.


핵심 구성 요소: Driving Side와 Driven Side

헥사고날 아키텍처에서는 크게 다음과 같은 구성 요소로 나눌 수 있습니다.

1. Driving Side (운전하는 쪽)

  • 애플리케이션을 실제로 작동시키는 쪽입니다.
  • 사용자의 요청이나 다른 서비스의 호출 등, Application을 구동시키는 역할을 합니다.
  • Driving Side는 Port를 통해 Application에 접근하며, 이를 위해 Adapter를 사용합니다.

2. Driven Side (운전당하는 쪽)

  • Application에 의해 실행되는 외부 시스템입니다. 대표적으로 데이터베이스나 외부 API, 메시징 큐 등이 여기에 해당합니다.
  • Application이 Driven Side를 구동시키는 입장으로, Application이 정의한 Port를 구현하는 Adapter를 Driven Side에서 작성하여 제공하게 됩니다.

Port와 Adapter: 인터페이스 중심 설계의 핵심

헥사고날 아키텍처가 Port and Adapter 아키텍처로 불리는 이유는 바로 Port와 Adapter의 존재 때문입니다.

  • Port는 Application이 외부와 소통하는 일반화된 인터페이스 또는 **스펙(contract)**을 의미합니다. 이는 객체지향 프로그래밍의 interface 개념과 매우 유사하며, Application 내부의 동작 방식을 외부 환경과 무관하게 정의하는 역할을 합니다.
  • Adapter는 Port에 정의된 인터페이스를 실제 구현한 객체로, Driving Side나 Driven Side에서 직접 구현합니다.
    • Driving Side Adapter: 사용자가 애플리케이션에 요청을 보내기 위해 Port 인터페이스를 통해 Application 내부로 들어옵니다.
    • Driven Side Adapter: Application이 외부 시스템을 호출할 때 Port 인터페이스를 통해 실제 구현을 제공합니다.

이렇게 Port를 중심으로 Adapter가 동작함으로써 Application 내부가 외부 환경에 독립적으로 유지되며, 매우 유연하고 변경에 강한 구조를 가질 수 있습니다.


광고

Application과 Domain의 관계

헥사고날 아키텍처의 핵심 중심부에는 도메인 로직이 존재합니다. 이는 시스템이 수행해야 할 핵심 비즈니스 로직을 구현하는 영역입니다. 도메인은 외부 환경에 완벽하게 독립적이어야 합니다.

  • Application Service는 도메인을 조합하고 관리하여 비즈니스 로직을 종합적으로 실행하는 역할을 합니다.
  • Application Service는 Port를 통해 외부 환경과 소통하며, 이로 인해 도메인은 철저하게 보호되고 격리됩니다.

레이어드 아키텍처에서는 보통 Presentation Layer가 하위 Persistence Layer에 의존하는 방향을 갖지만, 헥사고날 아키텍처에서는 의존성 방향이 언제나 중심인 도메인을 향해 있습니다. 따라서 모든 외부 환경은 Application 내부의 도메인에 접근하기 위해 Application이 정의한 Port를 사용해야 합니다.


Adapter 구현 위치의 정리

Adapter를 어디에 구현해야 할지 정리하면 다음과 같습니다:

  • Driving Side Adapter: Application을 호출하고 구동시키기 위한 Adapter로, Application 외부(예: REST 컨트롤러, 클라이언트 등)에 구현됩니다.
  • Driven Side Adapter: Application이 호출하는 외부 시스템에 대한 Adapter로, Application 외부의 데이터베이스 접근이나 API 클라이언트 등에 구현됩니다. Application 내부에서 직접 외부 시스템 호출 로직을 구현하지 않고, Adapter를 통해서만 접근합니다.

정리

헥사고날 아키텍처는 다음과 같이 정리할 수 있습니다:

  • 도메인이 중심에 위치하며, 외부 시스템의 영향을 최소화합니다.
  • 외부와의 상호작용은 Port(interface)를 통해 일반화된 규약으로 명확히 정의됩니다.
  • Adapter는 Port를 구현하여, 외부 시스템과 Application 간 소통을 담당합니다.
  • Driving Side는 Application을 호출하는 쪽, Driven Side는 Application에 의해 호출당하는 쪽으로 명확히 역할이 분리됩니다.
  • 모든 의존성은 Application 중심(도메인) 방향으로 이루어져 외부 의존성을 최소화합니다.

이를 통해 소프트웨어가 변경사항에 유연하게 대응하며, 유지보수성이 뛰어난 구조로 진화하게 됩니다. 헥사고날 아키텍처는 명확한 의존성 관리와 도메인 중심 설계를 통해 소프트웨어 개발에서 가장 큰 골칫거리인 유지보수 문제를 효과적으로 해결할 수 있는 구조를 제공합니다.


참고