본문 바로가기

카테고리 없음

Spring Web vs Spring WebFlux

 

Spring Web과 Spring WebFlux는 모두 Spring 프레임워크의 웹 개발을 위한 모듈이지만, 동작 방식에 차이가 있습니다.

다음은 두 모듈의 주요 차이점입니다

1. 동기 vs 비동기 처리

  • Spring Web (MVC):
    • 동기 방식으로 작동합니다.
    • 요청을 처리할 때, 각 요청은 스레드를 점유하며, 해당 스레드가 작업을 완료하기 전까지는 다른 작업을 수행하지 못합니다. 이를 "스레드 기반" 모델이라 할 수 있습니다.
    • 요청이 많을 경우 스레드 풀이 가득 차면 성능이 저하될 수 있습니다.
  • Spring WebFlux:
    • 비동기, 논블로킹 방식으로 작동합니다.
    • 스레드가 작업을 처리하는 동안 블로킹되지 않으며, 다른 요청도 동시에 처리할 수 있습니다. 이를 "리액티브" 모델이라고 합니다.
    • 요청이 많아도 스레드가 블로킹되지 않으므로 더 높은 확장성을 제공합니다.

2. 리액티브 프로그래밍 모델

  • Spring Web:
    • 전통적인 MVC 패턴을 사용합니다.
    • 리액티브 스트림과 같은 비동기 처리를 기본적으로 지원하지 않으며, 일반적인 RESTful 요청/응답 방식에 맞춰져 있습니다.
  • Spring WebFlux:
    • 리액티브 프로그래밍을 기반으로 하며, Publisher, Subscriber, Mono, Flux 같은 리액티브 스트림 API를 사용합니다.
    • 데이터 스트림을 처리할 때 비동기적으로 동작하며, 특히 I/O 작업(데이터베이스, 네트워크 등)에서 효율적입니다.

3. 성능 및 확장성

  • Spring Web:
    • 동기적으로 처리하기 때문에 스레드 기반이며, 요청 수가 증가할수록 스레드 풀 크기에 따라 성능이 좌우됩니다.
    • CPU 및 메모리 자원을 많이 사용하여 고성능 트래픽을 처리할 때 확장성이 제한될 수 있습니다.
  • Spring WebFlux:
    • 비동기 논블로킹 방식이므로 더 적은 스레드로 더 많은 요청을 처리할 수 있어 고성능 및 확장성에 유리합니다.
    • 특히 I/O 바운드 작업에서 성능이 뛰어납니다.

4. API 차이

  • Spring Web:
    • @RestController, @RequestMapping, @GetMapping 등을 사용하며, 익숙한 동기적인 API를 제공합니다.
  • Spring WebFlux:
    • 리액티브 API인 Mono, Flux를 사용하며, 결과를 비동기적으로 반환합니다.
    • @RestController와 같은 익숙한 애노테이션을 사용할 수 있지만, 내부적으로는 비동기/논블로킹 방식으로 동작합니다.

5. 서버 지원

  • Spring Web:
    • 기본적으로 서블릿 기반의 Tomcat을 사용하며, 서블릿 스펙에 맞춰 동작합니다.
  • Spring WebFlux:
    • Netty, Undertow, Tomcat을 사용할 수 있으며, 특히 Netty는 리액티브 방식의 I/O 처리에 최적화되어 있습니다.

6. 적용 사례

  • Spring Web:
    • 비교적 요청 수가 적고, 동기적인 처리 모델이 충분히 좋은 성능을 발휘하는 경우 적합합니다.
    • 예: 전통적인 웹 애플리케이션, 간단한 CRUD API.
  • Spring WebFlux:
    • 대규모 트래픽, 많은 I/O 작업이 발생하는 서비스, 실시간 데이터 처리 또는 높은 확장성이 필요한 경우 적합합니다.
    • 예: 채팅 시스템, 실시간 데이터 스트리밍, 마이크로서비스 기반 아키텍처.

이 두 가지는 사용 사례와 요구 사항에 따라 선택되며, WebFlux는 특히 고성능, 비동기 요구 사항이 있는 환경에서 유리합니다.