본문 바로가기
SPRING

[SPRING] RestTemplate

by 김뚱 2019. 7. 4.

RESTful 원칙을 지키면서 HTTP 서버와의 통신이 단순하다.

 

1.초기화

import org.springframework.web.client.RestTemplate;

 

RestTemplate requestSend = new RestTemplate(ClientHttpRequestFactory requestFactory);

 

ResponseEntity rslt = null;

 

rslt = requestSend.exchange(url, method, requestEntity, responseType);

 

Create a new instance of the RestTemplate based on the given ClientHttpRequestFactory.

Parameters:

    requestFactory HTTP request factory to use

See Also :  org.springframework.http.client.SimpleClientHttpRequestFactoryorg.springframework.http.client.HttpComponentsClientHttpRequestFactory

 

ClientHttpRequestFactory는 기본 HTTP 클라이언트 라이브러리에 대한 구성 옵션을 제공한다.

 

 

2.Method

 

exchange 

HTTP 메서드, URI, 헤더 및 본문을 포함한 RequestEntity를 입력받아 ResponseEntity를 리턴

 

Execute the HTTP method to the given URI template, writing the given request entity to the request, and returns the response as ResponseEntity.Specified by: exchange(...) in RestOperations

Type Parameters: <T>

Parameters:url the URLmethod the HTTP method (GET, POST, etc)requestEntity the entity (headers and/or body) to write to the request, may be nullresponseType the type of the return value

Returns:the response as entity

Throws:RestClientException

 

 

3.주의사항(Connection Issue)

최근 하나의 회사가 제공하는 서비스의 규모가 커지고 복잡해지면서 이 서비스를 지탱하기 위해서 큰 서비스를 여러 개의 작은 서비스로 나누고 개발, 배포 하는 Micro Service Architectur(이하: MSA) 가 유행하고 있다. 이렇게 MSA에서는 각 서비스들은 독립적이며 자신을 Restful API로 자신을 노출 시킨다. 

MSA에서 각 서비스들은 서로 독립적 이기는 하나 그렇지 못한 부분들이 존재 할 수 있다. 예를 들어 사용자의 인증 및 권한 부여 같은 경우 서비스들의 독립성을 위해 각 서비스 마다 구현 또는 라이브러리를 넣고 사용 할 수 있지만 이렇게 되면 개발 언어마다 사용자 인증, 권한부여 로직을 구현을 해야 하며 관리 또한 복잡하게 된다. 

그래서 인증 및 권한 부여 서비스를 따로 만들고 Restful API명세를 통해 다른 서비스에서 사용자에 대한 권한을 체크 하는 방법을 사용 할 수 있다. 

이 방법을 사용하기 위해서 Spring에서는 RestTemplate을 사용할 수 있는데 이 RestTemplate을 사용시 주의해야 할 점 그리고 해결책에 대해서 설명한다. 


RestTemplate은 Spring 으로 구현된  A서버에서 Spring으로 구현된 B서버로 요청을 보낼때 사용하는 객체로서 상당히 무거운 객체이다. 그만큼 내부적으로 하는일이 많다는 말인데 이 RestTemplate은 요청을 할 때마다 Connection을 만들게 된다. 

이렇게 만들어진 Connection들은 서버의 자원을 점차 차지하면서 서비스 배포 초기에는 멀쩡하던 서버가 아무 이유 없이 죽거나 속도가 급격히 느려 질 수 있거나 A서버가 B서버를 호출 하지 못하고 계속 대기하는 상태가 될 수 있다.

 

Tomcat Heap Size Issue

서비스를 배포하고 테스트를 하는데 서버들간의 호출이 일어나면서 갑자기 heap 메모리 관련 오류가 발생하는 것을 확인 할 수 있다. 이것은 Connection이 생성되면서 허용 가능한 heap 메모리 크기를 넘어 섯기 때문이다. 이렇게 되면 커넥션 수를 줄여주거나 Tomcat의 heap 메모리 크기를 늘려 주면 해결 할 수 있다.

4.connection pool 설정하기

이 RestTemplate으로 http 요청을 날리게되면 기본적으로 그때마다 connection을 맺고 응답을 받으면 끊게된다. 이를 db connection pool 처럼 connection pool을 만들어서 관리할 수 있다.

 

이를 설정하기위해서는 일단 RestTemplate에 대해서 먼저 이해를 해야하는데 Spring 에서 제공하는 RestTemplate은 직접 http 요청을 하는 역할을 수행하지않는다. 직접 수행하는 클래스를 한번 래핑한 어댑터 역할을 하는 클래스이다. 기본적으로는 jdk에서 제공하는 HttpUrlConnection 클래스를 이용한다. 우리는 apache 에서 제공하는 HttpClient 클래스를 이용하려한다.

 

/** * Create a new instance of the {@link RestTemplate} based on the given {@link ClientHttpRequestFactory}. 
 * @param requestFactory the HTTP request factory to use 
 * @see org.springframework.http.client.SimpleClientHttpRequestFactory 
 * @see org.springframework.http.client.HttpComponentsClientHttpRequestFactory 
 */ 
