카테고리 없음

Spring WebFlux

진열사랑 2025. 5. 5. 20:46

Spring WebFlux는 Spring 프레임워크에서 제공하는 비동기(논블로킹) 웹 프레임워크입니다.
기존의 Spring MVC가 블로킹 I/O 기반이라면, WebFlux는 논블로킹 I/O 기반으로 고성능, 확장성 있는 애플리케이션에 적합합니다.


✅ Spring WebFlux란?

Spring WebFlux는 Reactive Streams 사양을 기반으로 하는 논블로킹, 이벤트 드리븐 웹 프레임워크입니다.
내부적으로 Reactor의 Mono와 Flux를 사용해 비동기 처리를 합니다.


🔧 주요 용도

용도설명
실시간 처리 대기 시간이 중요한 채팅, 주식 시세, IoT 등
높은 동시성 처리 요청 수가 매우 많은 API 서버
리액티브 마이크로서비스 다른 리액티브 시스템과의 통합 필요 시 (예: RSocket, Kafka 등)
서버 간 통신 최적화 WebClient를 통한 비동기 API 호출 등
 

🎯 특징

특징설명
논블로킹 I/O Servlet API가 아닌 Netty, Undertow 등으로 동작 가능
리액티브 타입 사용 Mono, Flux로 비동기 데이터 흐름 처리
적은 리소스로 높은 처리량 스레드 수 적게 유지하면서도 많은 요청 처리 가능
WebClient 제공 RestTemplate 대체, 비동기 HTTP 클라이언트
어노테이션 + 함수형 라우팅 지원 기존 @Controller 방식 + 함수형 방식(RouterFunction) 지원
 

📦 설치 방법 (Gradle 기준)

1. 기본 의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'io.projectreactor:reactor-core'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2. WebFlux 전용 서버 (Netty) 사용

  • spring-boot-starter-webflux는 기본적으로 Netty를 내장 서버로 사용
  • 필요시 Tomcat 대신 Netty 사용

🧱 간단한 예제

▶ Controller 예시 (리액티브 방식)

@RestController
public class HelloController {

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

    @GetMapping("/numbers")
    public Flux<Integer> numbers() {
        return Flux.range(1, 5).delayElements(Duration.ofSeconds(1));
    }
}

🔁 WebFlux vs MVC 차이

항목 Spring MVC Spring WebFlux
프로그래밍 모델 동기 (블로킹) 비동기 (논블로킹)
스레드 모델 요청당 1스레드 이벤트 루프 (적은 수의 스레드로 다수 처리)
리액티브 타입 사용 안 함 Mono, Flux
서버 Tomcat, Jetty Netty, Undertow, Servlet 3.1+
사용 대상 전통적인 웹/REST 실시간 처리, 고성능 API 등
 

⚠️ 주의사항

  • block()은 WebFlux의 장점을 없애므로 최소화해야 합니다.
  • 기존 MVC 방식과 섞어 쓰면 의도하지 않은 동작 발생 가능 → 별도 프로젝트 분리 권장
  • 외부 API 호출 시에도 WebClient 등 논블로킹 방식 사용 필요