AI 법률 상담 서비스 프로젝트(스스Law)에서는 외부 API와의 통신이 필요했다.
Langchain을 사용해 만든 법률 지식과 판례를 학습 시킨 ollama3 모델과 소통해야하기 때문이다.
알고있는 외부 API 소통 방법은 RestTemplate 밖에 없었기에 추가로 찾아보면서 외부 API 소통 방식을 결정하기로 했었다.
아래는 고민을 하면서 노션에 정리했던 내용을 다듬은 것이다.
백엔드 서버와 AI 서버는 개별적으로 배포하며 외부 API 통신을 하며 정보를 주고 받는다.
Spring에서 외부 API를 호출하는 방법
외부 API를 호출하는 방법에는 RestTemplate, WebClient를 제외하고도 Java에서 제공하는 HttpURLConnection/URLConnection, Apache HttpClient, HttpClient 등이 있다.
RestTemplate
외부 API를 호출하고 응답값을 받아오는 방법 중 가장 간단한 방법이라고 생각한다.
Spring 3.0부터 지원하는 객체로 간편하게 Rest 방식으로 API를 호출할 수 있는 Spring 내장 클래스이다.
특징
단점
사용하기 편한 RestTemplate이지만 명확한 단점이 존재한다.
위에서 언급한 것처럼 RestTemplate는 Multi-thread, Blocking 방식으로 동작된다.
때문에 Thread가 다 찬 경우 Queue에서 대기를 하게 되고 가용 가능한 스레드 수가 줄어들어 병목 현상이 나타나 서비스 성능이 저하될 수 있다.
WebClient
RestTemplate의 단점은 WebClient를 사용하면 해결할 수 있다.
WebClient는 Spring 5에서 추가된 인터페이스로 RestTemplate와 다르게 Single-thread, Non-Blocking 방식을 사용한다.
특징
단점
동작 방식을 간단하게 살펴보면
1. 각 요청은 Event loop 내의 job로 등록된다.
2. event loop는 각 job를 제공자에게 요청하고 결과를 기다리지 않고 다른 job를 처리한다.
3. event loop는 제공자로부터 callback로 응답이 오면 그 결과를 요청자에게 전달한다.
이러한 Non-Blocking(비동기) 방식으로 동작하기 때문에 RestTemplate보다 더 성능이 좋다.
결론적으로 나는 WebClient를 사용했다.
물론 WebClient는 선수 지식이 필요하다는 단점이 존재하긴 했지만 서비스의 응답 속도와 AI와의 소통에 최소한의 딜레이만 남기고 싶었기 때문에 WebClient를 공부해서 사용하기로 결정했다.
물론 이외에도 RestTemplate을 사용하지 않은 이유도 추가로 존재한다.
RestTemplate에 대해 구글링을 하다보면 deprecate 되었다는 얘기가 많은데 이는 사실이 아니고 유지관리모드에 있는 상태이다.
Java Doc에서 WebClient 사용을 권고하고 있고, RestTamplate는 동기적인 기술이기 때문에 서비스에서 대규모 요청이 들어올 것을 대비해서 비동기/넌블로킹 방식을 지원하는 WebClient을 사용하기로 결정했다.
Spring 6.1에서 RestClient라는 WebClient의 대체제가 등장했다.
WebClient와 유사한, Fluent한 문법을 구사한다. 심지어 RestTemplate의 설정을 그대로 사용할수도 있다고 한다. WebClient에서 RestClient로 변경할 필요성을 느낀다면 프로젝트 v2에서 적용할 것 같다.
출처
[https://docs.spring.io/spring-framework/reference/integration/rest-clients.html](Spring 6.0 Reference - WebClient)
New in Spring 6.1: RestClient
Rest in Spring 3: RestTemplate