public RestTemplate(ClientHttpRequestFactory requestFactory) { 
    this(); 
    setRequestFactory(requestFactory); 
} 


RestTemplate을 보면 디폴트 생성자 외에 ClientHttpRequestFactory 인터페이스를 받는 생성자가있다. javadoc에 나와있는대로 SimpleClientHttprequestFactory와 HttpComponentsClientHttpRequestFactory가 대표적인 구현체이다.

 

클래스명만봐도 알겠지만 따로 인자를 보내주지않으면 기본적으로 SimpleClientHttpRequestFactory를 사용하게된다. 그리고 이게 위에서 말한 jdk의 HttpUrlConnection을 이용하는것이다.

 

/** 
 * Create a new instance of the {@code HttpComponentsClientHttpRequestFactory} 
 * with a default {@link HttpClient} based on system properties. 
 */ 
public HttpComponentsClientHttpRequestFactory() { 
    this.httpClient = HttpClients.createSystem(); 
}  

/** 
 * Create a new instance of the {@code HttpComponentsClientHttpRequestFactory} 
 * with the given {@link HttpClient} instance. 
 * @param httpClient the HttpClient instance to use for this request factory 
 */ 
public HttpComponentsClientHttpRequestFactory(HttpClient httpClient) { 
    this.httpClient = httpClient; 
} 

생성자를 따라가보면 HttpClient를 매개변수로 받는걸 알 수 있다. 그리고 위에 디폴트 생성자를 보면 createSystem() 이라는 팩토리 메서드를 이용하는걸 볼 수 있는데 이경우 기본 system properties를 이용해서 HttpClient 객체를 생성하게된다.

 

우리는 이 HttpClient 객체를 만들어야하는것이다. HttpClient 객체를 만들기위한 유틸클래스로 HttpClients 가 있다.



 

 

Reference

https://docs.spring.io/spring/docs/5.1.0.RC1/spring-framework-reference/web.html#webmvc-resttemplate

 

Web on Servlet Stack

This part of the reference documentation covers support for Servlet stack, WebSocket messaging that includes raw WebSocket interactions, WebSocket emulation via SockJS, and pub-sub messaging via STOMP as a sub-protocol over WebSocket. 4.1. Introduction The

docs.spring.io

https://docs.spring.io/spring/docs/5.1.0.RC1/spring-framework-reference/integration.html#rest-client-access

 

Integration

This part of the reference documentation covers the Spring Framework’s integration with a number of Java EE (and related) technologies.

docs.spring.io

https://hoonmaro.tistory.com/46

 

마로의 Spring Framework 공부 - RestTemplate

RestTemplate RestTemplate 은 HTTP 클라이언트 라이브러리를 통해 높은 수준의 API를 제공한다. REST 엔드포인트를 코드 한줄로 호출하기 쉽게 해준다. 오버로드된 메소드들은 다음과 같다. RestTemplate methods..

hoonmaro.tistory.com

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

RestTemplate (Spring Framework 5.1.8.RELEASE API)

Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others. The RestTemplate offers templates for common scenarios by HTTP m

docs.spring.io

https://sjh836.tistory.com/141

 

RestTemplate (정의, 특징, URLConnection, HttpClient, 동작원리, 사용법, connection pool 적용)

참조문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html 1. RestTemplate이란? spring 3.0 부터 지원한다. 스프링에서 제공하는 http..

sjh836.tistory.com

https://jodu.tistory.com/46

 

Spring RestTemplate사용시 주의 사항

서론 최근 하나의 회사가 제공하는 서비스의 규모가 커지고 복잡해지면서 이 서비스를 지탱하기 위해서 큰 서비스를 여러 개의 작은 서비스로 나누고 개발, 배포 하는 Micro Service Architectur(이하: MSA) 가 유..

jodu.tistory.com

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html

 

HttpClientBuilder (Apache HttpClient 4.5.9 API)

 HttpClientBuilder evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit)           Makes this instance of HttpClient proactively evict idle connections from the connection pool using a background thread.

hc.apache.org

https://multifrontgarden.tistory.com/249

 

RestTemplate connection pool 설정하기

Spring 에서 제공하는 http client로는 대표적으로 RestTemplate이 있다. 이 RestTemplate으로 http 요청을 날리게되면 기본적으로 그때마다 connection을 맺고 응답을 받으면 끊게된다. 이를 db connection pool..

multifrontgarden.tistory.com

 

728x90
반응형

'SPRING' 카테고리의 다른 글

[SPRING] ResponseEntity  (1) 2019.07.05
[SPRING] Task Scheduler 설정 및 사용방법  (0) 2019.07.02
[SPRING] Tomcat JNDI 설정  (0) 2019.06.16
[SPRING] 파일업로드  (0) 2019.03.06

댓글