[Spring] RestTemplate 커스텀 설정

WOOK JONG KIM·2022년 11월 8일
0
post-thumbnail
post-custom-banner

RestTemplate는 HTTPClient를 추상화 하고잇음
-> 둘의 가장 큰 차이는 커넥션 풀

RestTemplate는 기본적으로 커넥션 풀 지원 X
-> 호출할때마다 포트를 열어 커넥션을 생성하는데, TIME_WAIT 상태가 된 소켓을 다시 사용하려고 접근한다면 재사용 못함

이를 해결하기 위해 커넥션 풀 기능을 활성화해서 재사용 가능하도록 아파치 에서 제공하는 HttpClient로 대체하여 사용함

아파치의 HttpClient를 사용하기 위해 의존성 추가

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
</dependency>

의존성 추가시 RestTemplate의 설정을 더욱 쉽게 추가하고 변경 가능

커스텀 RestTemplate 객체 생성 메서드

public RestTemplate restTemplate(){
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        
        HttpClient client = HttpClientBuilder.create()
                .setMaxConnTotal(500)
                .setMaxConnPerRoute(500)
                .build();

        CloseableHttpClient httpClient = HttpClients.custom()
                .setMaxConnTotal(500)
                .setMaxConnPerRoute(500)
                .build();
        
        factory.setHttpClient(httpClient);
        factory.setConnectTimeout(2000);
        factory.setReadTimeout(5000);
        
        RestTemplate restTemplate = new RestTemplate(factory);
        
        return restTemplate;
    }
}

ClientHttpRequestFactory는 함수형 인터페이스로 대표적인 구현체로는
-> SimpleHttpRequestFactoryHttpComponentsClientHttpRequestFactory가 있음

별도의 구현체를 설정해서 전달하지 않으면 HttpAccessor에 구현되어 있는 내용에 의해 SimpleClientHttpRequestFactory 사용

HttpComponentsClientHttpRequestFactory로 객체를 생성해서 ClientHttpRequestFactory로 사용하면 Timeout 설정 가능

또한 커넥션 풀을 설정하기 위해 HttpClient를 HttpComponentsClientHttpRequestFactory에 설정 가능

Http Client 생성 방법
1. HttpClientBuilder.create()
2. HttpClients.custom()

setHttpClient인자로 전달해서 설정 가능
-> 이 경우 factory 객체를 RestTemplate로 초기화하는 과정에서 인자로 전달

HttpClient 와 CloseableHttpClient의 기능 면에서 차이를 짚고 넘어가도록 하자!

profile
Journey for Backend Developer
post-custom-banner

0개의 댓글