- 반응형 스택 웹 프레임워크
- non-blocking
- 비동기 처리
- 적은 수의 스레드로 동시성을 처리 / 적은 하드웨어 리소스로 확장
- 반응형 프로그래밍을 통해 '높은 처리량'과 '확장성'을 갖는 애플리케이션을 만드는 것을 목표
- Netty, Undertow와 같은 Non-Blocking I/O 서버를 기반으로 동작
![]()

이를 통해 ‘이벤트 기반의 비 동기식 애플리케이션’을 구축할 수 있다.
많은 트래픽을 소화하는 시스템에 도입하여 리소스 최적화
Spring MVC는 1:1로 요청을 처리하기 때문에 트래픽이 몰리면 많은 쓰레드가 생겨난다.
쓰레드가 전환될 때 문맥교환(context switching) 비용이 발생하게 되는데 쓰레드가 많을수록 비용이 커지기 때문에 적절한 쓰레드 수를 유지해야 하는 문제가 있다.
이에 반해, WebFlux는 Event-Driven 과 Asynchronous Non-blocking I/O를 통해 리소스를 효율적으로 사용할 수 있다.
비동기 스트림 처리에서 데이터의 양을 제어하는 것을 의미합니다. 발행자(Publisher)가 생성한 데이터를 구독자(Subscriber)가 처리할 때 구독자가 처리할 수 있는 데이터 양을 초기화하여 데이터가 생성되는 상황을 방지하기 위해 백 프레셔를 사용합니다.
백프레셔는 Subscriber가 처리할 데이터의 양을 Subscription(구독)을 통해 제어하며, Publisher는 Subscriber의 처리 속도에 맞춰 데이터를 생성합니다. 이를 통해 Subscriber가 처리할 수 있는 양 이상의 데이터가 생성되는 상황을 방지하고, 시스템의 안정성을 보장할 수 있습니다.
![]()
💡 반응형 스트림(Reactive Stream)
비 동기적 및 이벤트 기반 응용 프로그램을 위한 ‘스트림 처리 기술’을 의미합니다. 해당 기술의 핵심은 ‘Publisher’가 ‘Subscriber’에게 데이터를 제공하는 것을 의미합니다.
이는 Publisher는 데이터를 생성하고 Subscriber는 이를 처리합니다. 이러한 방식으로 스트림을 처리함으로써 데이터를 더 효율적으로 처리할 수 있습니다.
WebClient webClient = WebClient.builder().build();
Mono resultMono = webClient.get()
.uri("<https://www.example.com/>")
.retrieve()
.bodyToMono(String.class);
String result = resultMono.block();
System.out.println(result);
MVC 환경에서는 WebFlux와 달리 블로킹 I/O를 사용하기 때문에, 동기적인 작업을 수행할 때는 RestTemplate를 사용하는 것이 적합하다.
이후 부분은 참고 링크%20%EC%A3%BC%EC%9A%94%20%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C%20%ED%99%95%EC%9D%B8-1) 전체 참고
참고 1 : Webflux의 흐름, 주요 구성 요소
참고 2 : 간단한 요약
참고 3 : Webflux 구현 / + WebSockets로 채팅 구현
참고 4 : 사용하는 이유
참고 5 : 성능 테스트 / 구현
참고 6 : Spring.io에서 제공하는 기본 코드 분석