BackEnd/Spring WebFlux

부록 - Spring Boot MVC vs Spring WebFlux 비교

Raconer 2025. 4. 28. 23:36
728x90

Spring Boot MVC와 Spring Boot WebFlux는 개발자가 작성하는 코드 스타일은 비슷하지만, 내부 구조, 기술 스택, 처리 방식이 본질적으로 다르다. 이 글에서는 MVC와 WebFlux를 특징 요약, 흐름도, 비교 테이블, 사용 기술 스택 중심으로 깔끔하게 정리한다.


0. Spring MVC vs Spring WebFlux - 특징 요약

📌 Spring MVC 특징

  • Servlet API 기반 전통적인 웹 애플리케이션 프레임워크
  • Blocking 방식: 요청 처리 동안 쓰레드를 점유
  • 개발 난이도 낮음: 코드가 직관적이고, 동기 흐름
  • Blocking 데이터베이스 (JDBC, JPA) 사용에 최적화
  • 전통적인 웹사이트, 사내 시스템에 적합

📌 Spring WebFlux 특징

  • Reactive Streams API 기반 비동기 프레임워크
  • Non-Blocking 방식: 필요할 때만 쓰레드 사용
  • Mono, Flux 기반 스트림 프로그래밍 필수
  • Non-Blocking 데이터베이스 (R2DBC, ReactiveMongo) 사용 최적화
  • 고트래픽 API 서버, 실시간 서비스 구축에 적합

✅ 둘 다 @RestController 스타일을 사용할 수 있지만, 처리 방식과 내부 구조는 완전히 다르다.


1. 흐름도 비교

1.1 Spring Boot MVC 요청 흐름

Client 요청
    ↓
Servlet Filter
    ↓
DispatcherServlet
    ↓
HandlerMapping → HandlerAdapter
    ↓
Controller (@RestController)
    ↓
Service → Repository (JDBC, JPA)
    ↓
ViewResolver (필요 시)
    ↓
Response 반환
  • DispatcherServlet이 핵심 엔진 역할
  • 요청~응답 사이에 쓰레드가 지속적으로 점유됨 (Blocking)

1.2 Spring Boot WebFlux 요청 흐름

Client 요청
    ↓
WebFilter
    ↓
DispatcherHandler
    ↓
HandlerMapping → HandlerAdapter
    ↓
Handler (Annotation Controller or RouterFunction)
    ↓
Service → Repository (R2DBC, ReactiveMongo)
    ↓
Mono/Flux 스트림 반환
    ↓
Response 스트리밍
  • DispatcherHandler가 핵심 엔진 역할
  • 데이터 준비가 완료될 때까지 쓰레드 점유 없이 대기 가능 (Non-Blocking)

2. 주요 특징 비교 테이블

구분Spring MVCSpring WebFlux

기반 Servlet API Reactive Streams API
요청 처리 동기 (Blocking) 비동기 (Non-Blocking)
Dispatcher DispatcherServlet DispatcherHandler
필터 체인 Servlet Filter WebFilter
컨트롤러 스타일 `` **, **
데이터베이스 접근 JDBC, JPA (Blocking) R2DBC, ReactiveMongo (Non-Blocking)
실시간 통신 WebSocket 별도 구현 필요 SSE, WebSocket 기본 지원
서버 엔진 Tomcat 기본 Netty, Tomcat(reactive 모드) 선택 가능
쓰레드 관리 요청당 하나씩 소모 쓰레드 재활용 (성능 우수)
개발 난이도 낮음 높음 (Reactive 이해 필요)

3. 사용하는 기술 스택

영역Spring MVCSpring WebFlux

서버 Tomcat, Jetty, Undertow (Servlet 기반) Netty(기본), Tomcat, Undertow (Reactive 모드)
DB 연동 JDBC, Hibernate, MyBatis R2DBC, ReactiveMongo, ReactiveCassandra
HTTP 클라이언트 RestTemplate (Blocking), WebClient (Non-Blocking 지원 가능) WebClient (Non-Blocking 기본)
메시징 Spring AMQP (RabbitMQ, Kafka) Spring Reactive Messaging (Kafka, RabbitMQ 등 Non-Blocking)

4. 추가적인 주요 차이

🔹 에러 처리

  • Spring MVC: @ControllerAdvice + @ExceptionHandler
  • Spring WebFlux: @ControllerAdvice + @ExceptionHandler + Flux/Mono 내부에서 onErrorResume 가능

🔹 트랜잭션 처리

  • Spring MVC: @Transactional 지원 (동기 트랜잭션)
  • Spring WebFlux: Reactive 트랜잭션 필요 (TransactionalOperator 사용)

🔹 API 문서화

  • 둘 다 SpringDoc OpenAPI 3 사용 가능
  • WebFlux는 Response 타입이 Flux/Mono이므로 추가 설정 주의 필요

✅ 최종 요약

Spring MVC와 Spring WebFlux는 코딩 스타일은 비슷하지만, 실제 운영 환경에서는 성능, 처리 방식, 기술 스택이 완전히 다르다.

선택 기준추천

사용자 수가 적거나 관리성 우선 Spring MVC
초대형 트래픽, 실시간 데이터 처리 Spring WebFlux

기술 선택은 "요구사항 + 트래픽 규모 + 팀 기술 역량" 3가지를 반드시 종합해서 결정해야 한다.

 

728x90