Spring MVC vs Webflux - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Spring MVC vs Webflux



  • Spring MVC๋Š” Java EE์˜ Servlet Spec์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋งŒ๋“ค์–ด ์กŒ๋‹ค.
    • Synchronous blocking I/O ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉ
    • 1 request -> 1 thread
  • Webflux๋Š” non-blocking web framework์ด๋‹ค.
  • ๋‚ด์žฅ ์„œ๋ฒ„
    • Webflux('spring-boot-start-webflux')์˜ ๊ธฐ๋ณธ ๋‚ด์žฅ ์„œ๋ฒ„๋Š” Netty(๋น„๋™๊ธฐ์ ์ธ ์ด๋ฒคํŠธ ์ค‘์‹ฌ์˜ ์„œ๋ฒ„ ์ค‘ ํ•˜๋‚˜)์ด๋‹ค.
    • Spring Boot starter('spring-boot-starter-web')์˜ ๊ธฐ๋ณธ ๋‚ด์žฅ ์„œ๋ฒ„๋Š” Tomcat์ด๋‹ค.
  • Programming ๋ฐฉ์‹
    • Spring MVC๋Š” ๋ช…๋ นํ˜• ๋กœ์ง(Imperative programming)์œผ๋กœ, ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค.
      • ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค(์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์ฐจ๋‹จ๋˜๊ณ , ์ฐจ๋‹จ๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ๋‚ญ๋น„๋‹ค).
    • Webflux๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ reactive programming ๋ฐฉ์‹์ด๋‹ค(๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋Œ€์•ˆ).
      • ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ณด์Šค ์Šค๋ ˆ๋“œ์™€ cpu์˜ ์ฝ”์–ด ์ˆ˜์— ๋น„๋ก€ํ•˜๋Š” N๊ฐœ์˜ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ(many request -> 1 thread)
  • Event loop concurrency model
    • ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฒคํŠธ๋กœ ์ฒ˜๋ฆฌ
    • ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ DB๋‚˜ ๋„คํŠธ์›Œํฌ ์ž‘์—…๊ณผ ๊ฐ™์€ ์ง‘์ค‘์ ์ธ ์ž‘์—…์˜ ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•˜์—ฌ ๋ณ‘ํ–‰(concurrency)์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ฒŒ ํ•˜๊ณ , ๋‹ค๋ฅธ ์ด๋ฒถํŠธ ์ฒ˜๋ฆฌ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์™„๋ฃŒ ์ด๋ฒคํŠธ๋ฅผ ํ‘ธ์‹œํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ฐ›๋Š”๋‹ค.
  • Webflux๋Š” 2๊ฐ€์ง€ ๋ชจ๋ธ์„ ์ง€์›ํ•œ๋‹ค.
    • Annotated Controller
      • Spring MVC ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๊ธฐ์กด spring-web ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • Functional Endpoints
      • lambda ๋ฒ ์ด์Šค์˜ lightweightํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ
      • request์„ routing๊ณผ handling ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • callback ํ˜•ํƒœ๋กœ์จ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์ ์ด annotated controller ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ 

Webflux์˜ ํƒ„์ƒ ์ด์œ 

Servlet 3.1์—์„œ non-blocking I/O์— ๋Œ€ํ•œ API๋ฅผ ์ œ๊ณตํ–ˆ์œผ๋‚˜, non-blocking API๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Filter, Servlet ๋“ฑ์˜ ๋™๊ธฐํ™”๋‚˜ getParameter, getPart ๋“ฑ์˜ blocking์„ API์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๊ณง non-blocking์ด ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ƒˆ๋กœ์šด ๊ณตํ†ต API๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ๋˜์—ˆ๋‹ค.

์ฐธ๊ณ