헥사고날 아키텍처는 내부(도메인)과 외부(인프라)로 구분된다
- 내부 : 순수한 비즈니스 로직을 표현, 캡슐화된 영역이고 기능적 요구사항에 따라 먼저 설계
- 외부 : 내부 영역에서 기술을 분리하여 구성한 영역, 내부 영역 설계 이후 설계
도메인 객체
- 도메인 객체는 상태와 동작을 가질 수 있다
- 동작이 상태에 가까워질수록 이유를 이해하고 유지하는게 쉬워진다
- 도메인 객체는 외부 종속성이 없다
- 순수 자바이며 유스 케이스에 대한 API를 제공한다
- 비지니스 요구사항이 변경되었을 때에만 도메인이 변경된다(변경 이유는 하나여야 한다는 단일 책임 원칙을 지키기 쉽다)
- 도메인-드리븐-디자인을 적용할 수 있다
유스 케이스
- 유스 케이스는 유저가 소프트웨어를 사용하여 무엇을 하는지에 대한 추상적인 설명
- 모든 비즈니스 룰과 로직이 포함되어 있다
- 도메인 객체와 비슷하게 외부 영역에 종속성이 없다
- 만약 헥사곤의 바깥에서 뭔가를 필요로 한다면 아웃풋 포트를 만들어야 한다
인풋과 아웃풋 포트
- 모든 커뮤니케이션은 포트를 통해 이루어진다
- 인풋 포트는 외부 컴포넌트에서 호출할 수 있는 간단한 인터페이스이며 유스케이스에 따라 구현된다
- 이러한 인풋 포트를 호출하는 컴포넌트를 인풋 어댑터 혹은 드라이빙 어댑터라고 부른다
- 아웃풋 포트는 유스케이스에서 호출할 수 있는 간단한 인터페이스이다(예:데이터베이스 접속)
- 이 인터페이스는 유스케이스의 요구에 알맞게 디자인된다
- 하지만 아웃풋 혹은 드리븐 어댑터라고 불리는 외부 컴포넌트에 의해 구현된다
- 종속성 반전 원칙을 사용
어댑터
- 어댑터는 헥사고날 아키텍쳐의 외부 레이어를 형성하며 코어 파트는 아니지만 코어와 상호작용을 한다
- 인풋 어댑터 혹은 드라이빙 어댑터가 인풋 포트를 호출하여 동작을 수행한다.
- 아웃풋 어댑터 혹은 드리븐 어댑터는 유스케이스로부터 호출되어 데이터베이스로부터 데이터를 제공한다
- 아웃풋 어댑터는 아웃풋 포트 인터페이스를 구현한다
- 어댑터는 특정 레이어의 교환을 쉽게 만든다(만약 다른 데이터베이스가 필요해진다면 영속성을 지니고 예전의 아웃풋 포트 인터페이스를 구현하는 새로운 어댑터를 추가하면 된다)
참고