스프링 WebFlux는 스프링 프레임워크 5에 도입된 모듈로, 비동기적이고 논블로킹 방식으로 웹 애플리케이션을 구축하기 위한 리액티브 웹 프레임워크이다.
기존의 스프링 MVC와는 근본적인 동작 방식에 차이가 있으며 이는 주오 요청 처리 방식과 스레드 모델에서 비롯된다.
| 특징 | 스프링 MVC (서블릿 스택) | 스프링 WebFlux (리액티브 스택) |
|---|---|---|
| 요청 처리 방식 | 블로킹 | 논블로킹 |
| 스레드 모델 | 서블릿 컨테이너의 스레드 풀 사용. 요청당 스레드 모델. | 이벤트 루브 기반. 적은 수의 워커 스레드로 다수의 요청 처리. |
| 확장성 | 스레드 수가 증가함에 따라 자원 소모가 커져 확장성이 제한될 수 있다. | 적은 수의 스레드로 높은 동시성을 지원하며 높은 확장성을 제공한다. |
| 자원 효율성 | 요청 처리 중 I/O 작업 발생 시 스레드가 유휴 상태가 되어 자원 낭비가 발생할 수 있다. | I/O 작업 시에도 스레드가 다른 요청을 처리할 수 있어 자원 효율성이 높다. |
| 프로르개밍 모델 | 명령형 프로그래밍 모델. 순차적인 코드 흐름. | 함수형 및 리액티브 프로그래밍 모델. 데이터 스트림 처리. |
| 백프레셔 | 명시적인 백프레셔 제어가 어렵다. | 리액티브 스트림즈 표준을 준수하여 배압을 자동으로 처리한다. |
| 적합한 사용처 | 대부분의 일반적인 웹 애플리케이션, 단순한 CRUD 요청, 요청 처리 시간이 비교적 짧은 경우. | 높은 동시성이 요구되는 애플리케이션, 실시간 스트리밍, 마이크로서비스 아키텍처, I/O 집약적인 작업. |
스프링 WebFlux는 기존 스프링 MVC가 서블릿 API를 기반으로 하는 것과 달리, 리액티브 런타임(Reactive Runtime)을 기반으로 동작한다. 대표적인 리액티브 런타임이 바로 Netty이다. Netty 외에도 Undertow, Servlet 3.1 이상 컨테이너(비동기 서블릿) 등도 WebFlux에서 사용할 수 있다.
Netty 기반의 작동 방식은 다음과 같은 핵심 개념을 포함한다.
ChannelFuture와 같은 비동기 객체를 사용한다.Mono와 Flux는 이러한 데이터 스트림을 표현하는 핵심 타입이다.RouterFunction또는 @Controller가 요청을 받아 Mono또는 Flux형태의 리액티브 스트림을 반환한다. 이 과정에서 필요한 비동기 I/O 작업이 발생할 수 있다.Mono또는 Flux스트림으로 흘러들어온다.스프링 WebFlux는 Netty와 같은 논블로킹 리액티브 서버를 활용하여 적은 수의 스레드로 높은 동시성을 처리하고, I/O 작업으로 인한 스레드 블로킹을 최소화하여 높은 확장성과 효율성을 제공한다.
이는 특히 고성능이 요구되거나 실시간 데이터 스트림 처리가 필요한 애플리케이션에 매우 적합하다.