RestTemplate 타임아웃 적용

준하·2025년 2월 3일
0

여러 풋살 매칭 플랫폼에 요청을 보내 데이터를 가공하여 내보내는 '풋살파인더' 프로젝트가 있다.

만약 요청을 보낸 여러 플랫폼 중 특정 플랫폼이 응답하지 않는다면?
응답하지 않는 플랫폼은 제외하고, 나머지 데이터만 가공해서 내려주어야 한다.

기존 코드

//플랫폼 별 요청코드
ResponseEntity<String> response = new RestTemplate().exchange(
    requestUrl,
    HttpMethod.GET,
    new HttpEntity<>(new HttpHeaders()),
    String.class
);

기존코드는 new RestTemplate()으로 매 요청마다 새롭게 RestTemplate 객체를 생성하여 각 플랫폼에 요청을 보낸다.

이 방식은 타임아웃을 설정하지 않아, 특정 플랫폼이 응답하지 않는다면 상당히 오랜시간 대기하여 전체 응답속도가 매우 느려지는 문제가 발생하였다.

또한 매번 RestTemplate() 객체를 생성하는 것도 메모리 낭비가 발생한다.

개선

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(Timeout.ofSeconds(3)) // 연결 타임아웃
                .setResponseTimeout(Timeout.ofSeconds(3))  // 읽기 타임아웃
                .build();

        CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultRequestConfig(requestConfig)
                .build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);

        return new RestTemplate(factory);
    }

}

RestTemplateConfig를 통해 연결 타임아웃, 응답 타임아웃을 설정하고
RestTemplate을 싱글톤으로 관리한다.

이후 RestTemplate를 주입받아서 사용하는 방식으로 변경하였다.

특정 헤더 값을 제외하고 요청을 보내보니, 설정한 타임아웃 만큼 시간이 지나자 예외가 발생하였고, 로그가 남은 것을 확인할 수 있다.

풋살파인더도 무한정 대기하지 않고, 응답이 오지않은 플랫폼을 제외하고 데이터를 응답하였다.

profile
A Sound Code in a Sound Body💪

0개의 댓글