여러 풋살 매칭 플랫폼에 요청을 보내 데이터를 가공하여 내보내는 '풋살파인더' 프로젝트가 있다.
만약 요청을 보낸 여러 플랫폼 중 특정 플랫폼이 응답하지 않는다면?
응답하지 않는 플랫폼은 제외하고, 나머지 데이터만 가공해서 내려주어야 한다.
//플랫폼 별 요청코드
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를 주입받아서 사용하는 방식으로 변경하였다.
특정 헤더 값을 제외하고 요청을 보내보니, 설정한 타임아웃 만큼 시간이 지나자 예외가 발생하였고, 로그가 남은 것을 확인할 수 있다.
풋살파인더도 무한정 대기하지 않고, 응답이 오지않은 플랫폼을 제외하고 데이터를 응답하였다.