[Spring WebFlux] 왜 WebFlux를 선택했는가? (Tomcat NIO와 비교)

2025. 9. 26. 18:25·Spring Framework/Spring & Spring Boot

들어가며

티켓팅 프로젝트에서 Spring WebFlux를 사용했다는 이야기를 하면 종종 이런 질문을 받습니다.

“톰캣도 NIO를 지원하는데, 굳이 WebFlux를 선택한 이유가 뭔가요?”

 

저도 처음에는 “어차피 둘 다 non-blocking이면 큰 차이가 없지 않을까?” 라고 생각했지만, 실제로 비교해보면 철학과 활용 범위에서 확실한 차이가 있었습니다.

 

이번 글에서는 WebFlux와 Tomcat NIO를 비교하며 WebFlux를 선택한 이유를 정리해 보겠습니다.

아키텍처의 차이

  • Tomcat NIO
    • Servlet API 기반으로 동작
    • 필터 체인, Request/Response 객체 등 서블릿 스펙의 제약 존재
  • WebFlux
    • Reactive Streams 표준 기반
    • Netty 같은 이벤트 루프 서버에 최적화
    • 서버-프레임워크-애플리케이션까지 일관된 reactive 아키텍처

Non-blocking 범위의 차이

  • Tomcat NIO
    • 요청 처리 레벨에서 non-blocking 지원
    • 하지만 DB 접근, 외부 API 호출 등은 보통 여전히 blocking 코드
  • WebFlux
    • Reactor 기반 프로그래밍 모델 제공
    • end-to-end non-blocking 가능 (서버부터 비즈니스 로직까지)

확장성(Scalability)

  • Tomcat NIO
    • Thread Pool을 효율적으로 활용
    • 요청이 많아지면 결국 worker thread 증가 → 컨텍스트 스위칭 비용 ↑
  • WebFlux
    • 소수의 이벤트 루프 쓰레드로 대규모 동시 요청 처리 가능
    • 특히 IO bound 환경에서 강력한 성능 발휘

Spring에서의 선택 이유

  • WebFlux는 단순히 NIO 서버 위에서 돌아가는 게 목적이 아님
  • Reactive Streams 프로그래밍 모델을 애플리케이션 레벨에서 제공하는 것이 핵심
  • 따라서 “논블로킹 서버를 쓰고 싶다”면 Tomcat NIO로도 충분할 수 있지만, Reactive 철학을 애플리케이션 전반에 녹이고 싶다면 WebFlux가 적합

나의 인사이트

개발자로서 중요한 건 단순히 기술적인 지원 여부가 아니라, 애플리케이션 전반에서 일관된 모델을 유지할 수 있느냐였습니다.

Tomcat NIO는 “웹 서버의 비동기 I/O”를 제공하는 데 초점이 맞춰져 있다면, WebFlux는 “프로그래밍 모델 자체를 reactive하게 바꾸자”라는 더 큰 목적이 있습니다. 저는 이 차이가 “왜 WebFlux를 선택해야 하는가?”라는 질문에 대한 가장 적절한 답이라고 생각합니다.

참고 자료

  • Spring WebFlux 공식 문서
  • Servlet 3.1 NIO 공식 문서

'Spring Framework > Spring & Spring Boot' 카테고리의 다른 글

[Spring] DB 개인정보 암호화 시스템 구축기: AES‑256‑GCM + Blind Index  (0) 2026.03.22
[Redisson] SpringBoot + Redisson을 활용한 동시성 문제 해결하기  (1) 2024.02.15
[SpringBoot / ERROR] @RequestParam 예외: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection.  (0) 2024.01.18
'Spring Framework/Spring & Spring Boot' 카테고리의 다른 글
  • [Spring] DB 개인정보 암호화 시스템 구축기: AES‑256‑GCM + Blind Index
  • [Redisson] SpringBoot + Redisson을 활용한 동시성 문제 해결하기
  • [SpringBoot / ERROR] @RequestParam 예외: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection.
Log Cat
Log Cat
잊어버리지 않기 위한 메모장
  • Log Cat
    개발 메모장
    Log Cat
  • 전체
    오늘
    어제
    • 전체보기 (45) N
      • Book Review (6)
      • Language (15) N
        • Java (10) N
        • Go (1)
        • JavaScript (1)
        • TypeScript (3)
      • Computer Science (3)
        • Network (1)
        • Database (1)
        • Design Pattern (0)
      • Spring Framework (10)
        • Spring & Spring Boot (4)
        • Spring Batch (4)
        • Servlet & JSP (2)
      • Python Framework (3)
        • FastAPI (3)
      • Infra (3)
        • Dcoker (1)
        • Kafka (2)
      • ORM (1)
        • JPA (1)
      • Fun (1) N
      • Error (2)
      • Retrospective (0)
      • Certificate (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 인기 글

  • 태그

    BOJ
    leetcode
    프로그래머스 문제
    jvm
    Typescript
    spring kafka
    네트워크 원리
    spring
    코테
    fastapi
    개발서적
    Python
    spring boot
    백준
    리트코드
    effective java 3/e
    이팩티브 자바
    프로그래머스문제
    escape-analysis
    우아한테크코스
    Java
    네트워크
    코딩테스트
    개발서적리뷰
    프로그래머스
    자바 풀이
    jmm
    자바
    programmers
    성공과 실패를 결정하는 1%의 네트워크 원리
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Log Cat
[Spring WebFlux] 왜 WebFlux를 선택했는가? (Tomcat NIO와 비교)
상단으로

티스토리툴바