[spring] RestTemplate 정리

공수정·2021년 11월 5일
1

spring

목록 보기
7/32
post-custom-banner

1. RestTemplate이란?

  • spring 3.0부터 지원
  • spring에서 제공하는 http 통신 템플릿
  • http 통신을 단순화
  • RESTful 원칙을 지킴 (json, xml을 쉽게 응답 받음)
  • 기계적이고 반복적인 코드들을 깔끔하게 정리

2. 주요 메서드

메서드HTTP설명
getForObjectGETURL 주소로 GET 요청, return 객체
getForEntityGETURL 주소로 GET 요청, return ResponseEntity
postForLocationPOSTURL 주소로 POST 요청, return 헤더에 저장된 URI
postForObjectPOSTURL 주소로 POST 요청, return 객체
postForEntityPOSTURL 주소로 POST 요청, return ResponseEntity
executeanyRequest/ Response 콜백을 수정할 수 있음
exchangeanyHTTP 헤더를 새로 만들 수 있고 HTTP의 모든 메서드도 사용 가능

3. 사용

  1. Object로 받기
    getForObject나 postForObject를 사용할 때, 응답 xml이나 json에 맞는 Object가 필요함
    1) @XmlElement나 @JsonProperty를 사용하여 맵핑해주거나, 2) String으로 받아 JSONParser와 같이 parser를 이용하는 방법등이 있습니다.
  2. 에러처리
    DefaultResponseErrorHandler를 사용하여 HTTP Error 를 제어,restTemplate.setErrorHandler를 통해 커스텀 핸들러를 등록할 수 있습니다.
  3. 비동기 처리
    RestTemplate는 동기처리이고, 비동기 처리를 위해서는 org.springframework.web.client.AsyncRestTemplate를 사용해야 합니다.

4. 사용예시

Map<String, Object> map = new HashMap<>(); // 요청시 보낼 데이터
map.put("data, data);

RestTemplate restTemplate = new RestTemplate();
String result = "";
try{
	result = restTemplate.postForObject([요청보낼 uri], map, String.class);
}catch (Exception e) {
	    	e.printStackTrace();
}

JSONParser jsonParser  = new JSONParser();
Object obj = jsonParser.parse(result);
JSONObject jsonObj = (JSONObject) obj;

5. 동작 원리


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. 어플리케이션에 반환

참고
1. RestTemplate (정의, 특징, URLConnection, HttpClient, 동작원리, 사용법, connection pool 적용)
2. 스프링 RestTemplate 정리(요청 함)

profile
계속해서 공부하는 개발자입니다 :)
post-custom-banner

0개의 댓글