dev_dbdb1114

SpringWebFlux 본문

프로그래밍/SPRING

SpringWebFlux

dbdb1114 2023. 9. 1. 18:45

개요

기존의 스프링의 경우 ( SpringFramework, Spring Web MVC ) 등등은 ServletAPI와 ServleContainer를 사용할 목적으로 만들어졌지만, Spring Web Flux는 reactive-stack web framework로 Spring5.0부터 지원되기 시작했다. Reactive-stack web framework는 리액티브 프로그래밍 원칙을 기반으로 한 웹 프레임워크이다. spring-webmvc, spring-webflux 이 두 가지 모두 함께 사용될 수도 있고, 한쪽만 사용해도 된다.


리액티브 프로그래밍

리액티브 프로그래밍은 데이터 스트림과 변경 사항 전파를 중심으로 하는 비동기 프로그래밍 패러다임이다. 이것은 프로그래밍 언어로 정적 또는 동적인 데이터 프름을 쉽게 표현할 수 있어야하며, 데이터 프름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미한다. 이런 내용이 위키피디아에 정의되어 있는데 나는 이해가 잘 안 갔지만 이벤트 드리븐 방식이라고 하니 이해를 할 수 있었다.

  • 비동기성 ( Asynchronous ) : 요청 및 응답을 비동기적으로 처리한다. 이는 여러 요청을 동시에 처리하고, I/O 작업이나 장기 실행 작업을 블로킹하지 않으면서 애플리케이션의 확장성을 향상시킨다.
    ⇒ SpringMVC의 경우 여러 요청이 들어올 때 요청마다 스레드를 만들어서 대응했는데 이는 대용량 트래픽 처리를 할 때 안 좋을 수 있다. 
  • 논블로킹 ( Non-blocking ) : I/O작업이나 다른 작업이 블로킹 되지 않도록 한다. 요청과 응답이 계속해서 처리될 수 있으며, 애플리케이션이 더 빠르게 응답할 수 있다. 블로킹 시스템은 파일 I/O 작업이 일어날 때 해당 작업이 끝날 때 까지 중단되어 있으므로 시간의 소요와 리소스의 낭비가 될 수 있는데 이를 비동기적으로 처리함으로써 많은 트래픽도 감당할 수 있도록 하는 것이다.
  • Reactive Stream 백프레셔 : 데이터 스트림의 처리 과정에서 오버플로와 언더 플로우를 방지하고, 효율적인 데이터 처리를 가능하게 한다. 이는 대용량 및 실시간 데이터 처리 시 중요한 역할을 할 수 있다.

Spring MVC vs WebFlux

Spring MVC

  • 요청당 스레드 생성하는 방식
  • blocking 방식 및 동기방식
  • 미리 스레드를 생성해놓는 ThreadPool이 있음
  • 요청을 Queue 방식으로 처리함
  • 대용량 트래픽 발생시 지연되기 쉬움

Spring Web Flux

  • 요청을 Event-Driven 방식으로 처리
  • 요청이 발생할 경우 핸들러에게 처리를 위임하고 완료되면 반환함
  • SpringMVC에 비해서 요청을 대량으로 받아낼 수 있음

기존의 Spring 방식은 위에서 이야기했던 것처럼 요청당 스레드를 하나씩 생성한다. WebFlux는 반대로 이용하여, 요청당 스레드를 생성하는 것이 아니라 Event loop를 이용하는 비동기 처리를 지원한다. 즉 스레드를 요청당 하나씩 생성하는게 아니라서 스레드를 생성하고 사용하는데에 드는 비용과 시간을 절약할 수 있다.


WebFlux 사용시 주의점

WebFlux는 서버의 스레드 한 개로 운영하고, 기본적으로 CPU 코어 개수의 스레드를 가진 워커 풀을 생성하여 해당 워커 풀 내의 모든 요청을 처리하므로, 논블로킹으로 동작해야만 하며, 블로킹 라이브러리가 필요할 때는 워커스레드가 아닌 외부 별도의 스레드로 요청을 처리해야한다. 이렇게 워커 스레드를 사용하는 것이 아닌 별도의 스레드를 이용하는 이유는 이벤트 루프가 워커 스레드에서 실행되고 있는데 이런 이벤트 루프는 블로킹 되는 일은 막아야 하므로 처음 설정한 스레드 이외의 다른 별도의 스레드로 요청을 처리해야하는 것이다. 또한 이러한 문제점 때문에 DB도 non-blocking처리를 지원해야한다.


WebFlux 사용하는 서비스

아래 배민 블로그는 web-flux 도입 배경과 과정을 살짝 엿볼 수 있는데 재밌다. 한 번 읽어보면 좋다.

배달의민족 최전방 시스템! ‘가게노출 시스템’을 소개합니다. | 우아한형제들 기술블로그

 

배달의민족 최전방 시스템! ‘가게노출 시스템’을 소개합니다. | 우아한형제들 기술블로그

{{item.name}} 안녕하세요 우아한형제들 프론트검색서비스팀 권용근입니다. 저는 "먼데이 프로젝트" 라는 2019년 대형 프로젝트에서 요란하게 탄생하였고, 탄생한 순간부터 지금까지 배달의민족 최

techblog.woowahan.com

마무리 

아직 모르는게 너무 많다. Netty라든지 사용법 관련해서는 이후로 공부를 하면서 업데이트를 해나가야겠다. 일단 web-flux가 어떤 느낌인지 이해할 수 있을 정도로만 정리했다.

'프로그래밍 > SPRING' 카테고리의 다른 글

Spring 버전별 특징  (0) 2023.09.05
빌드와 빌드도구 ( Maven과 Gradle )  (2) 2023.09.03
Comments