Spring in Action (5판)
- 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
- Walls, Craig 지음
- 제어펍 출판사
- 2020.05.14
스프링 인 액션 개인 스터디 내용을 정리하자.
RestTemplate
Spring 3.0부터 제공하는 HTTP Client
HTTP 통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화(반복적이고 기계적인 코드 정리)하고 RESTful 원칙을 지킨다.
직접 HTTP 요청을 수행하지 않고, 직접 수행하는 클래스를 한번 래핑한 어댑터 역할을 한다.
현재는 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
'Study > Spring in Action' 카테고리의 다른 글
[Spring in Action] 비동기 메시지, 메시지 시스템, AMQP (0) | 2021.01.24 |
---|---|
[Spring in Action] Stateless vs Stateful (0) | 2021.01.24 |
[Spring in Action] Spring REST Sample 예제 (0) | 2021.01.24 |
[Spring in Action] Spring REST (0) | 2021.01.24 |
[Spring in Action] Spring 구성 속성 사용하기 (0) | 2021.01.24 |