시스템의 기본적인 구조를 정의
시스템의 중요한 품질 속성에 큰 영향을 미침
설계 결정의 기반이 되는 핵심적인 개념
기본 구성요소, 상호관계, 제약 조건 그리고 원칙 등을 포함
서브 시스템을 계층으로 구조화 하는 아키텍쳐 스타일
계층은 사용 관계로 연결
사용 관계는 '일반적으로 단방향이어여 한다'라는 제약을 갖음
각 계층이 하위 계층의 내부 작동 방식을 알지 못하고, 제한된 인터페이스만 사용해야 한다. (계층 격리)
⬇️ 요청
1. UI (= Presentation)
2. Domain (= Business Logic, Transaction Script)
3. Data (= Persistence, Infra)
⬇️ 응답
⬇️ 요청
1. UI (= Presentation)
2. Application Service
3. Domain (= Business Logic, Transaction Script)
4. Data (= Persistence, Infra)
⬇️ 응답
대칭형(Symmetric) 아키텍쳐
위 아래, 좌 우가 아닌 애플리케이션의 내부와 외부 세계 라는 구조를 가짐
헥사곤의 내부
헥사곤의 외부
헥사고날 아키텍쳐의 특징과 혜택
테스팅!. 운영 System에 연결되지 않고, 애플리케이션 테스트
UI 디테일이나 기술정보가 도메인 로직 안으로 노출되지 않도록 보호. (반대도 마찬가지)
컴포넌트를 각각 개발, 연결하는 방식으로 큰 시스템을 분리
시간이 지나면서 외부 연결을 다른 것으로 변경 할 수 있다.
기술 요소를 제거했기 때문에 도메인 설계에 집중 할 수 있다.
헥사곤
애플리케이션
앱
코어 시스템
SuD(System under Development)
SuT(System under Test)
Port
인터페이스
Lolipop : Provided Interface (기능 제공 인터페이스)
Socket : Required Interface (기능 요구 인터페이스)

어댑터
애플리케이션의 포트를 직접 연결할 수 없다면 인터페이스의 변환을 위해 어댑터를 사용
브라우저를 통해서 애플리케이션의 회원가입 포트의 기능 제공 인터페이스를 사용하려면?
애플리케이션이 가진 회원 정보 저장 포트의 기능 요구 인터페이스로 DB와 직접 연결 할 수 없다면?
포트와 어댑터 아키텍쳐
- 헥사고날 아키텍쳐의 특징을 담은 새로운 이름
- 여전히 포트와 어댑터 아키텍쳐보다 헥사고날 아키텍쳐란 이름이 많이 사용.
애플리케이션이 제공하는 기능을 사용하는 액터와 이를 위한 어댑터
primary actor, primary adapter
driving actor, driving adapter
애플리케이션이 동작하는데 필요한 기능을 제공하는 액터와 이를 위한 어댑터
애플리케이션 내부에 도메인 계층을 만들어여 한다. -> X
헥사고날 아키텍쳐는 애플리케이션 내부 구현에 대한 원칙이나 요구사항이 없다.
헥사고날 아키텍처는 클린 아키텍처, 어니언 아키텍처가 아니다
헥사고날 아키텍처 패키지 구조를 따라야 한다. -> X
포트는 UseCase라는 접미사를 사용한다 -> X
애플리케이션에는 도메인 모델만 넣고, JPA 엔터티 등은 어댑터에 둬야한다 -> X
애플리케이션은 모든 외부와 상호작용을 위해서 Provided Interface와 Required interface를 정의한다
애플리케이션과 상호작용하는 액터는 런타임에 구성돼야 한다
애플리케이션은 액터에 대한 코드 의존성을 가지면 안됌
액터는 정의된 포트를 통해서만 연결돼야 한다.
포트의 인터페이스는 기술 의존성을 가지지 않는다.