본문 바로가기
백엔드/Spring

Spring WebFlux

by 작은소행성 2022. 4. 14.

WebFlux 란

 

 

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

클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며 

Non-blocking 에 reactive streams 의 BackPressure을 지원하며 Netty, Servlet3.1+ 컨테이너와 같은 서버에서 실행된다. 

 

위의 그림은 각각의 기능들과 공통점에 대해 나와있다. 

 

 

위는 전반적인 WebFlux의 구조이다. 

 

 

 

 

 

 

WebFlux 를 사용하기 전에 WebFlux 가 왜 생겨났는지 궁금했다. 

 

WebFlux 가 생긴 이유

적은 수의 스레드와 최소한의 하드웨어 자원으로 동시성을 처리하고 리소스를 확장하기 위해서 만들어졌다. 

이는 새로운 공통 API 가 생긴 이유가 됐으며, tomcat 이 아닌 netty와 같은 잘 만들어진 비동기, 논블로킹 서버 떄문에 중요하고 한다. 

 

함수형 프로그래밍 때문이다. java 5 에서 Rest controllers 나 unit test 가 만들어지고, java 8 에서는 함수형 API 를 위한 Lambda 표현식이 추가되었다. 이는 논블로킹 어플리케이션 API의 토대가 되었다.

 

서블릿 3.1 이 논블로킹을 일부분만 지원하기 때문에 만들어졌다. 

 

 

WebFlux 사용 용도

WebFlux는 아래와 같은 용도로 사용한다

배민 기술블로그에서 가게노출 시스템을 사용할 때 WebFlux를 사용한다고 한다. 

  • 하나의 사용자 요청을 처리하기 위해 수십여개의 외부 시스템에 대한 요청이 필요한 시스템에서, 어떻게 가장 빠른 응답을 줄 수 있을까?
  • 수많은 요청을 처리해야할 때 어떻게 쓰레드 지옥을 벗어날 수 있을까?

수십개의 동작이 동기로 이루어질 때 수행시간은 전체 요청 수행시간의 합이지만 

비동기로 이루어지면 수행시간은 전체 요청 수행시간 중 최대가 된다.

동시 요청 수가 적을 때는 장점이 없을 수 있지만, 수십개의 요청이 동시에 필요한 시스템에서는 비동기로 인해 이득을 볼 수 있다. 

아무리 비동기 동작이 가능하다고 해도 Blocking IO 기반의 동작을 하게 되면 스레드 지옥에서 벗어날 수 없다. 

 

WebFlux는 이벤트 기반(Event Driven) 과 Asynchronous Non-blocking I/O 을 통해 리소스를 효율적으로 사용할 수 있게 하고, 이러한 동작으로 성능을 끌어올린다. 

만약 blocking 코드가 있으면 WebFlux 를 사용하는 의미는 떨어지게 된다. 

 

 

BackPressure

빠른 Publisher 와 느린 Subscriber 문제를 해결하는 원리이다. 

Publisher 의 일방적인 데이터 Push가 아니라

Subscriber가 처리할 수 있을 만큼의 데이터만 Subscriber의 요청에 의해서 전달해주는 것이다. 

 

 

 

 

 

 

 

 

 

공식문서

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html

 

Web on Reactive Stack

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports

docs.spring.io

 

 

참고하면 좋을 사이트

https://godekdls.github.io/Reactive%20Spring/springwebflux/

 

Spring WebFlux (1)

스프링5 웹 리액티브 스택 웹플럭스 한글 번역 1편 (리액티브, 웹플럭스 소개, DispatcherHandler, 컨트롤러)

godekdls.github.io

반응형