애플리케이션은 대부분 웹 인터페이스 같은 것을 제공한다. 웹 브라우저를 통해 상호작용할 수 있는 UI나 다른 시스템에서 우리 애플리케이션으로 호출하는 방식으로 상호작용하는 HTTP API가 여기 해당한다.

5.1. 의존성 역전

웹 어댑터는 ‘주도하는’ 혹은 ‘인커밍’ 어댑터다. 외부로부터 요청을 받아 애플리케이션 코어를 호출하고 무슨 일을 해야 할지 알려준다. 이때 제어 흐름은 웹 어댑터에 있는 컨트롤러에서 애플리케이션 계층에 있는 서비스로 흐른다.

인커밍 어댑터는 애플리케이션 서비스에 의해 구현된 인터페이스 전용 포트를 통해 애플리케이션 계층과 통신한다.

인커밍 어댑터는 애플리케이션 서비스에 의해 구현된 인터페이스 전용 포트를 통해 애플리케이션 계층과 통신한다.

애플리케이션 계층은 웹 어댑터가 통신할 수 있는 특정 포트를 제공한다. 서비스는 이 포트를 구현하고, 웹 어댑터는 이 포트를 호출할 수 있다.

image.png

자세히 살펴보면 의존성 역전 원칙이 적용된 것을 발경할 수 있다. 제어 흐름이 왼쪽에서 오른쪽으로 흐르기 때문에 웹 어댑터가 유스케이스를 직접 호출할 수 있다.

어댑터와 유스케이스 사이에 또 다른 간접 계층을 넣는 이유는, 애플리케이션 코어가 외부 세계와 통신할 수 있는 곳에 대한 명세포트이기 때문이다. 포트를 적절한 곳에 위치시키면 외부와 어떤 통신이 일어나고 있는지 정확히 알 수 있고, 이는 레거시 코드를 다루는 유지보수 엔지니어에게는 무척 소중한 정보다.

<aside> ❓

만약 웹 소켓을 통해 실시간 데이터를 사용자의 브라우저로 보낸다고 가정해보자. 애플리케이션 코어에서는 이런 실시간 데이터를 어떻게 웹 어댑터로 보내고, 웹 어댑터는 이 데이터를 어떻게 사용자의 브라우저로 전송하는 것일까?

</aside>

이 시나리오에서는 반드시 포트가 필요하다. 포트는 웹 어댑터에서 구현하고 애플리케이션 코어에서 호출해야 한다.

만약 애플리케이션이 웹 어댑터에 능동적으로 알림을 줘야 한다면 올바른 방향으로 유지하기 위해 아웃고잉 포트를 통과해야 한다.

만약 애플리케이션이 웹 어댑터에 능동적으로 알림을 줘야 한다면 올바른 방향으로 유지하기 위해 아웃고잉 포트를 통과해야 한다.

엄밀히 말하자면 이 포트는 아웃고잉 포트이기 때문에 이제 웹 어댑터는 인커밍 어댑터인 동시에 아웃고잉 어댑터가 된다. 한 어댑터가 동시에 두 가지 역할을 하지 못할 이유는 없다.

5.2. 웹 어댑터의 책임

<aside> ❓

애플리케이션이 REST API를 제공한다고 했을 때, 웹 어댑터의 책임은 어디서부터 어디까지일까?

</aside>

웹 어댑터의 역할

  1. HTTP 요청을 자바 객체로 매핑
  2. 권한 검사