WebFlux는 Spring 5에서 새롭게 추가된 Reactive-stack의 웹 프레임워크이며, 클라이언트/서버에서 리액티브(reactive) 애플리케이션 개발을 위한 논블로킹 리액티브 스트림을 지원한다.
WebFlux의 등장
논블로킹으로 동작하는 웹 스택의 필요성 때문에 등장하게 되었다.
기존 SpringMVC의 Servlet API는 v3.1부터 논블로킹을 위한 API제공해왔지만 동기적으로 처리하는 모듈(Filter, Servlet)과 블로킹 방식의 API(getParameter, getPart)들이 있기에 완벽한 논블로킹 환경의 개발을 할 수 없었다.
비동기 논블로킹 환경의 서버 Netty가 부상하고 있었으며 Netty와의 연동을 위해 Spring은 새로운 API가 필요했다.
WebFlux를 사용해야 하는 경우
비동기, non-blocking reactive 개발에 사용하는 경우
효율적으로 동작하는 고성능 웹어플리케이션 개발에 사용
서비스간 호출이 많은 마이크로서비스 아키텍처에 적합
Spring MVC와 WebFlux의 차이
Spring MVC
Spring MVC는 하나의 요청에 대해 하나의 스레드가 사용된다(thread-per-request).
그래서 다량의 요청을 대비해 미리 스레드 풀을 생성해놓으며, 각 요청마다 스레드를 할당하여 처리
1 request:1thread
sync + blocking
WebFlux
리액티브 프로그래밍은 논블로킹과 고정된 스레드 수 만으로 모든 요청을 처리함으로 Spring MVC의 문제들을 해결
서버는 스레드 한개로 운영하며, 디폴트로 코어 수 개수의 스레드를 가진 워커 풀을 생성하여 해당 워커 풀 내의 스레드로 모든 요청을 처리
제약이 있다면 논블로킹으로 동작해야만 하며, 블로킹 라이브러리가 필수적으로 사용되어야 한다면, 워커 스레드가 아닌 별도의 스레드로 요청을 처리해야 한다.