SpringBoot RestTemplate example 정의 및 사용방법 예제

가이드문구

RestTemplate 이란?

- Spring 3.0부터 지원되는 REST API 호출 이후 응답을 받을 때까지 기다리는 동기 방식으로 http 통신에 유용하게 쓸 수 있는 템플릿

- http 서버와의 통신을 단순화하고 Restful 원칙을 지킨다.

- JSON, XML을 쉽게 응답받는다.


RestTemplate 동작구조

- HttpClient는 Http를 사용하여 통신하는 범용 라이브러리이고 RestTemplate는 HttpClient를 추상화 (HttpEntity의 JSON, XML 등) 으로 제공한다.


① Application이 RestTemplate를 생성하고 URI, HTTP 메소드 등의 헤더를 담아서 Request 한다.

② RestTemplate는 HttpMessageConverter 클래스를 사용하여 requesetEntity를 요청 메시지로 변환한다.

③ RestTemplate는 ClientHttpRequestFactory로부터 ClientHttpRequest 정보를 받아와 request 한다.

④ ClientHttpRequest 는 요청메시지를 만들어 Http 프로토콜을 통해 API 서버와 통신한다.

⑤ RestTemplate 는 ResponseErrorHandler 인터페이스로 오류가 있는지 확인하고 처리 로직을 실행

⑥ ResponseErrorHandler 는 오류가 있으면 ClientHttpResponse 에서 응답 데이터를 받아와서 처리한다.

⑦ RestTemplate 는 HttpMessageConverter 클래스를 이용해서 응답 데이터를 JAVA Object로 변환

⑧ Application 으로 반환한다. ( JSON, XML )


사용 예제

① apiClientHttpEntity 메소드

- RestTemplate 헤더를 생성한다.

  1. /**
  2. * headers parameter
  3. * @param params
  4. * @return
  5. */
  6. public HttpEntity<?> apiClientHttpEntity(String params) {
  7. HttpHeaders reqHeaders = new HttpHeaders();
  8. reqHeaders.set("X-Client-Id", this.getACCESS_KEY());
  9. reqHeaders.set("X-Client-Secret", this.getSECRET_KEY());
  10. reqHeaders.set("Content-type", "application/json");
  11. reqHeaders.set("Accept", "application/json");
  12. return new HttpEntity<Object> (params, reqHeaders);
  13. }



② apiCall 메소드

- apiClientHttpEntity 에 전송할 파라미터 데이터를 담아서 RestTemplate 로 호출한다.

- responseEntity.getBody() 데이터를 리턴한다.

  1. @ResponseBody
  2. @RequestMapping(value = "/apiCall")
  3. public ResponseEntity<JSONObject> apiCall(HttpServletRequest request, HttpServletResponse response) throws ClientProtocolException, IOException {
  4. boolean pass = false;
  5. JSONObject param = new JSONObject();
  6. param.put("APP_KEY", this.getACCESS_KEY());
  7. HttpEntity<?> requestEntity = apiClientHttpEntity(param.toString());
  8. RestTemplate restTemplate = new RestTemplate();
  9. MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
  10. restTemplate.getMessageConverters().add(converter);
  11. ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JSONObject.class);
  12. HashMap<String, Object> map = new HashMap<String, Object>();
  13. map.put("retMessage", responseEntity.getBody().get("MESSAGE"));
  14. map.put("retMessageCode", responseEntity.getBody().get("MESSAGE_CODE"));
  15. map.put("status", responseEntity.getBody().get("STATUS"));
  16. try {
  17. apiService.insertLog(map);
  18. pass = true;
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. } finally {
  22. if(!pass) {
  23. JSONObject retJson = new JSONObject();
  24. retJson.put("MESSAGE_CODE", "4444");
  25. retJson.put("MESSAGE", "알수없는 오류가 발생했습니다.\r\n관리자에게 문의하세요.");
  26. return ResponseEntity.ok(retJson);
  27. }
  28. }
  29. return ResponseEntity.ok(responseEntity.getBody());
  30. }

작성자 소개
초이 프로필
WrapUp 블로거

초이

반려견을 좋아하고, 차를 좋아하고, 여행을 좋아하고, 맛집을 찾아 즐기는 웹 개발자 입니다^^