[Spring in Action] Spring RestTemplate

728x90
반응형
SMALL

Spring in Action (5판)

  • 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
  • Walls, Craig 지음
  • 제어펍 출판사
  • 2020.05.14

 

스프링 인 액션 개인 스터디 내용을 정리하자.

 

 

 

 


RestTemplate

Spring 3.0부터 제공하는 HTTP Client

HTTP 통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화(반복적이고 기계적인 코드 정리)하고 RESTful 원칙을 지킨다.

직접 HTTP 요청을 수행하지 않고, 직접 수행하는 클래스를 한번 래핑한 어댑터 역할을 한다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

현재는 Deprecated, WebClient 권장하는 듯.

NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports sync, async, and streaming scenarios.

 

특징

기본적으로 Connection pool을 사용하지 않아서 많은 요청을 다루기 어렵다.

  • Default로 java.net.HttpURLConnection 사용 → SimpleClientHttpRequestFactory

그래서 많은 요청 시 TIME_WAIT로 인해 자원이 부족해져 서비스에 어려움이 생긴다.

  • 연결할 때 마다, 로컬 포트를 열고 tcp connection을 맺는다. 이때 close() 이후에 사용된 소켓은 TIME_WAIT 상태가 되는데, 요청량이 많다면 이런 소켓들을 재사용하지 못하고 소켓이 오링 나서 응답이 지연되는 상황이 생긴다.

이러한 이유로 Connection Pool을 만들어 사용하는 것을 권장한다.

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
 
 
public class RestTemplateEx {
 
 
    public static void main(String[] args) {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();       
        factory.setReadTimeout(5000); // 읽기시간초과, ms
        factory.setConnectTimeout(3000); // 연결시간초과, ms
 
 
        HttpClient httpClient = HttpClientBuilder.create()
            .setMaxConnTotal(100) // connection pool 적용
            .setMaxConnPerRoute(5) // connection pool 적용
            .build();
 
 
        factory.setHttpClient(httpClient); // 동기실행에 사용될 HttpClient 세팅
 
 
        RestTemplate restTemplate = new RestTemplate(factory);
 
 
        String url = "http://testapi.com/search?text=1234";
 
 
        Object obj = restTemplate.getForObject(url, ResponseDto.class);
        System.out.println(obj);
    }
}

동작

package org.springframework.web.client;

 

HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient를 추상화해서 제공한다.

 

따라서 내부 통신(HTTP 커넥션)에 있어서는 Apache HttpComponents를 사용한다.

  • Application이 RestTemplate을 생성하고 URI, HTTP Method 등의 헤더를 담아 요청한다.
  • RestTemplate은 HttpMessageConverter를 사용하여 requestEntity를 요청 메세지로 변환한다.
  • RestTemplate은 ClientHttpRequestFactory로 부터 ClientHttpRequest를 가져와서 요청을 보낸다.
  • ClientHttpRequest는 요청 메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
  • RestTemplate은 ResponseErrorHandler로 오류를 확인하고 있다면 처리 로직을 태운다.
  • ResponseErrorHandler는 오류가 있다면 ClientHttpResponse에서 응답 데이터를 가져와서 처리한다.
  • RestTemplate은 HttpMessageConverter를 이용해서 응답메세지를 java object(Class responseType)로 변환하여 Application에 전달한다.
HttpMessageConverter

스프링 프레임워크에서 제공하는 인터페이스, 스프링 MVC에서 제공Http 요청 본문으로 들어오는 것을 객체로 변환하거나 Http 응답을 본문으로 변환할 때 사용 요청이나 응답에 따라 다른 컨버터 사용 (json 요청 시 json 컨버터 사용)@RestController 어노테이션을 사용하는 경우 Converter를 자동으로 사용하게 된다. 그렇기에 @ResponseBody 생략 가능

 

 

Method

728x90
반응형
LIST