Spring Webflux) 개요

Date:    Updated:

카테고리:

Spring Webflux?


Spring 5.0부터 지원하는 Reactive web framework 다.

Reactive Streams API를 지원하여 Reactive 스타일의 어플리케이션 개발을 할수 있다.

Reactive Programming? 데이터 스트림과 변화의 전파를 중심으로 한 비동기 프로그래밍 패러다임이다. 즉, 데이터의 변화를 이벤트로 하여 수/송신자 사이에 데이터 스트림을 주고받는다.

Spring MVC 와 차이점


  • Spring MVC
    • 동기적으로 동작하는 Blocking 방식
    • 코드 작성과 디버깅에 용이함
    • Thread pool을 활용하여 사용자의 요청에 대응 (Thread per request model)
      • 다수의 사용자 요청이 들어올 경우 그만큼 많은 리소스를 사용해야함
      • Context switching 비용 발생
      • Thread pool size를 초과할경우, Thread Pool Hell 현상 발생가능
    • JDBC, JPA 지원
  • Spring Webflux
    • 비동기적으로 동작하는 Non-blocking 방식
    • event loop를 활용하여 thread를 block 하지 않음 (Event Loop model)
      • callback 형식으로 thread에 작업을 요청하고 완료시 응답을 받음
      • Context switching의 overhead가 줄어들음
      • (thread block 하지 않기 때문에) 단일(혹은 최소한의) thread로도 최대 성능 보장
        • thread 가 쉬지않고 계속해서 일함
    • RxJava, Reactor 지원

Spring Webflux 장/단점

  • 장점
    • 효율적으로 리소스를 사용함
    • 요청이 순간적으로 늘어나도 유연하게 커버 가능함
    • 동시성을 극한으로 이용하여 응답속도를 단축
    • Reactor, Coroutine으로 코드 가독성을 유지가능
      • 코드 자체는 동기, 절차지향적인 스타일로 작성
      • 그러나 내부적으로는 비동기적으로 동작
  • 단점
    • 비동기 로직 처리에 대한 고민이 필요함
      • 결과가 나중에 들어옴
      • 해당 결과를 다른 thread로 일임하여 핸들링 해야하는 경우가 발생
      • 때문에 디버깅, 에러 핸들링 할때 어려움 발생
    • 아직 완벽하지 않은 생태계

그렇다면 무조건 Spring Webflux가 더 좋은가?


구축하는 서비스가 다량의 동시접속자를 대응해야 한다면 Spring Webflux를 사용하는 것이 좋다.

또한 요청을 처리하는 파이프라인의 구성요소들이 전부 Non-blocking 하게 동작해야 최상의 성능을 이끌어낼 수 있다.

특정한 구간에서 Blocking이 발생하는 경우, thread block 이 발생하며 이는 곧 성능 저하로 직결된다.
(보통 Webflux 환경에서는 Spring MVC 환경보다 상대적으로 더 적은 스레드(core * 2)를 운용하므로 치명적)

그렇지 않은경우 Spring MVC를 사용하는 것이 코드작성, 디버깅 등 생산성 면에서 훨씬 좋다.

📣 Reference

패스트캠퍼스 - Spring Webflux 완전정복 : 코루틴부터 리액티브 MSA 프로젝트까지
Spring Framework docs - Spring Webflux
자바 기반의 스프링 Web MVC 와 WebFlux 성능 분석
Spring Webflux와 WebClient
Spring5 리액티브 스트림 정리 및 api 전달 방식 정리
Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까?
Webflux 진짜로 대용량 처리에서 MVC 보다 빠를까??
[Spring Webflux] 웹플럭스에 대한 간단 정리
내가 만든 WebFlux가 느렸던 이유

댓글남기기