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 등)
- new URL("http:// ....")
- openConnection()
- URLConnection
- getInputStream, getOutputStream
- 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 패키지에 있다.보통 아래처럼 사용한다.
- CloseableHttpClient httpclient = HttpClients.createDefault();
- 메소드에 따라 new HttpGet("http:// ....");
- CloseableHttpResponse response = httpclient.execute(httpget);
- HttpEntity entity = response.getEntity();
- 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 라이브러리를 사용해서 변환해야 했을 것이다.
- 어플리케이션이 RestTemplate를 생성하고, URI, HTTP 메소드 등의 헤더를 담아 요청한다.
- RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다.
- RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.
- ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
- RestTemplate 는 ResponseErrorHandler 로 오류를 확인하고 있다면 처리로직을 태운다.
- ResponseErrorHandler 는 오류가 있다면 ClientHttpResponse 에서 응답데이터를 가져와서 처리한다.
- RestTemplate 는 HttpMessageConverter 를 이용해서 응답메세지를 java object(Class responseType) 로 변환한다.
- 어플리케이션에 반환된다.
출처: 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 |