Blog
스터디
CS Study with SON
24주차
WebFlux

출처 - 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)
      • 데이터 처리 시스템에서 생산자와 소비자 사이의 데이터 흐름을 제어하는 메커니즘
      • 비동기 스트림 처리에서 생산자의 빠른 데이터 생성을 소비자가 따라잡지 못하는 경우 발생하는 시스템이 과부하, 메모리 문제 발생 방지를 위해 데이터 흐름을 조절하는 방법


Spring MVC VS WebFlux

스크린샷 2024-07-30 오전 9 12 30

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)