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)
- Spring MVC๋ ๋ช
๋ นํ ๋ก์ง(Imperative programming)์ผ๋ก, ์ฝ๋ ์์ฑ ๋ฐ ๋๋ฒ๊น
์ด ์ฝ๋ค.
- 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 ๋ฐฉ์๊ณผ์ ์ฐจ์ด์
- Annotated Controller
Webflux์ ํ์ ์ด์
Servlet 3.1์์ non-blocking I/O์ ๋ํ API๋ฅผ ์ ๊ณตํ์ผ๋, non-blocking API๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Filter, Servlet ๋ฑ์ ๋๊ธฐํ๋ getParameter, getPart ๋ฑ์ blocking์ API์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋๋ค. ์ด๋ ๊ณง non-blocking์ด ๊ธฐ๋ฐ์ด ๋๋ ์๋ก์ด ๊ณตํต API๊ฐ ํ์ํ ์ด์ ๊ฐ ๋์๋ค.
์ฐธ๊ณ
- https://spring.io/reactive
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html
- https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-reactive.html
- https://docs.spring.io/spring-boot/docs/1.1.3.RELEASE/reference/html/howto-embedded-servlet-containers.html#howto-use-jetty-instead-of-tomcat
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-new-framework
- https://dreamchaser3.tistory.com/6
- https://kimyhcj.tistory.com/343