출처 - https://github.com/jmxx219/CS-Study (opens in a new tab)
WebFlux
개념
-
Spring 5에서 도입된 비동기 논블로킹 웹 프레임워크
- 반응형 및 비동기적인 웹 애플리케이션 개발을 지원하는 모듈
- 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈
-
reacive-stack web framework
- non-blocking, reactive stream지원
목적
반응형 프로그래밍
을 통해 높은 처리량과 확장성을 갖는 어플리케이션을 만들도록 함- 적은 양의 스레드와 최소한의 하드웨어 자원으로
동시성 핸들링
- 서블릿3.1이 논블로킹을 지원하나 일부분임
- netty와 같은 잘 만들어진 async, non-blocking 서버 사용
netty: 비동기 이벤트 기반 네트워크 어플리케이션 프레임워크
배경 지식
■ 반응형 프로그래밍(Reactive Programming)
- 개념
- 데이터의 흐름과 변경사항의 전파에 중점을 둔 선언적 프로그래밍 패러다임
- EX) 엑셀의 스프레드 시트 동작과 같은 개념
- 비동기 데이터 Stream으로 Non-bolockin어플리케이션을 구현하는 프로그래밍
- Stream으로 프로그래밍 → 함수형 처리 가능
- 데이터의 흐름과 변경사항의 전파에 중점을 둔 선언적 프로그래밍 패러다임
- 특징
- 웹 프레임워크로의 전환으로 인해 웹 개발에서 반응형 프로그래밍이 중요해짐
- 웹 프레임워크의 본질: 값이 변경되었을때 템플릿에 선언해둔 대로 알아서 랜더링 해줌(=반응형)
- 데이터의 변경을 감지하고 선언적으로 프로그래밍하는 방법을 통해 View를 업데이트 하는 방식으로 발전
- 웹 프레임워크로의 전환으로 인해 웹 개발에서 반응형 프로그래밍이 중요해짐
■ 선언적 프로그래밍
- 개념
- 무엇을 해야할지 따로 약속(표현)을 만들어 기술하게 하고, 언제 어떻게 동작하는지는 내부에서 처리하는 방식의 프로그래밍 기법
- 특징
- 일반적으로 명령형 프로그래밍에 비해 가독성, 재사용성, 독립성, 유지보수성에서 좋음
- 내부 매커니즘은 숨기면서 필요한 로직만 외부에서 선언할 수 있게함
- 알고리즘을 구현하는데 발생하는 에러 최소화
- 시간과 변화에 구애받지 않고 개발하도록 도움
■ 변경사항의 전파 (Pull → Push)
- Pull에서 Push로의 전환
Pull
- 관련 데이터가 필요한 시점에 데이터를 요청하는 방식
- 레거시 데이터가 있거나 중복 요청이 있을 수 있음
Push
- 값이 변경될때마다 변경된 값을 전파해서 사용
- 언제나 변경된 최신의 데이터를 가지고 있음
반응형 프로그래밍의 패러다임에선 미리 선언되어있는 구조에서 값이 변화할때마다 템플릿으로 데이터를 전달하는 PUSH 관점으로 설계되도록 변화 됨
Reactive Streams
- 비동기 스트림 처리 표준을 정의한 스펙
- 데이터의 흐름과 백프레셔(Backpressure)를 관리하는 방법을 표준화
- 다양한 구현체가 존재할 수 있도록 설계
- 대표적인 구현체: Java 9의 Flow API
- 주요 인터페이스
Publisher
: 데이터 항목을 생성하고 구독자(Subscriber)에게 제공하는 역할Subscriber
: Publisher로부터 데이터를 구독하고, 데이터를 수신할 때 처리하는 역할Subscription
: 구독과 관련된 정보를 캡슐화하며, 구독자가 Publisher로부터 데이터를 요청하거나 구독을 취소할 수 있게 함Processor
: Publisher와 Subscriber의 역할을 모두 수행할 수 있는 인터페이스
Reactor
- Reactive Streams 표준을 구현한 라이브러리로, Spring WebFlux의 핵심 라이브러리
- 비동기 스트림을 효율적으로 처리하기 위한 다양한 도구와 API 제공
- 함수형 프로그래밍 스타일을 사용하여 데이터 스트림 처리
- 다양한 연산자를 제공하여 데이터 변환, 필터링, 집계 등을 수행
- 주요 클래스
Mono
- 0 또는 1개의 요소를 비동기적으로 처리하는데 사용
Flux
- 0부터 N개의 요소를 비동기적으로 처리하는데 사용
WebFlux는 Reactor와 Reactive Streams을 기반으로 한 비동기 논블로킹 웹 프레임워크
특징
- 비동기적인 이벤트 지향 프로그래밍을 통해 높은 확장성과 성능 제공
- 높은 확장성
- 비동기 논블로킹 방식으로 더 많은 동시 요청 처리 가능
- 효율적인 리소스 사용
- 효율적인 스레드 풀 사용 (블로킹 IO를 사용하지 않기때문)
- 백프레셔 관리
- Reactive Streams 표준을 따르기 때문에 데이터 흐름 제어와 백프레셔를 효과적으로 관리
백프레셔(Backpressure)
- 데이터 처리 시스템에서 생산자와 소비자 사이의 데이터 흐름을 제어하는 메커니즘
- 비동기 스트림 처리에서 생산자의 빠른 데이터 생성을 소비자가 따라잡지 못하는 경우 발생하는 시스템이 과부하, 메모리 문제 발생 방지를 위해 데이터 흐름을 조절하는 방법
- Reactive Streams 표준을 따르기 때문에 데이터 흐름 제어와 백프레셔를 효과적으로 관리
Spring MVC VS WebFlux
Spring MVC
- 동기 블로킹 방식의 전통적인 웹 프레임워크
- 서블릿 API 기반 동작
WebFlux
- 비동기 논블로킹 방식의 모듈이자 웹 프레임워크
- Reactive Streams 표준을 따르며, 다양한 논블로킹 런타임에서 실행될 수 있음
- 요청 처리 방식
Spring MVC
- 동기 및 블로킹 방식
- 요청이 들어오면 해당 요청을 처리할 스레드가 블로킹되어 응답이 완료될 때까지 기다림
Spring WebFlux
- 비동기 및 논블로킹 방식
- 요청이 들어오면 이벤트 루프 기반의 비동기 프로세싱을 통해 처리되어 한 스레드가 여러 요청을 처리 가능
- 동작 흐름
Spring MVC
- request - Dispatcher Servlet - Handler Mapper - Controller - B/L - Controller - ViewResolver ...
Spring WebFlux
- request - HttpHandler - WebHandler - Handler Mapper / Handler Adapter - Controller - B/L - 이하 같음
- 기본 구현체
Spring MVC
- 서블릿 API 기반 동작
- 주로 Tomcat, Jetty 같은 서블릿 컨테이너에서 실행
Spring WebFlux
- 서블릿 API 뿐만 아니라 Netty, Undertow 같은 논블로킹 런타임에서도 실행 가능
- 백프레셔 관리
Spring MVC
- 전통적인 방식으로 백프레셔 관리가 내장되어 있지 않음
- 동시 요청 수 제어에 제한이 있음
Spring WebFlux
- Reactive Streams 표준을 따름
- 백프레셔를 관리할 수 있어 시스템의 안정성 높임
- 응용 프로그래밍 적합성
Spring MVC
- 전통적인 웹 애플리케이션, RESTful 서비스 등 동기 요청/응답 모델에 적합
Spring WebFlux
- 대규모의 동시 연결을 처리해야 하는 애플리케이션, 실시간 데이터 스트리밍, 마이크로서비스 아키텍처 등에 적합
- 반응형 프로그래밍 지원
Spring MVC
- 일반적으로 블로킹 방식으로 코드를 작성하지만, 필요에 따라 CompletableFuture, ListenableFuture 등을 통해 비동기 작업 수행 가능
Spring WebFlux
- 기본적으로 Mono, Flux와 같은 Reactor 타입을 사용하여 반응형 프로그래밍 지원
REF
[Java] Spring Boot Webflux 이해하기 -1 : 흐름 및 주요 특징 이해 (opens in a new tab)
[Spring] WebFlux란? (opens in a new tab)
Spring WebFlux (opens in a new tab)