백엔드/Spring

[Spring Boot Webflux] 흐름 및 주요 특징

MINJIN's 2024. 1. 12. 12:33

1. Spring Boot Webflux란?

  Spring Boot WebFlux는 Spring Framework의 일부로, 비동기 및 이벤트 기반의 리액티브 프로그래밍을 지원하는 모듈이다. 이 모듈은 Spring Framework 5부터 도입되었으며, 전통적인 Spring MVC 프레임워크와 달리, WebFlux는 Reactive Streams 스펙을 기반으로 하는 리액티브 프로그래밍 모델을 제공한다.

 

2. Webflux의 특징

1) 반응형 프로그래밍(Reactive Programming)

  Spring Webflux는 반응형 프로그래밍 방식을 통해 이벤트 기반의 비동기식 애플리케이션을 구축할 수 있다. 스레드 대신 데이터 스트림에 초점을 마추고 있으며, 이는 대량의 동시 요청을 처리하는 애플리케이션의 확장성과 응답성을 향상시키는데 매우 효과적이다. WebFlux는 Project Reactor와 같은 라이브러리를 사용하여 데이터를 비동기적으로 처리하기 위한 반응형 유형인 Mono와 Flux를 제공한다.

분류 명령형 프로그래밍 반응형 프로그래밍
처리 방식 명령어를 순서대로 실행 데이터 스트림을 처리하며, 데이터 변화에 반응
동기/비동기 대부분 동기적 대부분 비동기적
코드 구성 명령형 코드 선언형 코드
사용 예시 계산기, 루프 등 이벤트 처리, UI 업데이트 등
프로그래밍 종류 Spring MVC Webflux

 

2) Reactor

  Reactor는 반응형 프로그래밍을 구현하기 위한 Reactive 라이브러리 중 하나이며 Publisher(발행자) - Subscriber(구독자) 패턴을 중심으로 동작한다. 

 

(1) Publisher(발행자) - Subscriber(구독자) 패턴 : 반응형 스트림(Reactive Stream)

  반응형 스트림이란 비동기적 이벤트 기반 응용프로그램을 위한 스트림 처리 기술을 의미한다. 이 패턴은 Publisher(발행자)가 데이터를 생성하고 Subscriber(구독자)에게 데이터를 전송하며 Subscriber(구독자)는 데이터를 받아드리고 소비한다. 

객체 설명
Publisher (발행자) 데이터를 생성, Subscriber에게 전송
Subscriber (구독자) Publisher로부터 데이터를 받아드리고 소비
Subscription (구독) Subscriber가 처리할 데이터의 양을 정의

 

(2) 반응형 스트림 수행과정

 

  • subscribe : Subscriber를 Publisher에 ‘등록’하고 데이터 스트림을 ‘수신할 준비’가 되었음을 Publisher에게 알린다.
  • onSubscribe : PublisherSubscriber에게 데이터 스트림을 전송하기 시작하기 전에 호출하며, 이 메서드를 통해 SubscriberSubscription 객체를 받아들여 데이터의 양을 제어할 수 있다.
  • request(n)/cancel : request(n) 메서드는 Publisher에게 n개의 데이터를 요청하고, cancel 메서드는 데이터 스트림을 취소한다.
  • onNext(data) : Publisher생성한 데이터Subscriber에게 전달하며, 이 메서드는 데이터가 전송될 때마다 호출된다.
  • onComplete/onError : Publisher가 모든 데이터를 전송하고, 더 이상 데이터가 없을 때 호출된다. onComplete 메서드는 모든 데이터가 성공적으로 전송되었음을 나타내며 onError 메서드는 데이터 전송 중 오류가 발생했음을 나타낸다.

(3) Mono

  Mono는 Reactor 라이브러리에서 제공하는 Reactive Streams의 Publisher 중 하나로 오직 ‘0개 또는 하나의 데이터 항목'을 생성하고 스트림이 종료되면 결과 생성을 종료한다. Mono를 사용하여 비동기적으로 결과를 반환하면 해당 결과를 구독하는 클라이언트는 결과가 생성될 때까지 블로킹하지 않고 다른 작업을 수행할 수 있다.

 

메소드 설명
just 주어진 데이터를 포함하는 Mono를 생성
empty 데이터가 없는 Mono를 생성
error 에러 상황을 나타내는 Mono를 생성
fromCallable Callable 객체를 이용해 Mono를 생성
fromFuture Future 객체를 이용해 Mono를 생성
fromRunnable Runnable 객체를 이용해 Mono를 생성

 

(4) Flux

  Flux는 Reactor 라이브러리에서 제공하는 Reactive Streams의 Publisher 중 하나로 Mono와 달리 '여러 개의 데이터 항목'을 생성하고 스트림이 종료되면 결과 생성을 종료한다. Flux를 사용하여 HTTP 요청을 처리하는 경우, 요청을 수신한 즉시 해당 요청을 처리하고 결과를 생성하는 대신 결과 생성이 완료될 때까지 다른 요청을 처리할 수 있다.

 

