의존성 역전

  • 인커밍 어댑터는 애플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 애플케이션 계층과 통신한다.
  • 어댑터와 유스케이스 사이에 간접 계층을 넣어야 되는 이유
    • 포트: 애플리케이션 코어와 외부 세계와 통신할 수 있는 곳에 대한 명세이다.
    • 포트를 적절한 곳에 위치시키면 외부와 어떤 통신이 일어나고 있는지 정확히 알 수 있다.
  • 웹 소켓의 경우
    • 웹 어댑터에서 아웃고잉 포트를 구현하고 애플리케이션 코어에서 호출해야 한다.

웹 어댑터의 책임

  • 웹 어댑터가 일반적으로 하는 일
    1. HTTP 요청을 자바 객체로 매핑
    2. 권한 검색
    3. 입력 유효성 검증
    4. 입력을 유스케이스의 입력 모델로 매핑
    5. 유스케이스 호출
    6. 유스케이스의 출력을 HTTP로 매핑
    7. HTTP 응답을 반환
  • 유스 케이스 입력 모델의 검증과 차이점
    • 웹 어댑터 입력 모델과 유스 케이스 입력 모델에는 차이가 있을 수 있으므로 또 다른 검증을 수행해야 한다.
    • 오스케이스 입력 보델에서 했던 유효성 검증을 똑같이 웹 어댑터에서도 구현해야 하는 것은 아니다. 대신, 웹 어댑터의 입력 모델을 유스케이스의 입력 모델로 변환할 수 있다는 것을 검증해야 한다.
  • 유스 케이스에서 던진 예외에 대해서, 웹 어댑터에서 호출자에 보여줄 메시지로 변환해야 한다.

컨트롤러 나누기

  • 컨트롤러는 너무 적은 것보다는 너무 많은 게 낫다.
    • 클래스마다 코드는 적을 수록 유지 보수에 좋다.
    • 테스트 코드도 작은 코드가 더 작성하기 쉽다.
  • 모든 연산을 단일 컨트롤러에 넣는 것은 데이터 구조의 재활용을 촉진한다.
  • 클래스를 작게 나누는 것이 동시 작업이 쉬워진다. 두 개발자가 서로 다른 연산에 대해 코드를 짜고 있다면 병합 출력이 일어나지 않는다.

유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?

  • 웹 어뎁터에서는 도메인 로직을 수행하지 않으면, 필요할 경우 웹 어댑터를 다른 어댑터로 쉽게 교체할 수 있다.
  • 웹 컨트롤러를 나눌 때 모델을 공유하지 않는 작은 클래스들을 만드는 것을 두려워해서는 안된다. 작은 클래스가 파악하기 쉽고, 테스트하기 쉬우며, 공시 작업을 지원한다.