RestTemplate vs WebClient

CHOI YUN HO·2022년 9월 9일
0

RestTemplate 동작 원리


RestTemplate는 멀티 스레드Blocking 방식을 사용하기 때문에, Request는 먼저 Queue에 쌓이고, 가용한 스레드에 할당되어 처리된다. (1요청 당 1스레드)
각 스레드는 Blocking 방식으로 응답이 올 때까지 다른 요청에 할당될 수 없다.

따라서 요청을 처리할 스레드가 없다면, 요청은 Queue에 대기하게 된다.
대부분의 문제는 네트워크나 DB와의 통신에서 생기는데 이런 문제가 여러 스레드에서 발생하면 가용한 스레드수가 현저히 줄어들게 되고, 결국 전체 서비스는 매우 느려질 수 있다.

내부적으로는 아래와 같이 동작한다.

  1. 애플리케이션 내부에서 REST API에 요청하기 위해 RestTemplate의 메서드를 호출한다.
  2. RestTemplate은 MessageConverter를 이용해 java object를 request body에 담을 message(JSON etc.)로 변환한다. 메시지 형태는 상황에 따라 다름
  3. ClientHttpRequestFactory에서 ClientHttpRequest을 받아와 요청을 전달한다.
  4. 실질적으로 ClientHttpRequest가 HTTP 통신으로 요청을 수행한다.
  5. RestTemplate이 에러핸들링을 한다.
  6. ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리한다.
  7. MessageConverter를 이용해 response body의 message를 java object로 변환한다.
  8. 결과를 애플리케이션에 돌려준다.
    ※ RestTemplate은 통신 과정을 ClientHttpRequestFactory(ClientHttpRequest, ClientHttpResponse)에 위임합니다. ClientHttpRequestFactory의 실체는 HttpURLConnection, Apache HttpComponents, HttpClient와 같은 HTTP Client

WebClient


WebClient란?

WebCleint는 스프링 5.0에서 추가된 인터페이스다. 스프링 5.0 이전에는 비동기 클라이언트로 AsyncRestTemplate을 사용했었다. 하지만 스프링 5.0 이후부터는 WebClient를 사용할 것을 권장한다.

WebClient의 특징

  • 싱글 스레드 방식을 사용
  • Non-Blocking 방식을 사용
  • JSON, XML을 쉽게 응답받는다.

WebClient 동작 원리

WebClient는 싱글 스레드Non-Blocking 방식을 사용하기 때문에 Core당 1개의 스레드를 사용한다.

각 요청은 Event Loop내에 Job으로 등록이 되며, Event Loop는 각 Job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 Job을 처리한다.
Event Loop는 제공자로부터 callback으로 응답이 오면, 그 결과를 요청자에게 제공한다.
WebClient는 이렇게 이벤트에 반응형으로 동작하도록 설계되었다.
그래서 반응성, 탄력성, 가용성, 비동기성을 보장하는 Spring React 프레임워크를 사용한다.
또한, React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용된다.

profile
가재같은 사람

0개의 댓글