본문 바로가기

MVC

[Spring] Spring MVC vs Spring WebFlux

Spring MVC vs Spring WebFlux

Spring MVC와 Spring WebFlux는 Spring Framework에서 웹 애플리케이션을 개발하기 위한 두 가지 주요 프로그래밍 모델이다. 두 모델은 아키텍처와 비동기 처리 방식에서 큰 차이를 보인다.


Spring MVC

Spring MVC는 전통적인 동기식 프로그래밍 모델로 Servlet API 기반입니다.

블로킹 I/O를 사용하여 하나의 요청이 처리되는 동안 쓰레드가 블로킹된다.

Thread-Per-Request 모델을 사용한다.

 

 

특징

  • 동기적 처리 모델
  • 블로킹 I/O 기반 (Servlet 3.x 이상)
  • JVM의 기본 스레드 풀을 사용하며, 하나의 요청당 하나의 스레드를 할당합니다.
  • 모놀리식 아키텍처에 적합하며, 레거시 시스템과의 통합이 쉽습니다.

장점

  • 간단하고 익숙한 프로그래밍 모델로, 대부분의 웹 개발자에게 친숙합니다.
  • 전통적인 웹 애플리케이션에 적합합니다.
  • 기존의 많은 라이브러리와 통합이 용이합니다.

단점

  • 동시성 처리가 제한적입니다.
  • 높은 I/O 처리 요구를 가진 애플리케이션에서는 성능이 떨어질 수 있습니다.
  • 리소스 소모가 크며, 대규모 트래픽 처리에 비효율적일 수 있습니다.

Spring MVC 요청 흐름

  1. 클라이언트 요청
  2. DispatcherServlet
  3. HandlerMapping에서 컨트롤러 찾기 →
  4. Controller에서 비즈니스 로직 실행 →
  5. ViewResolver를 통해 응답 반환 →
  6. 클라이언트에 응답 전송

Spring WebFlux

Spring WebFlux는 비동기 및 논블로킹 프로그래밍 모델 Reactive Streams 사양을 기반으로 합니다.

Netty나 Servlet 3.1+ (비동기 지원)를 사용하여 리액티브 스트림 기반의 처리를 지원합니다.

Event-Loop 기반으로 Reactive Programming을 지원합니다.

 

특징

  • 비동기적 처리 모델
  • 논블로킹 I/O 기반
  • Reactive Streams를 사용하여 데이터 스트림을 비동기적으로 처리합니다.
  • 다량의 I/O 작업이 발생하는 애플리케이션에 적합합니다.

장점

  • 높은 동시성 처리가 가능하며, 리소스 사용이 효율적입니다.
  • 적은 수의 스레드수천, 수만 개의 요청을 처리할 수 있습니다.
  • MicroservicesCloud-Native 애플리케이션에 적합합니다.

단점

  • 리액티브 프로그래밍에 익숙하지 않은 개발자에게는 학습 곡선이 가파를 수 있습니다.
  • 기존 블로킹 라이브러리와의 호환성 문제가 발생할 수 있습니다.
  • 디버깅과 테스트가 어려울 수 있습니다.

Spring WebFlux 요청 흐름

  1. 클라이언트 요청
  2. DispatcherHandler
  3. HandlerMapping에서 핸들러 찾기 →
  4. Reactive Controller에서 비즈니스 로직 실행 →
  5. Publisher를 통해 비동기 스트림 반환
  6. 클라이언트에 비동기 스트림 데이터 응답

 

Spring MVC vs Spring WebFlux 주요 차이점

특징 Spring MVC WebFlux
프로세싱 모델 동기 (Synchronous) 비동기 (Asynchronous)
I/O 모델 블로킹 I/O 논블로킹 I/O
기반 서버 Servlet 컨테이너 (Tomcat, Jetty 등) Netty, Servlet 3.1+
스레드 모델 Thread-Per-Request Event-Loop + Non-Blocking
동시성 처리 제한적 (스레드 수에 의해 제한됨) 높은 동시성 처리 가능
적합한 애플리케이션 모놀리식, 레거시 웹 애플리케이션 마이크로서비스, 리액티브 시스템
성능 소규모 트래픽에서 효율적 대규모 트래픽 처리에 효율적
코딩 스타일 전통적인 MVC (블로킹 방식) 리액티브 프로그래밍 (비동기 스트림 방식)
리액티브 지원 X O (Reactive Streams 및 Project Reactor 기반)
REST API 개발 간단한 REST API에 적합 대규모 비동기 REST API에 적합

 

 

 

'MVC' 카테고리의 다른 글

[MVC] 파일 업로드  (0) 2024.08.06
[MVC] 스프링 타입 컨버터  (0) 2024.08.05
[MVC] API 예외 처리 @ExceptionHandler  (0) 2024.08.02
[MVC] 예외 처리와 오류 페이지  (0) 2024.08.01
[MVC] 필터, 인터셉터  (0) 2024.07.31