Spring WebFlux

Spring 5에서 도입된 리액티브 프로그래밍 기반 논블로킹 웹 프레임워크로, 적은 스레드로 많은 동시 요청을 처리합니다.

핵심 개념

Mono / Flux

// Mono: 0 또는 1개 값
Mono<String> mono = Mono.just("hello");
Mono<String> empty = Mono.empty();
Mono<String> error = Mono.error(new RuntimeException("fail"));

// Flux: 0~N개 값 스트림
Flux<Integer> flux = Flux.just(1, 2, 3);
Flux<Long>    interval = Flux.interval(Duration.ofSeconds(1));

// 구독 (실제 실행은 subscribe() 시점)
mono.subscribe(val -> System.out.println(val));
flux.subscribe(
    val   -> System.out.println(val),   // onNext
    err   -> System.err.println(err),   // onError
    ()    -> System.out.println("완료")  // onComplete
);

컨트롤러 작성

@RestController
@RequestMapping("/posts")
public class PostController {

    @GetMapping("/{id}")
    public Mono<Post> getPost(@PathVariable Long id) {
        return postService.findById(id);  // Mono 반환
    }

    @GetMapping
    public Flux<Post> getAllPosts() {
        return postService.findAll();     // Flux 반환
    }

    // SSE 스트리밍
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<Post> streamPosts() {
        return postService.streamAll();
    }
}

Spring MVC vs Spring WebFlux

Spring MVCSpring WebFlux
모델동기 블로킹비동기 논블로킹
스레드요청당 1스레드이벤트 루프 (소수 스레드)
서버Tomcat (기본)Netty (기본), Tomcat 가능
DB 지원JPA (블로킹)R2DBC (리액티브 JDBC)
코드 패러다임명령형선언형 (함수형)
학습 곡선낮음높음
적합한 상황CRUD, 팀이 MVC 익숙I/O 집약적, 스트리밍, 고동시성

MVC + WebFlux 하이브리드

Spring Boot에서 두 모듈을 같이 쓸 수 있음. MVC 환경에서 특정 엔드포인트만 WebFlux 스타일(SseEmitter, StreamingResponseBody)로 구현하는 혼합 방식.

// MVC 컨트롤러에서 SSE만 WebFlux처럼 처리
@GetMapping(value = "/ai/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter streamAI() {
    SseEmitter emitter = new SseEmitter();
    // 논블로킹 처리 위임
    asyncService.processAndEmit(emitter);
    return emitter;
}

완전한 WebFlux 전환 없이 SSE, 파일 다운로드 등 스트리밍 엔드포인트만 비동기로 처리할 때 유용.

주의사항

핵심 정리

→ SSE | 비동기 | Spring MVC vs WebFlux

CSLOG에서 보기