[Spring Boot] WebFlux란? reactive, 반응형 프로그래밍 개념정리



1. WebFlux란?

1.1 WebFlux 가 생긴 이유

  • 기존 스프링 프레임워크는 Servlet API와 Servlet 컨테이너로 이루어졌고, 동기적으로 요청을 처리함.
  • 기존 Spring MVC는 하나의 요청에 대해 하나의 스레드가 사용된다
    • thread:request(1:1), sync + blocking 방식
    • 스레드 생성에는 시간이 걸리기 때문에, 다수의 요청을 고려하여 미리 스레드 풀을 생성해놓는다.
    • 또한, 스레드는 컨텍스트 스위칭 비용이 발생한다.
    • 기존에는 하나의 요청마다 하나의 스레드를 할당하여 처리했다.
  • MSA 환경에서 한 서비스가 다수의 다른 서비스들에게 요청하고 결과를 기다릴 때 까지 스레드를 점유하면, 스레드가 계속해서 사용되고 있는 상황이 유지된다. 따라서, 다수의 유저에게 응답해줄 수 없다.
  • 이러한 문제로 인하여 적은 양의 스레드와 최소한의 하드웨어 자원으로 동시성을 핸들링하기 위해 만들어졌다.
  • 단일 스레드에서 Blocking I/O 와 Non-Blocking I/O 를 비교하면 아래와 같습니다.

image

1.2. WebFlux 특징

  • WebFlux 는 이를 리액티브 프로그래밍 방식을 사용하여 논블로킹과 고정된 스레드로 모든 요청을 처리하여 기존의 문제를 해결한다.
    • thread:many_request(1:N), async + nonblocking 방식
  • Spring Framwork5에서 새롭게 추가된 모듈이며 reactive 스타일의 어플리케이션 개발을 도와준다
    • reactive 란?
      • reactive란 반응형 프로그래밍으로 변화에 반응하게 만들어진 프로그래밍 모델
      • 반응형 프로그래밍은 데이터 스트림을 처리하며 이 데이터 스트림이 변경될 때마다 반응
      • 기존에 사용하던 명령형 프로그래밍의 경우는 컴퓨터가 수행해야 하는 일을 순서대로 처리
  • WebFlux 는 반응형 프로그래밍(Reactive Programming) 방식을 통해 Event-Driven(이벤트 기반)의 비동기식 애플리케이션을 구축
  • reactive-stack web framework이며 non-blocking에 Reactive stream 지원
  • 반응형 스트림(Reactive Stream)에서 Publisher-Subscriber 패턴을 사용
    • Publisher는 데이터를 생성하고 Subscriber는 이를 처리
    • 이벤트 스트림에 있는 데이터를 Subscriber가 비동기적으로 가져옴
  • tomcat이 아닌 netty 같은 async, non-blocking 서버 사용
    • webflux Non-Blocking Request을 수행 중에 결과가 반환되지 않더라도 다른 작업 수행 가능
  • 동기 프로그래밍과 비교하여 디버깅이 어려움
  • 비동기 소스코드 안에 동기 코드가 있으면, 비동기로 동작하지 않을 수 있어 주의 필요
  • 서비스간 호출이 많은 마이크로서비스 아키텍처에 적합

reference

  • https://heeyeah.github.io/spring/2020-02-29-web-flux/
  • https://adjh54.tistory.com/232
  • https://devmoony.tistory.com/174
  • https://techblog.woowahan.com/2667/