Spring Webflux 간단 정리

jrun
3 min readNov 6, 2022

--

Webflux?

Spring WebFlux는 Spring 5에서 새롭게 추가된 모듈.

reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며, non-blockingreactive, functional 이라는 특징을 가진다.

Reactive?

“reactive”라는 건 변화에 반응하게 만들어진 프로그래밍 모델.

예를 들어, 블로킹 코드에서는 함수 호출 후 결과를 기다리는 것이 자연스러운 형태이다. 반면, 논블로킹 코드에서 데이터를 전송하는 쪽의 전송속도가 수신자의 처리속도를 앞지르지 않게 이벤트 속도를 제어하는 것이 중요하다. reactive stream은 이런 비동기성 컴포넌트간의 상호작용에 정의된 작은 스펙이다. 이런 기능을 Back Pressure 라고 한다.

사용목적으로는

  1. 성능
  2. 비동기 non-blocking
  3. netty 같은 nio 서버와의 연계

등이 있다.

Spring MVC와의 차이?

MVC

다음과 같은 구조를 보인다. 우측의 Servlet 스택이 흔히 사용하는 Spring MVC이다.

SpringMVC는 하나의 요청에 대해 하나의 스레드가 사용된다(thread-per-request). 그렇기에 다수의 요청을 대비하여 미리 스레드 풀을 생성해놓으며, 각 요청마다 스레드를 할당하여 처리한다.

하지만 Sync, Blocking 기반으로 동작하기 때문에 스레드의 Context Switching 부하, 요청량 증가로 인한 스레드 증가라는 문제가 생길 수 있다.

예를들어, MSA 환경에서는 대부분의 연산이 API 호출, DB Connection으로 이루어져 있어 컨텍스트 스위칭에 따른 오버헤드가 존재한다.

Webflux

Webflux의 경우 서버는 스레드 한 개로 운영하며, 디폴트로 CPU 코어 수 개수의 스레드를 가진 워커 풀을 생성하여 해당 워커 풀 내의 스레드로 모든 요청을 처리한다.

또, 기존의 DB는 사용할 수 없다. Non-Blocking으로 구현했는데 Blocking DB를 사용하면 의미가 없으니까. Redis, Mongo같은 NoSQL이 Non-Blocking을 지원한다고 한다.

--

--