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 요청 흐름
- 클라이언트 요청 →
- DispatcherServlet →
- HandlerMapping에서 컨트롤러 찾기 →
- Controller에서 비즈니스 로직 실행 →
- ViewResolver를 통해 응답 반환 →
- 클라이언트에 응답 전송
Spring WebFlux
Spring WebFlux는 비동기 및 논블로킹 프로그래밍 모델로 Reactive Streams 사양을 기반으로 합니다.
Netty나 Servlet 3.1+ (비동기 지원)를 사용하여 리액티브 스트림 기반의 처리를 지원합니다.
Event-Loop 기반으로 Reactive Programming을 지원합니다.
특징
- 비동기적 처리 모델
- 논블로킹 I/O 기반
- Reactive Streams를 사용하여 데이터 스트림을 비동기적으로 처리합니다.
- 다량의 I/O 작업이 발생하는 애플리케이션에 적합합니다.
장점
- 높은 동시성 처리가 가능하며, 리소스 사용이 효율적입니다.
- 적은 수의 스레드로 수천, 수만 개의 요청을 처리할 수 있습니다.
- Microservices 및 Cloud-Native 애플리케이션에 적합합니다.
단점
- 리액티브 프로그래밍에 익숙하지 않은 개발자에게는 학습 곡선이 가파를 수 있습니다.
- 기존 블로킹 라이브러리와의 호환성 문제가 발생할 수 있습니다.
- 디버깅과 테스트가 어려울 수 있습니다.
Spring WebFlux 요청 흐름
- 클라이언트 요청 →
- DispatcherHandler →
- HandlerMapping에서 핸들러 찾기 →
- Reactive Controller에서 비즈니스 로직 실행 →
- Publisher를 통해 비동기 스트림 반환 →
- 클라이언트에 비동기 스트림 데이터 응답
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 |