핵심 인사이트 (3줄 요약)

  1. 본질: 헥사고날 아키텍처 (Hexagonal Architecture)는 알리스테어 콕번(Alistair Cockburn)이 제안한 설계 방식으로, 비즈니스 로직(도메인)을 중심에 두고 외부 시스템(DB, UI, API)을 포트(Port)와 어댑터(Adapter)를 통해 연결하여 도메인을 외부 기술 변화로부터 완전히 격리한다.
  2. 가치: 도메인 코드가 데이터베이스·프레임워크·외부 API에 의존하지 않으므로, 실제 인프라 없이 순수 도메인 로직만 단위 테스트할 수 있으며 인프라 교체 시 어댑터만 교체하면 된다.
  3. 판단 포인트: 포트 앤 어댑터 패턴의 핵심은 "의존성 방향"이다. 인프라(DB, 외부 API)가 도메인에 의존하는 방향이어야 하며, 도메인이 인프라 기술의 클래스나 프레임워크 어노테이션을 import하는 순간 원칙이 깨진다.

Ⅰ. 개요 및 필요성

헥사고날 아키텍처는 2005년 알리스테어 콕번이 "포트 앤 어댑터 (Ports and Adapters)" 패턴으로 처음 소개했다. 육각형(hexagon)이라는 이름은 구조적 의미가 아니라 "도메인 주변에 여러 외부 연결 포인트가 있다"는 시각적 표현이다.

계층형 아키텍처의 가장 큰 문제는 비즈니스 계층이 퍼시스턴스 계층(JPA 어노테이션, SQL 쿼리)에 의존하여 도메인 로직을 단독으로 테스트할 수 없다는 점이다. 헥사고날은 이 의존성을 역전시켜 도메인이 영속성 기술을 전혀 알지 못하게 한다.

┌─────────────────────────────────────────────────────────────┐
│           헥사고날 아키텍처 구조 (개념도)                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [UI Adapter]     [REST API Adapter]     [Test Adapter]   │
│        │                 │                     │           │
│        └─────────────────┴─────────────────────┘           │
│                          │                                  │
│                   [입력 포트 (Inbound Port)]                 │
│                          │                                  │
│              ┌───────────▼───────────┐                     │
│              │     도메인 (Domain)    │                     │
│              │  비즈니스 로직·규칙    │                     │
│              └───────────┬───────────┘                     │
│                          │                                  │
│                  [출력 포트 (Outbound Port)]                 │
│                          │                                  │
│        ┌─────────────────┴─────────────────────┐           │
│        │                 │                     │           │
│  [DB Adapter]   [Kafka Adapter]    [Email Adapter]         │
└─────────────────────────────────────────────────────────────┘

도메인은 포트(인터페이스)만 정의하고, 실제 인프라(DB, 메시지 큐, 이메일 서버)는 어댑터로 구현된다. 도메인 코드에는 Spring, JPA, MySQL 같은 인프라 기술의 의존성이 전혀 없다.

  • 📢 섹션 요약 비유: 스마트폰은 USB-C 포트(표준 인터페이스)만 갖추고 있으면 충전기든, 이어폰이든, 모니터든 어댑터만 맞으면 연결할 수 있다. 스마트폰(도메인) 내부는 어떤 어댑터가 꽂히든 상관없다.

Ⅱ. 아키텍처 및 핵심 원리

포트(Port)는 도메인이 외부와 상호작용하는 인터페이스 규약이다. 입력 포트(Inbound Port)는 도메인이 제공하는 유스케이스 인터페이스(예: OrderUseCase)이고, 출력 포트(Outbound Port)는 도메인이 요구하는 인프라 인터페이스(예: OrderRepository)다.

항목설명포인트
도메인 (Domain)핵심 비즈니스 로직·규칙OrderService, Order 엔티티
입력 포트유스케이스 인터페이스 (도메인 제공)OrderUseCase interface
출력 포트인프라 요구 인터페이스 (도메인 정의)OrderRepository interface
입력 어댑터외부 입력을 포트 호출로 변환REST Controller, CLI
출력 어댑터포트 구현을 실제 인프라로 연결JpaOrderRepository
┌─────────────────────────────────────────────────────────────┐
│      의존성 방향: 항상 외부 → 도메인 방향                    │
├─────────────────────────────────────────────────────────────┤
│  입력 어댑터(Controller) ──▶ 입력포트(interface) ◀── 도메인  │
│                                                             │
│  도메인 ──▶ 출력포트(interface) ◀── 출력어댑터(JpaRepo)      │
│                                                             │
│  핵심: 도메인은 어댑터를 모른다. 어댑터가 도메인에 의존한다. │
└─────────────────────────────────────────────────────────────┘

DIP가 헥사고날의 핵심 원칙이다. 도메인이 소유한 출력 포트(인터페이스)를 인프라 어댑터가 구현하므로 의존성이 역전된다. 이 구조 덕분에 테스트에서 실제 DB 대신 인메모리 Mock 어댑터를 출력 포트에 꽂아 순수 도메인 로직을 검증할 수 있다.

  • 📢 섹션 요약 비유: 표준 규격의 콘센트(포트)만 있으면 한국용·미국용·유럽용 어댑터로 어떤 나라에서도 사용할 수 있다. 콘센트(도메인) 자체를 바꿀 필요가 없다.

Ⅲ. 비교 및 연결

