Spring WebFlux 대해 알아보자

러브굿·2025년 6월 18일
0

기존 Spring MVC로 충분하지 않을까?
그런데 왜 WebFlux가 나왔고, 뭘 위해 쓸까?


1. WebFlux란?

  • Spring 5부터 지원되는 리액티브(비동기 논블로킹) 웹 프레임워크
  • REST API, SSE, WebSocket 등 고성능 비동기 서비스를 쉽게 구축 가능
  • 핵심: Servlet 컨테이너에 종속되지 않고, Netty 등 다양한 서버 지원
  • 단일 스레드로 많은 요청을 처리할 때(=I/O Bound) 이점을 가짐

예를 들어

  • 실시간 채팅, 알림, 대용량 이벤트/데이터 스트림 처리 등
  • “많은 연결, 빠른 응답”이 필요한 서비스에 적합

2. 기존 Spring MVC와의 차이

구분Spring MVCSpring WebFlux
실행 모델동기, 블로킹비동기, 논블로킹
Servlet 지원Tomcat/Jetty(서블릿 기반)Netty, Undertow, 서블릿/비서블릿 모두 지원
리턴 타입ModelAndView, ResponseEntityMono, Flux (리액티브 타입)
대표 UsecaseCRUD, 관리 UI 등실시간 알림, API Gateway 등

3. 기본 예제

1) build.gradle 세팅

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
}

2) 리액티브 컨트롤러 예시

package com.example.demo.web;

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/api")
public class SampleController {

    @GetMapping("/hello")
    public Mono<String> hello() {
        return Mono.just("Hello, WebFlux!");
    }

    @GetMapping("/numbers")
    public Flux<Integer> numbers() {
        return Flux.range(1, 10);
    }
}
  • Mono: 0~1개의 데이터 반환 (ex: 단일 조회, 단일 응답)
  • Flux: 0~N개의 데이터 반환 (ex: 목록 조회, 데이터 스트림)

4. 동작 구조

  • Netty 등 논블로킹 서버가 기본값
  • Servlet 3.1 이상 환경에서는 논블로킹 IO 지원
  • 모든 요청/응답, 내부 연산이 논블로킹 방식
  • 리액터(Reactor) 기반으로 동작 (Mono, Flux 타입 활용)

5. 언제 쓰면 좋은가?

  • 실시간 알림/메시지/스트리밍 (예: 채팅, 주식 시세, IoT)

  • I/O Bound (네트워크/DB에 대기 많은 서비스)

  • 대량 동시접속 처리가 필요할 때 (ex: API Gateway)

  • 단,

    • CPU Bound (복잡 계산, 무거운 로직) 서비스에는 효과 미미/오히려 불리할 수 있음
    • DB 드라이버 등도 논블로킹이어야 진정한 퍼포먼스 효과

6. 실전 팁

  • Mono/Flux 변환에 익숙해져야 함 (처음엔 Stream/Optional 쓸 때와 비슷)
  • 스레드/블로킹 처리 신경 쓸 것 (block() 남발 x)
  • DB 드라이버, 외부 API도 논블로킹이어야 진짜 효과 (ex: R2DBC, WebClient)
  • Spring Security도 WebFlux 전용 의존성 따로 있음

참고 공식 문서

profile
마라토너형 개발자

0개의 댓글