Spring WebFlux 개요:스프링 MVC와의 차이점, Netty 기반 작동 방식

김기현·2025년 8월 3일

Spring WebFlux

목록 보기
11/28

스프링 WebFlux는 스프링 프레임워크 5에 도입된 모듈로, 비동기적이고 논블로킹 방식으로 웹 애플리케이션을 구축하기 위한 리액티브 웹 프레임워크이다.
기존의 스프링 MVC와는 근본적인 동작 방식에 차이가 있으며 이는 주오 요청 처리 방식과 스레드 모델에서 비롯된다.

Spring MVC와의 차이점

특징스프링 MVC (서블릿 스택)스프링 WebFlux (리액티브 스택)
요청 처리 방식블로킹논블로킹
스레드 모델서블릿 컨테이너의 스레드 풀 사용. 요청당 스레드 모델.이벤트 루브 기반. 적은 수의 워커 스레드로 다수의 요청 처리.
확장성스레드 수가 증가함에 따라 자원 소모가 커져 확장성이 제한될 수 있다.적은 수의 스레드로 높은 동시성을 지원하며 높은 확장성을 제공한다.
자원 효율성요청 처리 중 I/O 작업 발생 시 스레드가 유휴 상태가 되어 자원 낭비가 발생할 수 있다.I/O 작업 시에도 스레드가 다른 요청을 처리할 수 있어 자원 효율성이 높다.
프로르개밍 모델명령형 프로그래밍 모델. 순차적인 코드 흐름.함수형 및 리액티브 프로그래밍 모델. 데이터 스트림 처리.
백프레셔명시적인 백프레셔 제어가 어렵다.리액티브 스트림즈 표준을 준수하여 배압을 자동으로 처리한다.
적합한 사용처대부분의 일반적인 웹 애플리케이션, 단순한 CRUD 요청, 요청 처리 시간이 비교적 짧은 경우.높은 동시성이 요구되는 애플리케이션, 실시간 스트리밍, 마이크로서비스 아키텍처, I/O 집약적인 작업.

Netty(또는 기타 리액티브 서버) 기반 작동 방식

스프링 WebFlux는 기존 스프링 MVC가 서블릿 API를 기반으로 하는 것과 달리, 리액티브 런타임(Reactive Runtime)을 기반으로 동작한다. 대표적인 리액티브 런타임이 바로 Netty이다. Netty 외에도 Undertow, Servlet 3.1 이상 컨테이너(비동기 서블릿) 등도 WebFlux에서 사용할 수 있다.

Netty 기반의 작동 방식은 다음과 같은 핵심 개념을 포함한다.

이벤트 루프 (Event Loop)

  • 이벤트 루프는 들어오는 요청을 처리하고, I/O 이벤트를 모니터링하며, 해당 이벤트가 처리할 핸들러에게 전달하는 역할을 한다.
  • 극히 적은 수의 스레드가 이 이벤트 루프를 실행한다.
    • 이 스레드들은 블로킹 없이 지속적으로 작업을 처리한다.

논블로킹 I/O

  • Netty는 Java NIO(New I/O)를 기반으로 한다. 이는 특정 I/O 작업이 진행되는 동안 해당 스레드가 블로킹되지 않도록 한다.
  • 데이터를 읽거나 쓸 준비가 되면 운영체제로부터 알림을 받고 이벤트 루프 스레드가 해당 작업을 처리한다.

Future 및 Promise (비동기 처리)

  • Netty는 비동기 작업을 처리하기 위해 ChannelFuture와 같은 비동기 객체를 사용한다.
    • 이는 어떤 작업이 완료될 때까지 기다리지 않고 작업이 완료되면 결과가 비동기적으로 전달되도록 한다.

리액티브 스트림즈 (Reactive Streams)

  • 스프링 WebFlux는 Reactor 라이브러리를 통해 리액티브 스트림즈 표준을 구현한다.
  • Mono와 Flux는 이러한 데이터 스트림을 표현하는 핵심 타입이다.
  • 데이터는 푸쉬 방식으로 흐르며, 소비자가 준비된 만큼만 데이터를 요청하는 백프레셔 메커니즘을 통해 생산자와 소비자의 속도를 조절한다.

Netty 기반 WebFlux 요청 처리 흐름

  1. 클라이언트 요청: 클라이언트로부터 HTTP 요청이 Netty 서버로 들어온다.
  2. 이벤트 루프 스레드: Netty의 이벤트 루프 스레드 중 하나가 이 요청을 받는다 이 스레드는 요청을 즉시 처리하는 대신, 해당 요청을 처리할 핸들러 체인으로 전달한다.
  3. WebFlux 핸들러: 스프링 WebFlux의 RouterFunction또는 @Controller가 요청을 받아 Mono또는 Flux형태의 리액티브 스트림을 반환한다. 이 과정에서 필요한 비동기 I/O 작업이 발생할 수 있다.
  4. 비동기 I/O: DB 접근이나 외부 API 호출과 같은 I/O 작어브이 별도의 스레드 풀이나 Netty의 워커 스레드에서 논블로킹 방식으로 처리된다. 이때 요청을 받은 이벤트 루프 스레드는 블로킹되지 않고 다른 요청을 처리한다.
  5. 결과 스트림: I/O 작업이 완료되면 그 결과가 Mono또는 Flux스트림으로 흘러들어온다.
  6. 응답 반환: 최종적으로 스트림이 완료되면 Netty 이벤트 루프 스레드가 비동기적으로 응답을 클라이언트에게 보낸다.

요약

스프링 WebFlux는 Netty와 같은 논블로킹 리액티브 서버를 활용하여 적은 수의 스레드로 높은 동시성을 처리하고, I/O 작업으로 인한 스레드 블로킹을 최소화하여 높은 확장성과 효율성을 제공한다.
이는 특히 고성능이 요구되거나 실시간 데이터 스트림 처리가 필요한 애플리케이션에 매우 적합하다.

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

0개의 댓글