헥사고날, 클린 아키텍처(Clean Architecture), 어니언 아키텍처(Onion Architecture)는 모두 "도메인 중심, 의존성 안쪽 방향"이라는 동일한 원칙을 다른 표현으로 제시한 것이다.

비교 축AB
중심 개념기술 계층 분리도메인 격리
의존성 방향위에서 아래 (도메인 → 인프라)항상 도메인 방향 (인프라 → 도메인)
DB 교체 영향비즈니스 계층 수정 필요출력 어댑터만 교체
단위 테스트인프라 Mock 필요순수 도메인만 테스트 가능

계층형이 도메인이 인프라를 향해 의존하는 반면, 헥사고날은 이 방향을 완전히 뒤집어 인프라가 도메인 쪽을 향해 의존한다. 이 차이가 테스트 용이성과 기술 독립성에서 극명한 결과를 낳는다.

  • 📢 섹션 요약 비유: 계층형은 왕(도메인)이 신하(인프라)의 집으로 직접 찾아가는 구조, 헥사고날은 신하(인프라)가 왕궁(도메인)으로 찾아오는 구조다. 왕은 궁전을 벗어날 필요가 없다.

Ⅳ. 실무 적용 및 기술사 판단

헥사고날 아키텍처 도입 시 가장 흔한 실수는 어댑터 코드가 도메인 내부에 의존 역전 없이 직접 침투하는 것이다. @Entity, @Table 같은 JPA 어노테이션이 도메인 엔티티 클래스에 붙거나, 도메인 서비스가 Spring의 @Autowired를 사용하면 헥사고날의 원칙이 깨진다.

판단 체크리스트

  1. 도메인 클래스에 인프라 프레임워크(Spring, JPA, Kafka)의 어노테이션이나 클래스가 없는가?
  2. 출력 포트가 도메인 패키지에 정의된 인터페이스인가?
  3. 테스트에서 실제 DB 없이 도메인 로직만 검증할 수 있는가?
  4. 새로운 UI 채널(REST → GraphQL) 추가 시 도메인 코드 수정이 없는가?
  5. 데이터베이스 교체 시 수정되는 코드가 출력 어댑터 하나뿐인가?
  • 📢 섹션 요약 비유: 좋은 식당은 홀 직원(입력 어댑터)과 배달 플랫폼(다른 입력 어댑터)이 바뀌어도 주방(도메인)의 레시피는 변하지 않는다. 주방장은 주문 방식을 신경 쓰지 않는다.

Ⅴ. 기대효과 및 결론

헥사고날 아키텍처를 올바르게 적용하면 도메인 로직의 단위 테스트 속도가 획기적으로 빨라진다. 실제 DB 연결 없이 인메모리 어댑터로 수천 건의 테스트를 초 단위로 실행할 수 있다. 인프라 기술 교체(관계형 DB → 문서 DB)도 어댑터 교체로 국한되어 핵심 비즈니스 코드는 보호된다.

한계는 초기 설계 복잡도와 포트·어댑터 코드의 증가다. 작은 CRUD 중심 시스템에서는 오히려 오버엔지니어링이 될 수 있다. 비즈니스 규칙이 복잡하거나 인프라 기술을 자주 교체해야 하는 환경에서 그 가치가 극대화된다.

미래 방향으로는 ① DDD와의 결합으로 도메인 이벤트 기반 포트 설계, ② 헥사고날 패키지 구조를 강제하는 아키텍처 검증 도구(ArchUnit), ③ 마이크로서비스에서 각 서비스가 내부적으로 헥사고날 구조를 채택하는 패턴이 확산되고 있다.

헥사고날 아키텍처는 "도메인이 중심에서 세상을 지배하고, 기술은 언제든 교체 가능한 플러그인"이라는 관점으로 기억해야 한다.

  • 📢 섹션 요약 비유: 심장(도메인)은 혈액을 펌프질하는 핵심 기능만 한다. 혈관(어댑터)이 어디로 연결되든, 신체 어느 부분(인프라)에 붙어 있든 심장의 역할은 바뀌지 않는다.

📌 관련 개념 맵

[DIP 원칙] → [포트 앤 어댑터 패턴] → [헥사고날 아키텍처] → [DDD 도메인 격리] → [MSA 내부 구조]

개념연결 포인트
DIP (의존성 역전)헥사고날의 핵심 원리: 인프라가 도메인에 의존
클린 아키텍처헥사고날과 동일 원칙을 원형 계층으로 표현
DDD도메인 격리 목표를 공유하는 설계 방법론
ArchUnit헥사고날 의존성 규칙을 자동 검증하는 도구

📈 관련 키워드 및 발전 흐름도

[계층형 도메인-인프라 결합 문제] → [포트 앤 어댑터 패턴] → [헥사고날 아키텍처] → [클린·어니언과 수렴] → [DDD+헥사고날 결합] → [MSA 서비스 내부 헥사고날 표준화]

👶 어린이를 위한 3줄 비유 설명

  1. 스마트폰의 USB-C 구멍(포트)은 충전기, 이어폰, 외부 모니터를 다 연결할 수 있어요.
  2. 스마트폰(도메인) 자체는 어떤 선이 꽂혔는지 신경 쓰지 않아요.
  3. 헥사고날 아키텍처는 핵심 기능(도메인)을 이런 표준 포트로 보호하는 방법이에요!