헥사고날 아키텍처 (Hexagonal Architecture) – 개념과 특징

헥사킬은 예전부터 알고 있었는데 헥사고날 아키텍처는 2023년부터 인프런 강의로 공부를 하면서 한 두번씩 들어본 것이 전부이다. 개발은 공부를 해서 하나씩 더 알게 될 수록 개발이 점점 어렵게 느껴진다. 그래도 일보 전진해보기로 한다

헥사고날 아키텍처는 2005년 유명 개발자이자 컨설턴트인 앨리스터 코번(Alistair Cockburn)이 제안한 소프트웨어 아키텍처 패턴이다. 이 아키텍처는 기존의 계층형 아키텍처가 가지는 단방향 비대칭적인 구조에서 벗어나, 애플리케이션의 내부(Core Application)와 외부(Actors)라는 두 관점으로 시스템을 바라보는 대칭적인 구조를 제안한다

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

대칭성과 육각형

  • 헥사고날 아키텍처는 시스템의 ‘내부’와 ‘외부’로만 구분하며, 계층형 아키텍처처럼 고정된 상하 / 좌우의 방향성을 가지고 있지 않는다. 그림으로 표현할 때 육각형 모양을 사용하는 것은 내부외 외부가 모든 방향에서 상호작용할 수 있음을 시각적으로 쉽게 나타내기 위함이다. 육각형 자체의 면 개수에 특별한 의미가 있는 것은 아니며, 대칭적인 구조를 표현하기 쉬운 도형이기 때문에 선택되었다
  • 여기서 ‘대칭성’이란 시스템의 핵심 로직이 특정 기술이나 외부 인터페이스에 종속되지 않고, 모든 외부 요소와 동등하게 상호작용 할 수 있는 구조를 의미한다

내부(Hexagon – Core Application)

  • 헥사곤의 내부는 애플리케이션의 핵심 도메인 로직을 담고 있는 부분이다. 이는 시스템의 가장 중요한 비즈니스 규칙과 프로세스를 구현한 코드이다.
  • 전통적인 3계층 아키텍처에서 도메인 레이어에 해당하며, 트랜잭션 스크립트 방식이나 도메인 모델 패턴 등 어떤 방식으로든 비즈니스 로직이 구현될 수 있다. 중요한 것은 이 내부가 외부 기술 스택에 오염되지 않고 순수하게 비즈니스 문제 해결에 집중해야 한다는 점이다

외부(Actor)

  • 헥사곤의 외부는 핵심 애플리케이션과 상호작용 하는 모든 것을 포괄한다. 이들을 액터(Actor)라고 부르며, 액터는 어떤 의도를 가지고 시스템과 행위를 주고받는 모든 주체를 의미한다
  • 주요 액터 예시
    • 사용자 인터페이스: 웹 브라우저, 모바일 앱, CLI(명령줄 인터페이스), GUI 등
    • 데이터 저장소: 데이터베이스(RDBMS, NoSQL 등), 파일 시스템
    • 외부 시스템: 메시징 시스템(Kafka, RabbitMQ), 메일 시스템, 원격 서비스(API 연동)
    • 테스트: 애플리케이션의 핵심 로직을 검증하기 위한 테스트 코드 역시 외부 액터에 해당
    • 운영 환경: 애플리케이션이 배포되고 실행되는 인프라 환경

헥사고날 아키텍처의 특징과 이점

뛰어난 테스트 용이성(Testability)

  • 앨리스터 코번이 헥사고날 아키텍처를 제안한 가장 핵심적인 이유이다. 외부 시스템(DB, UI 등)에 실제로 연결하지 않고도 핵심 도메인 로직을 쉽고 빠르게 테스트 할 수 있도록 설계되었다
  • 이는 특히 EJB와 같이 복잡한 환경 설정과 배포 과정이 필요한 기존 기술 스택의 문제점을 해결하고자 했다. 가짜 객체(Mock)나 스텁(Stub)을 사용하여 외부 의존성을 격리하고 순수 비즈니스 로직에 대한 단위 및 통합 테스트를 용이하게 만든다

유연한 엑터 교체 및 변경

  • 사용자 인터페이스, 데이터베이스, 메시징 시스템 등 외부 액터가 바뀌더라도 핵심 애플리케이션의 코드를 변경하고 않고 새로운 액터와 연동할 수 있다. 예를 들어 웹 UI를 배치 시스템으로 교체하거나, RDBMS를 NoSQL로 변경하는 작업이 용이해진다

도메인 로직 보호 및 기술 독립성

  • 헥사고날 아키텍처는 핵심 도메인 로직이 사용자 인터페이스의 내부 사항, 특정 데이터베이스 기술, 외부 서비스 호출 방식 등 기술적인 세부 구현에 오염되지 않도록 보호한다
  • 도메인 설계에 집중할 수 있도록 하여 비즈니스 가치를 우선시하고 기술적인 부채를 줄이는 데 기여한다

모듈화 및 확장성

  • 시스템을 여러 개의 독립적인 컴포넌트로 분리하고 개발할 수 있도록 하여 대규모 시스템의 복잡성을 관리하고 개발 생산성을 높인다. 각 컴포넌트는 독립적으로 개발, 테스트, 배포될 수 있으며, 필요에 따라 쉽게 연결하거나 교체할 수 있다

기술 변화에 대한 내성

  • 시간이 지남에 따라 외부 연동 기술이나 접근 방식이 변화하더라도 해심 도메인 로직은 안정적으로 유지되면서 외부 인퍼테이스만 교체하는 방식으로 손쉽게 대응할 수 있다

헥사고날 아키텍처와 Spring Framework

  • 헥사고날 아키텍처가 추구하는 목표와 이점은 Spring Framework가 지행하는 바와 매우 유사하다. Spring의 핵심 원칙인 제어의 역전(IoC)과 의존성 주입(DI)은 기술적인 세부 사항으로부터 비즈니스 로직을 분리하고 테스트 용이성을 극대화하며, 기술 변화에 유연하게 대응할 수 있도록 돕는다. 따라서 Spring을 기본 원칙에 따라 잘 활용하는 개발자라면, 이미 헥사고날 아키텍처의 이점들을 상당 부분 누리고 있다고 볼 수 있다

헥사고날 아키텍처는 핵심 비즈니스 로직을 외부 기술로부터 격리하여 높은 테스트 용이성, 유연성, 그리고 기술 독립성을 확보하고자 하는 소프트웨어 아키텍처 패턴이다

출처 – 토비의 클린 스프링 – 도메인 모델 패턴과 헥사고날 아키텍처 Part 1