카테고리 없음
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 등 논블로킹 방식 사용 필요