Spring WebFlux

김기현·2025년 7월 30일

Spring WebFlux

목록 보기
1/28

Spring WebFlux는 Spring Framework 5.0에서 도입된 리액티브(Reactive) 웹 프레임워크이다.
기존의 Spring MVC가 서블릿 API를 기반으로 블로킹 I/O 모델을사용하는 반면, Spring WebFlux는 비동기 및 논블로킹(Non-Blocking) I/O 모델을 사용하여 높은 확장성과 성능을 제공하는 데 중점을 둔다.


핵심 개념

1. 리액티브 프로그래밍 (Reactive Programming)

  • 데이터 스트림(Data Stream)변화의 전파(Propagation of Change)에 초점을 맞춘 프로그래밍 패러다임이다.
  • 데이터를 비동기적으로 처리하며, 데이터가 준비될 때마다 이벤트 형태로 푸쉬하는 방식을 사용한다.
  • Non-Blocking I/O: I/O 작업(데이터베이스 접근, 네트워크 호출 등)이 완료될 때까지 스레드가 기다리지 않고 다른 작업을 처리한다. 이를 통해 적은 수의 스레드로도 많은 동시 요청을 처리할 수 있어 리소스 효율성이 높아진다.
  • 백프레셔(Backpressure): 데이터 생산자가 소비자보다 빠르게 데이터를 생산할 경우, 소비자가 처리할 수 있는 양만큼만 데이터를 조절하여 받아들이는 메커니즘을 제공한다. 이는 시스템 과부하를 방지하고 안정성을 높인다.

2. Project Reactor

  • Spring WebFlux는 리액티브 라이브러리인 Project Reactor를 기반으로 한다.
  • Reactor는 Reactive Streams 사양을 구현하며 주로 두 가지 핵심적인 타입인 MonoFlux를 제공한다.
    • Mono<T>: 0개 또는 1개의 요소를 비동기적으로 처리한다(ex: 단일 객체 조회)
    • Flux<T>: 0개에서 N개의 요소를 비동기적으로 처리한다(ex: 여러 개의 데이터 스트리밍)
  • 컨트롤러에서 MonoFlux타입을 반환하여 비동기적인 데이터 흐름을 표현한다.

3. 주요 특징

  • 논블로킹 요청-응답 처리: 스레드가 블로킹되지 않아 더 높은 처리량을 제공한다.
  • 비동기 및 이벤트 기반: 모든 I/O 작업이 비동기적으로 이루어지며 이벤트에 기반하여 동작한다.
  • 확장성 및 고성능: 적은 리소스로도 많은 동시 요청을 처리할 수 있어 높은 성능과 수평적 확장이 용이하다.
  • 다양한 서버 지원: 기존 서블릿 기반 컨테이너(Tomcat, Jetty) 외에도 Netty, Undertow 같은 노블로킹 서버를 기본으로 지원한다.
    • Netty는 Spring WebFlux의 기본 내장 서버로 사용된다.
  • 함수형 엔드포인트: 기존의 @Controller 애노테이션 기반 방식 외에 함수형 프로그래밍 스타일로 라우팅과 요청을 처리를 정의할 수 있는 유연성을 제공한다.
  • 리액티브 데이터베이스 연동: R2DBC(Reactive Relational Database Connectivity)와 같은 리액티브 데이터베이스 드라이버를 통해 데이터베이스 연동도 비동기적으로 처리할 수 있다.

4. Spring MVC와의 차이점 및 선택 기준

특징Spring MVCSpring WebFlux
I/O 모델블로킹 (Blocking)논블로킹 (Non-Blocking)
스레드 모델요청당 스레드 (Thread-per-request)이벤트 루브 (Event-loop) 및 적은 스레드
기반 기술서블릿 APIReactive Streams (Project Reactor)
서버Tomcat, Jetty (서블릿 컨테이너)Netty, Undertow (논블로킹 서버), Tomcat, Jetty (서블릿 컨테이너)
적합한 사용처전통적인 웹 애플리케이션, 동기적 처리, CPU 바운드 작업, 파일 업로드, JSP 렌더링, 세션 기반 인증높은 동시성 요구, 실시간 데이터 처리 (스트리밍), 마이크로서비스 간 비동기 통신, API Gateway, I/O 바운드 작업
복잡도상대적으로 낮음리액티브 프로그래밍 학습이 어려움
디버깅용이함비동기 흐름 추적이 어려움

상황에 맞는 프레임워크

Spring WebFlux가 더 유리한 경우

  • 높은 동시성 처리가 필요한 경우 (ex: 수십만 개의 동시 연결 처리)
  • 실시간 데이터 스트리밍 서비스 (ex: 채팅, 주식 시세, 알림 서비스)
  • 마이크로서비스 간 비동기 통신이 빈번한 아키텍처
  • I/O 바운드(I/O Bound)작업이 주를 이루는 서비스 (ex: 외부 API 호출, DB 조회 대기)

Spring MVC가 더 유리한 경우

  • CPU 바운드(CPU Bound)작업이 많은 경우 (ex: 복잡한 이미지 처리, 대규모 데이터 분석)
  • 기존 동기 라이브러리나 레거시 시스템과 통합이 필요한 경우.
  • 리액티브 프로그래밍 패러다임 학습 비용을 감수하기 어려운 경우.
  • 간단한 웹 애플리케이션 또는 복잡한 비동기 처리가 필요하지 않은 경우.

장점과 단점

장점

  • 높은 성능과 확장성: 적은 리소스로 더 많은 요청을 동시에 처리할 수 있어 시스템의 처리향과 응답성이 향상된다.
  • 리소스 효율성: 스레드를 블로킹하지 않으므로 스레드 풀을 효율적으로 사용하고 메모리 사용량을 줄일 수 있다.
  • 반응형 시스템 구축 용이: 실시간 데이터 처리 및 이벤트 기반 시스템 구축에 유리하다.

단점

  • 높은 학습 곡성: 리액티브 프로그래밍 패러다임과 Mono, Flux 등의 개념에 대한 이해가 필요하여 학습이 어렵다.
  • 디버깅 및 테스트의 어려움: 비동기적인 데이터 흐름을 추적하고 디버깅하는 것이 동기적 코드보다 복잡할 수 있다.
  • 라이브러리 호환성: 모든 서드파티 라이브러리가 리액티브 또는 비동기적인 방식을 지원하는 것은 아니므로 기존의 블로킹 라이브러리와 함께 사용할 경우 성능 이점을 제대로 누리기 어렵거나 통합이 어려울 수 있다.
  • CPU 집중 작업에 비효율적: I/O 바운드 작업에 회적화 되어 있으므로, CPU 집약적인 작업에서는 큰 이점을 얻지 못할 수 있다.

결론

Spring WebFlux는 현대의 고성능, 고확장성 애플리케이션 요구사항에 맞춰 진화한 프레임워크이다. 서비스의 특성과 요구사항을 면밀히 분석하여 적절한 프레임워크를 선택하는 것이 중요하다.

profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글