WebFlux(WebClient)

Seung jun Cha·2023년 5월 1일
0

스프링 어플리케이션에서 HTTP 요청에 쓰이는 인터페이스는 RestTemplate과 WebClient가 있다. 둘 다 외부 API호출, 마이크로서비스 간 통신, 서버와의 HTTP 요청 및 응답처리에 사용된다.

  • RestTemplate 특징
    • RESTful 형식을 지원
    • RestTemplate을 사용하여 HTTP 요청을 보내고, 그 결과로 받은 응답을 파싱하여 객체로 변환하는 역할을 합니다. 이렇게 하면 외부 API와의 통신을 통해 받은 데이터를 자바 객체로 사용할 수 있게 됩니다.
      restTemplate.exchange(
      uri, HttpMethod.GET, httpEntity, KakaoResponseDto.class
      ).getBody();
  • 멀티 스레드 방식 : 요청당 스레드를 할당받아 처리, 스레드 풀을 사용하여 동시에 여러 요청을 처리
  • Blocking I/O기반의 동기 방식 API, 요청을 처리하는 동안 블로킹
  • JSP, Thymeleaf 등의 템플릿 엔진을 사용하여 뷰를 렌더링
  • 서블릿 기반 웹 애플리케이션 개발에 주로 사용
  • Spring 4.0에서 비동기 문제를 해결하고자 AsyncRestTemplate이 등장했으나, 현재 deprecated 됨
  • WebClient 특징
    • Spring 5.0 부터 지원
    • 싱글 스레드 방식 : CPU와 메모리를 많이 사용한다는 것이 단점
    • Non-Blocking 방식, 동기/비동기 모두 지원
    • Mono, Flux와 같은 리액티브 타입을 사용하여 비동기 데이터 스트림을 처리합니다.
    • 서블릿 기반이 아닌 Netty, Undertow, Tomcat 등의 서버를 사용, 서블릿 기반도 가능함

RESTful은 많이 들어봤지만 WebClient는 처음 들어봤다. 최신 방식이라고 하니 이번에 간단하게 정리해본다.

WebClient의 큰 특징은 Non-Blocking 방식이며, 동기/비동기 모두 지원한다는 점이다. Non-Blocking 방식이란 호출된 시스템의 결과를 기다리지 않고 다른 작업을 처리할 수 있다는 것이다

WebClient는 WebFlux에서 제공하는 기능이니까 WebFlux에 대해 알아보자
한 줄로 표현하면 이렇다
many request : 1 thread, async + Non-Blocking

  1. Non-Blocking : 하나의 작업을 처리하고 결과를 반환하기전에 다른 작업을 수행할 수 있다.
  • 입출력 작업이나 긴 작업을 수행하는 동안 CPU가 다른 작업을 할당해 자원을 최대한 활용할 수 있다.
  • 다중 스레드와 달리 스레드 간의 컨텍스트 스위칭이 발생하지 않아 CPU 부하와 메모리 사용을 최적화할 수 있다.
  • R2DBC : Non-Blocking를 지원하는 애플리케이션 스택이다.
  1. Reactive Stream : Reactive Stream은 비동기적인 데이터 처리를 위한 기반 인터페이스이다.
    Publisher, Subscriber, Subscription 간의 상호작용을 하는데 Publisher는 데이터를 생성하고 발행하는 역할을 담당하며, Subscriber는 데이터를 읽고 처리하는 역할을 담당한다. Subscription은 Publisher와 Subscriber 간의 연결을 관리하고 데이터의 요청과 취소를 제어하는 역할을 한다.

  2. Mono

  3. Flux

비동기와 논블로킹이 같은 개념인줄 알았는데 좀 다르다고 한다.
동기와 비동기, 블로킹과 논블로킹의 개념을 나중에 좀 더 명확히 알아봐야겠다.

참고
Spring WebFlux 어디가서 아는 '척' 하기

0개의 댓글