스프링 어플리케이션에서 HTTP 요청을 할 때 사용하는 방법으로 RestTemplate와 WebClient가 있다.
스프링 5.0 이전까지는 클라이언트에서 HTTP 접근을 하기 위해 RestTemplate를 사용하였다.
하지만 스프링 5.0에서 WebClient가 등장하였고, 현재는 WebClient를 사용하는 것을 권고하고 있다.
앞으로 RestTemplate가 deprecated 될 예정이지만, WebClient를 이해하기 전에 RestTemplate도 알고 있다면 두 템플릿 사이의 차이를 좀 더 명확하게 이해할 수 있을 것이라 생각한다.
■ RestTemplate
1) RestTemplate 란? - Spring에서 지원하는 객체로 Rest 방식의 API를 호출할 수 있는 Spring 내장 클래스 - Spring 3.0부터 지원 - JSON, XML 응답을 모두 처리할 수 있다. - Rest API 호출 이후 쓰레드에서 요청에 대한 응답을 받을 때까지 기다리는 동기 방식
※ WebClient : Spring 5.0부터 지원, non-blocking, 비동기 방식을 지원하며, spring에서 WebClient를 사용할 것을 권고
[참고] Spring Framework 5.0부터는 WebFlux 스택과 함께 WebClient라는 새로운 HTTP 클라이언트를 도입하여 기존의 동기식 API를 제공할 뿐만아니라 비동기 접근 방식도 지원
2) RestTemplate의 특징 - Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿 - HTTP 요청 후 JSON, XML, String과 같은 응답을 받을 수 있는 템플릿 - Blocking I/O 기반의 동기 방식을 사용하는 템플릿 - RESTful 형식에 맞추어진 템플릿 - Header, Content-Type 등을 설정하여 외부 API를 호출
3) RestTemplate의 동작 원리 - HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리 - RestTemplate는 HttpClient를 추상화해서 제공 (1) 애플리케이션 내부에서 REST API를 호출하기 위해 RestTemplate의 메서드를 호출 (2) RestTemplate는 MessageConverter를 이용하여 Java Object를 Request body에 담아 message로 변환 (3) ClientHttpRequestFactory에서 ClientHttpRequest를 받아와 요청을 전달 (4) 실질적으로 ClientHttpRequest가 HTTP 통신으로 요청을 수행 (5) ResponseErrorHandler를 통해 에러를 핸들링한다. (6) ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리 (7) MessageConverter를 이용하여 response body의 message를 java object로 변환 (8) 요청 결과를 애플리케이션에게 반환
※ RestTemplate는 통신 과정을 ClientRequestFactory(ClientHttpRequest, ClientHttpResponse)에 위임 ※ ClientHttpRequestFactory의 실체는 HttpURLConnection, Apache HttpComponent, HttpClient와 같은 Http Cleint