Study/Spring

[Spring] RestTemplate

개발개발개발 2021. 9. 23. 20:48

[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를 추상화하여 제공하고 있다. 

 

 

  1. 어플리케이션이 RestTemplate를 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다.
  2. RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다.
  3. RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.
  4. ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
  5. RestTemplate 는 ResponseErrorHandler 로 오류를 확인하고 있다면 처리로직을 태운다.
  6. ResponseErrorHandler 는 오류가 있다면 ClientHttpResponse 에서 응답데이터를 가져와서 처리한다.
  7. RestTemplate 는 HttpMessageConverter 를 이용해서 응답메세지를 java object(Class responseType) 로 변환한다.
  8. 어플리케이션에 반환된다.
	 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 [빨간색코딩]

 

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

'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