728x90
Spring 생태계에는 두 가지 웹 프레임워크가 존재한다: Spring MVC와 Spring 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는 개발 속도가 빠르고, 구조가 단순하여 대부분의 전통적 웹 애플리케이션에 여전히 유리하다.
기술 선택은 트래픽 규모, 팀 역량, 시스템 요구사항을 종합적으로 고려해 결정해야 한다.
참고
728x90
'BackEnd > Spring WebFlux' 카테고리의 다른 글
Spring WebFlux에서 MySQL을 사용하는 방법: JDBC vs R2DBC 완전 정리 (0) | 2025.04.28 |
---|---|
부록 - Spring Boot MVC vs Spring WebFlux 비교 (0) | 2025.04.28 |
Spring WebFlux 심화 시리즈 (4) - WebClient를 활용한 대용량 데이터 처리 (0) | 2025.04.28 |
Spring WebFlux 심화 시리즈 (3) - Flux로 페이징 처리하는 방법 (0) | 2025.04.28 |
Spring MVC vs Spring WebFlux 시리즈 (2) - 콘텐츠 리스트를 WebFlux로 반환하는 방법 (0) | 2025.04.28 |