티스토리 뷰

Backend

왜 나는 RestClient를 선택했는가

seungwonlee 2025. 9. 23. 11:31

스프링부트 3 버전 프로젝트를 진행하면서 예전처럼 RestTemplate을 활용해 외부 api를 호출했었습니다. 그런데 스프링 부트 3부터는 RestTemplate가 deprecated 된다는 얘기를 들은 적이 있었고 WebFlux의 등장 이후에는 WebClient 사용이 권장된다는 점도 알고 있었습니다.

 

하지만 토비 님의 유튜브 내용을 확인해 보니 RestTemplate가 삭제되는 것이 아닌 더 이상 새로운 기능이 추가되지 않고 버그 수정만 이루어지는 유지보수 모드라는 사실을 알게 되었습니다. 덕분에 흔히 생길 수 있는 오해와 진실을 바로 잡을 수 있었습니다.

 

어떤 방식으로 개발해야 할지 고민이 되었다. WebClient를 사용하려면 WebFlux 의존성을 추가해야 한다는 점이 부담스러웠고 비동기 환경인 프로젝트도 아닌 데 불필요하다 생각했습니다. 찾아보니 스프링부트 3.2부터 나온 새로운 동기식 HTTP 클라이언트가 존재했습니다. RestClient로 RestTemplate을 대체할 수 있으며 의존성도 추가할 필요가 없습니다. WebClient와 비슷하게 체이닝 방식으로 코드를 작성합니다. 그래서 기존 RestTemplate에서 모던한 RestClient로 전환해 보았습니다.

RestTemplate

URI uri = UriComponentsBuilder.fromHttpUrl("https://dapi.kakao.com/v3/search/book")
        .queryParam("target", "title")
        .queryParam("query", title)
        .build()
        .encode(StandardCharsets.UTF_8)
        .toUri();

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.AUTHORIZATION, REST_API_KEY);
headers.setAccept(List.of(MediaType.APPLICATION_JSON));
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);

ResponseEntity<KakaoBookSearchDto> response = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, KakaoBookSearchDto.class);

if (!response.getStatusCode().equals(HttpStatus.OK)) {
    throw new CoreException(ErrorType.BOOK_EXTERNAL_SERVICE_ERROR, title);
}
return response.getBody();

RestClient

String API_URL = "https://dapi.kakao.com/v3/search/book";
URI uri = UriComponentsBuilder.fromHttpUrl(API_URL)
        .queryParam("target", "title")
        .queryParam("query", title)
        .build()
        .encode(StandardCharsets.UTF_8)
        .toUri();

return RestClient.create()
        .get()
        .uri(uri)
        .header(HttpHeaders.AUTHORIZATION, REST_API_KEY)
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .onStatus(HttpStatusCode::isError, (req, res) -> {
            throw new CoreException(ErrorType.BOOK_EXTERNAL_SERVICE_ERROR, title);
        })
        .body(KakaoBookSearchDto.class);

나의 생각

무엇을 선택하든 팀 내 합의와 의견으로 결정되겠지만 프로젝트가 동기식으로 진행된다면 기존에 익숙한 RestTemplate을 그대로 사용하는 것도 무방하다고 생각됩니다. 다만 RestClient는 WebClient처럼 모던한 API 스타일을 제공하면서도 추가 의존성이 필요 없고 러닝 커브도 크지 않습니다. 실제로 적용해 보니 코드 가독성이 좋아졌고 체이닝 방식 덕분에 의도도 더 명확해졌다고 생각됩니다. 특히 현재 프로젝트가 Spring boot 3 기반의 신규 프로젝트이라면 장기적인 관점에서 RestClient를 도입하는 것이 더 합리적이라고 생각됩니다. 미래 HTTP 프로토콜이나 스프링의 변화에 대응하기에 좋은 투자라고 생각됩니다.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함