본문 바로가기

Spring/Spring Web MVC

Spring RestTemplate

반응형

RestTemplate란?

Spring 3.0 부터 지원, 스프링이 제공하는 HTTP 통신에 유용하게 사용 할 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지키고 있다.

RestTemplate는 Spring에서 제공하고 있는 JdbcTemplate같은 Template로, RESTful Service 호출과 응답에 관련된 여러 메소드를 제공하고, REST 클라이언트를 쉽게 개발할 수 있도록 만들어진 Template이다.

  • 기계적이고 반복적인 코드를 최대한 줄여줌 - url이랑 response 받을 Class나  Object 설정 등
  • RESTful 형식에 맞춤
  • json, xml을 쉽게 응답 받음

RestTemplate에서 제공하는 getForObject() 메소드를 사용하면 서버로부터 어떤 리소스를 조회하는 기능을 구현할 수 있고, postForLocation() 메소드를 사용하면 서버 측에 리소스를 생성하거나 수정하는 기능을 구현할 수 있다.

GoogleGeocodeResult response = new RestTemplate().getForObject(apiSendUrl, GoogleGeocodeResult.class);

약간 위와 같은 느낌...

 


HTTP 서버와의 다양한 통신방법 두 가지

URLConnection

jdk 1.2 부터 내장되어 있었으며, java.net 패키지에 있다. URL의 내용을 읽어오거나, URL 주소에 GET, POST로 데이터를 전달 할 때 사용한다. 또한 HTTP 프로토콜 이외에도 가능하다.(File 등)

  1. new URL("http:// ....")
  2. openConnection()
  3. URLConnection
  4. getInputStream, getOutputStream
  5. InputStream, OutputStream 처리

문제점

  • 응답코드가 4xx 거나 5xx 면 IOException 이 터진다.
  • 타임아웃을 설정할 수 없다.
  • 쿠키 제어가 불가

HttpClient

3.x일 땐 apache commons 의 프로젝트였다가 승급해서, 아파치 탑 프로젝트가 되었다. 4.x부터는 Apache HttpComponents 로 불린다. maven dependency 를 설정하거나, http://hc.apache.org/downloads.cgi 에서 다운로드할 수 있다. org.apache.http 패키지에 있다.보통 아래처럼 사용한다.

  1. CloseableHttpClient httpclient = HttpClients.createDefault();
  2. 메소드에 따라 new HttpGet("http:// ....");
  3. CloseableHttpResponse response = httpclient.execute(httpget);
  4. HttpEntity entity = response.getEntity();
  5. Stream으로 entity.getContent() 처리 등

URLConnection 와 비교하였을 때 장점

  • 모든 응답코드를 읽을 수 있다. httpResponse.getStatusLine().getStatusCode()
  • 타임아웃 설정 가능
  • 쿠키 제어가 가능

문제점

  • URLConnection 을 이용한 방식보다 코드가 간결해졌지만, 여전히 반복적이고 코드들이 길다.
  • 스트림 처리 로직을 별도로 짜야한다. (EntityUtils 를 쓰면 되는거 같긴하지만)
  • 응답의 컨텐츠타입에 따라 별도 로직이 필요하다. (RestTemplate 가 이때 유용!!)

RestTemplate의 동작원리

org.springframework.http.client 패키지에 있다. HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient 를 추상화(HttpEntity의 json, xml 등)해서 제공해준다. 따라서 내부 통신(HTTP 커넥션)에 있어서는 Apache HttpComponents 를 사용한다. 만약 RestTemplate 가 없었다면, 직접 json, xml 라이브러리를 사용해서 변환해야 했을 것이다.

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



출처: 
https://sjh836.tistory.com/141 [빨간색코딩]

반응형

'Spring > Spring Web MVC' 카테고리의 다른 글

ResponseEntity란?  (0) 2021.03.28
URI 패턴  (1) 2021.03.03
RESTful API  (0) 2021.02.25
서블릿 리스너와 필터  (3) 2020.12.30
Environment - 프로파일  (2) 2020.11.24