BackEnd/Spring WebFlux

Spring MVC vs Spring WebFlux 시리즈 (1) - 왜 WebFlux를 선택하는가?

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

Spring 생태계에는 두 가지 웹 프레임워크가 존재한다: Spring MVCSpring WebFlux. 둘 다 웹 애플리케이션을 개발하는 데 사용되지만, 내부 아키텍처와 동작 방식에 명확한 차이가 있다. 이 글에서는 MVC와 WebFlux를 비교하고, Blocking과 Non-Blocking의 기술적 차이까지 포함해 정리한다.


1. 기본 비교: Spring MVC vs Spring WebFlux

항목 Spring MVC Spring WebFlux
처리 모델 동기 (Blocking) 비동기 (Non-Blocking)
요청당 쓰레드 요청마다 하나 점유 필요할 때만 쓰레드 사용
API 스타일 @RestController @RestController, RouterFunction
지원 데이터베이스 JDBC, JPA (Blocking) R2DBC, ReactiveMongo (Non-Blocking)
실시간 대응 제한적 자연스러움 (SSE, WebSocket)
트래픽 처리량 제한적 (쓰레드 수에 따라) 고트래픽에 강함
사용 예시 전통적 웹사이트, 관리 시스템 실시간 API 서버, 대규모 트래픽 처리 시스템

2. Blocking vs Non-Blocking

2.1 Blocking

  • 클라이언트 요청이 오면 서버는 쓰레드를 점유해서 응답이 끝날 때까지 기다린다.
  • 데이터베이스, 파일 I/O, 외부 API 호출 모두 요청이 완료될 때까지 쓰레드를 잡고 있다.
  • 많은 요청이 몰리면, 쓰레드가 부족해서 서버가 응답 지연 또는 다운된다.

예시 (Blocking)

@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
    return userRepository.findById(id); // DB 작업 완료까지 대기
}

2.2 Non-Blocking

  • 클라이언트 요청을 받으면, 서버는 작업을 던져놓고 다른 요청을 처리한다.
  • 데이터가 준비되면 콜백 또는 이벤트를 통해 작업을 이어간다.
  • 적은 수의 쓰레드로도 수천~수만 요청을 동시에 처리할 수 있다.

예시 (Non-Blocking)

@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable Long id) {
    return userRepository.findById(id); // 데이터 준비될 때 응답
}

3. Spring WebFlux를 사용하는 이유

3.1 대규모 트래픽 대응

  • WebFlux는 Non-Blocking 기반이기 때문에 적은 수의 리소스로 대량의 요청을 처리할 수 있다.
  • 고성능이 필요한 시스템(API Gateway, 실시간 서버 등)에서 강력한 성능을 발휘한다.

3.2 실시간 데이터 스트리밍 지원

  • WebFlux는 SSE(Server Sent Events), WebSocket을 기본 지원한다.
  • 실시간 알림, 채팅, 주식 시세 스트리밍 같은 시스템 구축에 적합하다.

3.3 백프레셔(Backpressure) 지원

  • 소비자가 감당할 수 있는 만큼만 데이터를 보낸다.
  • 데이터 소비 속도를 제어할 수 있어, 서버와 클라이언트 모두 안정적으로 운영할 수 있다.

3.4 비동기 API 클라이언트(WebClient) 통합

  • WebClient를 통해 외부 API 호출도 Non-Blocking으로 처리할 수 있다.
  • 기존 RestTemplate (Blocking) 대비 더 나은 성능과 리소스 사용 효율을 제공한다.

4. 언제 Spring MVC를 쓰고, 언제 WebFlux를 쓸까?

질문 답변
트래픽이 많지 않은가? Spring MVC 사용
실시간 기능이 필요한가? Spring WebFlux 고려
데이터 소스가 Blocking인가? Spring MVC 사용 가능
팀이 비동기 프로그래밍에 익숙한가? WebFlux 도입 가능
빠른 개발, 쉬운 유지보수가 필요한가? Spring MVC 우선

5. 정리

Spring WebFlux는 고성능, 대규모 비동기 시스템을 구축하는 데 적합하다. 하지만 비동기 프로그래밍 모델에 대한 이해도가 필요하고, 코드 복잡도가 높아질 수 있다. 반면, Spring MVC는 개발 속도가 빠르고, 구조가 단순하여 대부분의 전통적 웹 애플리케이션에 여전히 유리하다.

기술 선택은 트래픽 규모, 팀 역량, 시스템 요구사항을 종합적으로 고려해 결정해야 한다.

 

참고

https://github.com/Raconer/SpringWebFlux

728x90