Spring WebClient란?
- 클라이언트에서 서버에 정보를 요청할 때, 웹에서 API를 호출하기 위해 사용되는 Http Client 모듈 중 하나 임
- Java에서 많이 사용하는 Http Client는 RestTemplate가 있음
RestTemplate & Spring WebClient
- RestTemplate와 Spring WebClient는 둘 다 Http Cient 모듈임
- 둘의 차이점은 RestTemplate는 Blocking 방식이고 WebClilent는 Non-Blocking 방식이라는 점(Block, Non-Block 관련 내용 참고)
- 네트워킹의 병목현상을 줄이고 성능을 향상시키기 위해 Non-blocking 방식인 Web Client방식이 더 선호 됨
RestTemplate 동작 방식
- RestTemplate는 Multi-Thread 와 Blocking 방식을 사용
- Thread pool은 요청자 어플리케이션 구동시에 미리 생성해두고 > Reqeust가 오면 Queue에 쌓고 가용한 Thread가 있으면 해당 Thread에 할당되어 처리 됨
- 즉, 1요청 당 1 스레드가 할당 됨
- 각 Thread에서는 Blocking 방식으로 처리되어 응답이 올때까지 그 Thread는 다른 요청에 할당될 수 없음
- 가용한 Thread가 다 찬 경우, Request는 큐에서 계속 대기 함.
- 네트워킹이나 DB 문제로 Thread가 다 찰 경우, 처리되지 못하고 계속 큐에 쌓이므로 서비스 성능 문제로 이어짐
- 결국 대용량 트래픽 서비스에서는 좋지 않은 방법임
Spring WebClient 동작 방식
- Spring WebClient는 Single Thread와 Non-Blocking방식을 사용
- 각 Request는 Event Loop 내에 Job으로 등록되며, Event Loop는 각 Job을 제공자(서버)에 요청한 후, 결과를 기다리지 않고 다른 Job을 처리 함
- Event Loop는 제공자로부터 callback으로 응답이 오면, 결과를 요청자에게 제공 함
- 위와 같이 Spring WebClient는 이벤트에 Reactive(반응형)으로 동작 함
- 반응성, 탄력성, 기용성, 비동기성을 보장하는 Spring React 프레임워크를 사용
- React Web 프레임워크인 Spring WebFlux에서 Http Client로 사용 됨
Spring WebFlux
- Spring 5.0 버전에서 추가된 reactive-stack의 web 프레임워크
- non-blocking, Reactive-Stream이 지원되며, Netty, Undertow, Sevlet Containers와 같은 서버에서도 동작 함
Reative Streams, Reactor, Mono, Flux
Mono, Flux 사용 예제