메소드 설명
just 주어진 데이터를 포함하는 Flux를 생성
fromIterable Iterable 객체를 이용해 Flux를 생성
fromArray 배열을 이용해 Flux를 생성
fromStream Stream을 이용해 Flux를 생성
empty 데이터가 없는 Flux를 생성
error 에러 상황을 나타내는 Flux를 생성
range 지정된 범위의 정수를 포함하는 Flux를 생성
interval 일정 시간 간격으로 값을 생성하는 Flux를 생성
merge 여러 개의 Flux를 하나의 Flux로 병합
concat 여러 개의 Flux를 순차적으로 이어붙여 하나의 Flux로 병합
zip 여러 개의 Flux를 조합하여 튜플 형태 변환
collectList Flux에 포함된 모든 데이터를 리스트로 수집
collectMap Flux에 포함된 모든 데이터를 맵으로 수집

 

3) Netty

  자바 기반의 네트워크 애플리케이션 프레임워크로 비동기식 이벤트 기반 서버를 만드는 데 사용 된다. 높은 성능과 확장성을 갖추고 있으며, 다양한 프로토콜을 지원하고 있어 네트워크 애플리케이션 개발에 매우 유용하다.

 

Netty와 Tomcat의 비교

특성 Netty Tomcat
아키텍처 이벤트-기반 요청 당 쓰레드
성능 비동기 처리로 인한 높은 성능 동기 처리로 인한 상대적으로 느린 성능
확장성 다수의 동시 접속 처리가 가능한 높은 확장성 쓰레드 개수 제한으로 확장성 한계
프로토콜 지원 HTTP, WebSocket, TCP 등 다수의 프로토콜 지원 주로 HTTP에 특화
유연성 다양한 애플리케이션에 사용 가능한 높은 유연성 웹 애플리케이션에 특화된 제한된 유연성
사용 편의성 이벤트-기반 아키텍처로 인한 학습 곡선이 높음 전통적인 서블릿 기반 아키텍처에 익숙한 개발자에게 사용하기 편리

 

4) 비동기 및 비차단(Asynchronous and Non-Blocking)

  Spring WebFlux는 Asynchronous 및 Non-Blocking I/O 방식을 사용하여 적은 수의 스레드로 많은 수의 동시 요청을 처리할 수 있다. 이는 Synchronous 및 Blocking을 사용하는 기존 서블릿(Servlet) 기반 Spring Web MVC 방식과 달리, 높은 처리량을 제공한다.

 

- 기존 Spring MVC Blocking Request

출처 :  https://reflectoring.io/getting-started-with-spring-webflux/

 

- Spring Webflux Non-Blocking Request

출처 :  https://reflectoring.io/getting-started-with-spring-webflux/

 

5) Multi Event Loop

  Multi Event Loop란 Reactor Core에서 지원을 하며 단일 스레드로 동작하는 ‘이벤트 루프를 여러 개 사용’하는 것을 의미한다. 이를 통해 블로킹 I/O 작업이 발생하더라도 다른 이벤트 루프를 통해 애플리케이션이 멈추지 않고 계속 동작할 수 있다.

1. [Event Queue] 이벤트가 발생하면 해당 이벤트를 처리하기 위한 콜백 함수를 저장

2. [Process Events] 이벤트 루프(Event Loop)는 이벤트 큐에서 이벤트를 하나씩 가져와 처리

3. [Event Loop] 이벤트 루프는 주어진 작업을 처리

4. [Register Callback] 작업을 처리하기 위한 콜백 함수를 등록

5. [Intensive Operation(Platform)] 블로킹 I/O 작업이 발생하면, Event Loop는 해당 작업을 처리하기 위한 새로운 스레드를 생성

6. [Operation Completion] 블로킹 I/O 작업이 완료되면, 결과를 Event Loop에게 알리고 새로운 스레드는 종료

7. [Trigger Callback] Event Loop는 결과를 처리하고, 다른 작업을 처리

 

3. WebClient

  WebFlux의 일부인 Webclient는 비동기적인 방식으로 HTTP 요청을 보내고 응답을 받을 수 있는 라이브러리를 의미한다. 다수의 외부 API 호출이나, 다른 서비스들과의 통합 작업에서 유용하며, 비동기적인 방식으로 HTTP 요청을 보내고 응답을 받을 수 있는 라이브러리이다. 이를 통해 Reactive Streams를 이용하여 높은 성능의 네트워크 통신을 구현할 수 있다.

 

분류 RestTemplate WebClient
I/O 모델 블로킹 논블로킹
동시성 낮음 높음
성능 동기식 비동기식
응답 타입 ResponseEntity Mono, Flux
클라이언트 측 부하 분산 지원 안 함 지원
스트리밍 지원 안 함 지원

 

- 참고 자료

https://adjh54.tistory.com/232