각 계층에서 하던 일들을 내부와 외부라는 개념으로 나누어 각각에 맞는 별도의 인터페이스를 정의 - 어댑터와 포트
내부의 로직은 외부을 통해서만 접근 가능
모든 비즈니스 로직은 외부 -> 내부 / 내부 -> 외부 방향으로만 호출
Adapter: 서비스의 입장에서 서비스가 사용하는 외부 시스템과의 직접적인 구현 및 상호작용을 처리
예시
- 외부 시스템 (UI) 으로부터 들어온 Request가 가장 처음 만나는 Controller는 인바운드 어댑터
- 메세지 브로커 (Kafka)로부터 Consume 하는 동작을 처리하는 로직 핸들러는 인바운드 어댑터
- DB에 직접적으로 접근하여 다양한 작업 (CRUD)을 처리하기 위한 DAO는 아웃바운드 어댑터
Port: 비즈니스 로직 입장에서 어댑터와 통신하기 위한 동작을 정의한 인터페이스
예시
- Controller로부터 들어온 요청을 기반으로 특정 비즈니스 로직을 수행하는 동작을 정의한 인바운드 포트
- Consume한 메세지를 처리하기 위한 비즈니스 로직의 동작을 정의한 인바운드 포트
- 비즈니스 로직에서 DB 접근을 위해 정의한 Repository 인터페이스는 아웃바운드 포트
어댑터를 통해 외부 서비스와의 의존성을 분리하고 포트를 통해 내부 비즈니스 로직과 인터페이스를 분리.