[1] RestTemplate란 ?
- org.springframework.http.client
- Spring 3.0 부터 지원
- 스프링에서 http 통신에 쓸 수 있다.
- HTTP 서버와 통신을 단순화하고 RESTful 원칙을 지킨다.
그 외 스프링의 REST 서비스 호출 방법
- AsyncRestTemplate
- Spring 4부터 사용 가능한 비동기 RestTemplate
- WebClient
- Spring 5부터 사용 가능한 Non-Blocking, Single Thread 이며 동기&비동기 둘다 지원
RestTemplate를 많이 사용하고 있지만 최근 추세는 WebClient로 마이그레이션 중인 것 같다.
[2] RestTemplate의 동작
- HttpClient는 Http를 사용하여 통신하는 범용 라이브러리 이다.
- RestTemplate는 HttpClient를 추상화하여 제공하고 있다.
- 어플리케이션이 RestTemplate를 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다.
- RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다.
- RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.
- ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
- RestTemplate 는 ResponseErrorHandler 로 오류를 확인하고 있다면 처리로직을 태운다.
- ResponseErrorHandler 는 오류가 있다면 ClientHttpResponse 에서 응답데이터를 가져와서 처리한다.
- RestTemplate 는 HttpMessageConverter 를 이용해서 응답메세지를 java object(Class responseType) 로 변환한다.
- 어플리케이션에 반환된다.
public void auth(String encryptedUserAgent) throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
Request request = new Request(new Customer(encryptedUserAgent)); //요청 객체
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("customer", "usert1234");
map.add("encryptedUserAgent", encryptedUserAgent);
headers.add(
"Authorization",
"vavasdvasdv"
);
headers.setContentType(MediaType.APPLICATION_JSON); //content-type 설정
HttpEntity<Request> entity = new HttpEntity<Request>(request, headers);
Response response = //post 형식으로 보내며 object로 리턴받음
restTemplate.postForObject(
"http://localhost:8000/test",
entity,
Response.class
);
}
RestTemplate는 Multi-Thread와 Blocking 방식을 사용한다.
이 말인 즉슨 1요청 당 1스레드가 할당 되며 각 스레드에서는 Blocking 방식으로 처리되기 때문에 응답이 올 때 까지 해당 스레드는 다른 요청에 할당 될 수 없다.
물론 Block이 꼭 필요한 경우가 있겠지만 아무래도 성능적인 부분이나 병렬 방식의 많은 스레드는 과부하를 줄 수 있을 것이다. 그렇기 때문에 최근에는 WebClient를 권고하는 추세라고 한다.
WebClient는 non-Blocking 이며 이 방식이 필요한 이유는 네트워킹의 병목 현상을 줄이고 성능을 향상 시킬 수 있기 떄문이다. 또한 WebClient는 비동기, 동기 둘 다 지원 가능하기 때문에 훨씬 큰 장점이 될 것이다.
[3] RestTemplate 메서드
RestTemplate MethodHTTP Method설명
Method | HTTP | description |
getForObject | GET | get 요청을 보내고 java object로 매핑받아서 반환받음 |
getForEntity | GET | get 요청을 보내고 ResponseEntity로 반환받음 |
postForLocation | POST | post 요청을 보내고 헤더에 저장된 java.net.URI를 결과 로 반환받음 |
postForObject | POST | post 요청을 보내고 객체로 반환받음 |
postForEntity | POST | post 요청을 보내고 ResponseEntity로 반환 받음 |
put | PUT | 주어진 URL 주소로 http put 메서드 실행 |
delete | DELETE | 주어진 URL 주소로 http delete 메서드 실행 |
patchForObject | PATCH | 주어진 URL 주소로 http patch 메서드 실행 |
optionsForAllow | OPTIONS | 주어진 URL 주소에서 지원하는 http 메서드 조회 |
headForHeaders | HEAD | 헤더의 모든 정보를 얻을 수 있으면 http head 메서드 사용 |
execute | Any | Request/Response 콜백 수정 |
exchange | Any | 헤더세팅해서 HTTP Method로 요청보내고 ResponseEntity로 반환받음 |
출처: https://sjh836.tistory.com/141 [빨간색코딩]
'Study > Spring' 카테고리의 다른 글
[Spring] spring JDBC (0) | 2021.10.04 |
---|---|
[Spring] Handler Method(ResponseEntity) (0) | 2021.09.12 |
[Spring] @ModelAttribute (0) | 2021.09.08 |
[Spring] Spring IoC Container 그리고 Bean (0) | 2021.08.29 |
[Spring] Dispatcher Servlet (0) | 2021.08.24 |