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 헤더를 생성한다.
/*** headers parameter* @param params* @return*/public HttpEntity<?> apiClientHttpEntity(String params) {HttpHeaders reqHeaders = new HttpHeaders();reqHeaders.set("X-Client-Id", this.getACCESS_KEY());reqHeaders.set("X-Client-Secret", this.getSECRET_KEY());reqHeaders.set("Content-type", "application/json");reqHeaders.set("Accept", "application/json");return new HttpEntity<Object> (params, reqHeaders);}
② apiCall 메소드
- apiClientHttpEntity 에 전송할 파라미터 데이터를 담아서 RestTemplate 로 호출한다.
- responseEntity.getBody() 데이터를 리턴한다.
@ResponseBody@RequestMapping(value = "/apiCall")public ResponseEntity<JSONObject> apiCall(HttpServletRequest request, HttpServletResponse response) throws ClientProtocolException, IOException {boolean pass = false;JSONObject param = new JSONObject();param.put("APP_KEY", this.getACCESS_KEY());HttpEntity<?> requestEntity = apiClientHttpEntity(param.toString());RestTemplate restTemplate = new RestTemplate();MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();restTemplate.getMessageConverters().add(converter);ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JSONObject.class);HashMap<String, Object> map = new HashMap<String, Object>();map.put("retMessage", responseEntity.getBody().get("MESSAGE"));map.put("retMessageCode", responseEntity.getBody().get("MESSAGE_CODE"));map.put("status", responseEntity.getBody().get("STATUS"));try {apiService.insertLog(map);pass = true;} catch (Exception e) {e.printStackTrace();} finally {if(!pass) {JSONObject retJson = new JSONObject();retJson.put("MESSAGE_CODE", "4444");retJson.put("MESSAGE", "알수없는 오류가 발생했습니다.\r\n관리자에게 문의하세요.");return ResponseEntity.ok(retJson);}}return ResponseEntity.ok(responseEntity.getBody());}
