title: Spring의 RestTemplate에서 GET 이용 시 Header 설정
date: 2023-05-20
tags:
- Spring
Introduction
기존에는 외부 API 호출 시 WebFlux를 이용하였다.
다만 Non-Block으로 관리하는 것이 어려워 우선 Block을 이용하던 상황이었다.
Async 및 Non-Block의 이점을 위해 WebFlux를 사용하는 것인데, 잘못 사용하고 있다는 생각을 지울 수 없었다.
결국 Spring에서 지원하는 RestTemplate으로 간단히 이용하는 것을 고려하게 되었다.
다만 RestTemplate 구현 과정에서 Header가 설정되지 않는 문제가 발생하였다.
Problem
초기에는 아래와 같이 RestTemplate을 구성하였다.
public ResponseEntity<String> fetchBookFromNaverApi(String keyword, boolean searchRecent) {
long start = System.currentTimeMillis();
String naverBookApiUrl = "https://openapi.naver.com/v1/search/book_adv.xml?d_catg=280&d_titl=" + keyword;
if (searchRecent) {
naverBookApiUrl += "&sort=date";
}
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("X-Naver-Client-Id", keys.getNaverClientId());
httpHeaders.set("X-Naver-Client-Secret", keys.getNaverClientSecret());
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
return restTemplate.getForEntity(naverBookApiUrl, String.class, entity);
}
하지만 위 방식으로는 아래와 같이 정상적으로 데이터를 가져올 수 없었다.
이를 확인하기 위해 RestTemplate에 Interceptor를 설정하여 Request Header를 출력하였다.
ClientHttpRequestInterceptor Interface를 상속하여야 하지만, 당장 Header만 확인하는 용도이기에 Lambda를 이용하여 간단하게 구현하였다.
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList((request, body, execution) -> {
HttpHeaders headers = request.getHeaders();
headers.forEach((name, value) -> {
log.warn("{} : {}", name, value);
});
return execution.execute(request, body);
}));
설정한 X-Naver-Client-*
Header가 하나도 넘어가지 않는 것을 확인할 수 있었다.
Solution
RestTemplate에서 getForEntity
Method를 이용하더라도 추가 Header를 설정하지 않는다.
getForEntity
동작을 따라가다 보면 RestTemplate의 execute
Method까지 호출하게 된다.
위 사진에서 uriVariables
가 명시한 X-Naver-Client-*
Header가 들어있다.
하지만 expanded
에는 해당 Header들이 설정되지 않은 것을 확인할 수 있다.
getForEntity
대신 exchange
Method를 이용하면 Header를 설정할 수 있다.
public ResponseEntity<String> fetchBookFromNaverApi(String keyword, boolean searchRecent) {
String naverBookApiUrl = "https://openapi.naver.com/v1/search/book_adv.xml?d_catg=280&d_titl=" + keyword;
if (searchRecent) {
naverBookApiUrl += "&sort=date";
}
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("X-Naver-Client-Id", keys.getNaverClientId());
httpHeaders.set("X-Naver-Client-Secret", keys.getNaverClientSecret());
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
return restTemplate.exchange(naverBookApiUrl, HttpMethod.GET, entity, String.class);
}
Conclusion
RestTemplate에서 GET Method 이용 시 추가적인 Header 설정이 필요하다면 getForEntity
가 아닌 exchange
를 이용하여야 한다.
'Spring' 카테고리의 다른 글
Spring RestTemplate Test (0) | 2023.05.29 |
---|---|
Spring RestTemplate vs WebFlux (0) | 2023.05.20 |
Spring에서 정적 파일 로딩 시 ERR_ABORTED 404 (0) | 2023.05.18 |
Spring에서 yml 파싱 (0) | 2023.05.11 |
@Sql Annotation을 이용한 SQL Query 관리 (0) | 2023.05.10 |