Spring WebClient

YH·2023년 2월 13일
0

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-ThreadBlocking 방식을 사용
  • 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 사용 예제

profile
하루하루 꾸준히 포기하지 말고

0개의 댓글