유저가 GPT API를 호출하면 RestTemplate을 통해 동기로 처리를 진행했다.
그 이유는 gpt의 응답으로 DTO를 생성해서 유저한테 넘겨줘야 하기 때문에 RestTemplate를 선택했었다.
우선 RestTemplate을 바꾸려는 이유는 지원이 중단됐기 때문이다.
(많은 블로그에서 RestTemplate이 Deprecated가 되어 다음 버전에서 빠진다고 하는데 절대 아니다.)
예전 스프링 주석에는 Deprecated 내용이 적혀있었다지만, 이후에는 없어지고 유지보수 모드로 동작한다고 바뀌었다. 자세한 내용은 아래의 토비 님 유튜브를 보면 된다.
https://www.youtube.com/watch?v=S4W3cJOuLrU
스프링 6.1부터 동기 HTTP 처리를 위해 RestClient라는 것을 지원하기 시작했다.
또한, 비동기 처리를 위해서 WebClient도 제공을 한다.
RestTemplate이 지원이 중단된다고 해서 WebClient를 이용한 동기 모드로 사용을 고려했었는데 다음 2가지 때문에 철회했다.
- WebClient를 사용하기 위해서는 WebFlux를 추가해야 한다. (현재 스프링 MVC를 써서 동기를 디폴트로 쓰는데 저걸 위해 WebFlux를 추가해야 할 이유를 느끼지 못했다.)
- block()를 사용하려 했으나 공식문서에서 추천하지 않는 느낌이었다.(대신 Mono, Flux를 사용해라)
https://docs.spring.io/spring-framework/reference/web/webflux-webclient/client-synchronous.html
Synchronous Use :: Spring Framework
With Flux or Mono, you should never have to block in a Spring MVC or Spring WebFlux controller. Simply return the resulting reactive type from the controller method. The same principle apply to Kotlin Coroutines and Spring WebFlux, just use suspending func
docs.spring.io
그러다가 RestClient를 접하게 되었다.
RestClient는 스프링 6.1, 스프링부트 3.2부터 사용이 가능하다.
- WebFlux에 의존도가 없다.
- 최신형 동기식 HTTP 클라이언트
- 유창한 API 제공
https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-resttemplate
REST Clients :: Spring Framework
WebClient is a non-blocking, reactive client to perform HTTP requests. It was introduced in 5.0 and offers an alternative to the RestTemplate, with support for synchronous, asynchronous, and streaming scenarios. WebClient supports the following: Non-blocki
docs.spring.io
결국 선택지는 RestClient로 갈아탈 수밖에 없었다.
- RestTemplate는 우선 유지보수 모드로 전환되었다.(즉 더 이상의 개선은 없다.)
- 스프링이 동기 HTTP 대책으로 RestClient를 제공한다.
- 스프링에서 마이그레이션을 추천하는 느낌이다.(가이드가 존재)
RestClient를 사용하면 성능에 차이가 생기는지 궁금했다. 그래서 직접 테스트를 진행해 보았다.
우선 테스트를 위해 https://jsonplaceholder.typicode.com/posts 사이트를 이용했다. 편리하게 호출하면 json을 응답해 줘서 외부 api로 테스트 진행을 할 수 있다.
또한, 아래 테스트는 세마포어를 5개로 설정하여 진행했습니다.
RestTemplate 테스트
10명의 유저가 100번 반복 호출하는 테스트 진행.
5번의 테스트 결과 평균 83 TPS를 기록.
RestClient 테스트
10명의 유저가 100번 반복 호출하는 테스트 진행.
5번의 테스트 결과 평균 82 TPS를 기록.
결론 : 속도 차이는 없다.
기존 코드
ChatGPTResponseDTO chatGPTResponseDTO = restTemplate.postForObject(URL, requestDTO, ChatGPTResponseDTO.class);
개선 코드
ChatGPTResponseDTO chatGPTResponseDTO = restClient.post()
.uri(URL)
.body(requestDTO)
.retrieve()
.body(ChatGPTResponseDTO.class);
우선 체이닝을 통해 가독성이 훨씬 좋아졌다.
또한, WebClient랑 비슷한 형태로 구성이 가능해서 이 형식에 익숙해지는 것이 좋을 것 같다.(어차피 RestTemplate는 더 이상 사용되지 않을 예정이니..)
결론
- RestTemplate는 유지보수로 전환되었기에 WebClient, RestClient 중 하나를 선택해야 한다.
- 동기 작업을 진행한다면 RestClient, 비동기면 WebClient를 사용해야 한다.(단, WebClient를 사용하려면 WebFlux 의존성이 필요하다.).
- RestClient는 WebClient와 유사한 체이닝 방식을 사용해서 가독성이 좋다.
'프로젝트 > RESTAPI 추천 서비스' 카테고리의 다른 글
도커에 올려놓은 innodb 버퍼풀 사이즈 조정 (0) | 2024.07.15 |
---|---|
MySQL의 데이터를 안전하게 백업시켜놓자(Feat, 아마존리눅스2) (0) | 2024.07.06 |
naver 소셜 로그인 추가하기(feat, 리팩토링) (0) | 2024.07.01 |
확장성이 좋은 oauth 코드로 리팩토링하기 (0) | 2024.06.27 |