각 계층은 주어진 역할만 수행한다. 의존성은 단방향이어야한다. 소규모 어플리케이션에 적합.
Producer - Broker - Consumer
모든 요청을 비동기로 처리해 확장성이 좋고 의존성이 낮아진다. 다만 순서를 보장하기 어렵다.
Inbound adapter - inbound port(인터페이스) - service(구현체) - outbound port(인터페이스) - outbound adapter(구현체)
service에서 도메인의 행위를 호출한다. 도메인의 상태를 변경하는데에 외부의 데이터가 필요하면 서비스에서 가져와서 도메인에 주입한다. 도메인은 외부의 모듈에 의존해선 안된다. VO와 기본 타입, 상태를 변경하는 행위만 필요하다.
layered에서 서비스의 비즈니스 로직을 도메인에 옮기고 외부와의 통신을 별도의 계층으로 분리하면 hexagonal이 될 수 있다.
장단점
layered - 간단한 로직만을 담당하는 서버일 경우, 생산성을 우선해야하는 경우 hexagonal - 비즈니스 로직의 안정성이 중요한 경우, DDD를 따르는 경우
시스템은 작은 서비스(도메인 단위)로 나누어 관리, 확장성과 업그레이드가 용이하지만 비용이 많이 들어갈 수 있다.
결정을 내리는 코드(함수형 코어)와 결정에 따라 작동하는 코드(가변 셀)를 분리해 코어를 가변 셀로 감싼다. 셀에서 받은 입력을 코어에서 결정하고 결과를 셀에서 처리한다. 코어와 셀의 연결은 서비스가 수행한다.