모든 커뮤니케이션은 어댑터를 통해 이루어진다.
웹 어댑터는 incoming or driving 어댑터다. 외부로부터 요청을 받아 애플리케이션 코어를 호출하며, 제어 흐름은 웹 어댑터(컨트롤러) -> 애플리케이션(서비스)로 흐른다.
애플리케이션 계층은 웹 어댑터가 통신할 수 있는 포트를 제공하고, 서비스가 이를 구현한다.
포트로 외부 세계와 통신할 수 있으므로, 간접 계층은 꼭 넣어야 한다.
Account 엔티티의 연산과 관련해 모아서 작성한다면, 모든 것이 하나의 클래스에 있어 괜찮아 보이지만 단점이 존재한다.
따라서, 각 연산에 대해 가급적이면 별도의 패키지 안에 별도의 컨트롤러를 만드는 방식을 선호하고 메서드와 클래스명은 유스케이스를 최대한 반영하도록 한다.
AccountController
-> SendMoneyController
앱 어댑터를 구현할 때는 HTTP요청을 애플리케이션의 유스케이스에 대한 메서드 호출로 변환하고 결과를 다시 HTTP로 변환하되, 어떤 도메인 로직을 수행하지 않는다.
웹 컨트롤러를 나눌 때 모델을 공유하지 않는 여러 작은 클래스들을 만드는 것을 두려워해서는 안된다. 작은 클래스들은 더 파악하기 쉽고, 테스트하기 쉬우며 동시 작업을 지원한다.