WebFlux는 기존의 Spring MVC와 무엇이 다른가?
- 웹 어플리케이션을 위한 Spring MVC (블로킹)과 Spring WebFlux(넌블로킹) 방식이 있음
- 물론 Spring MVC안에서도
@Async
어노테이션으로 비동기 처리를 활성 할 수 있으나 Filter, Interceptor 자체가 동기 처리라 엄청난 성능 향상은 없음 - Spring WebFlux에도 Spring MVC와 마찬가지로
@Controller
어노테이션이 있있음. Spring MVC와 큰 차이라면 스트림을 위해 반환에Mono
,Flux
를 사용. - Spring MVC 는 톰캣 서블릿을 사용하는 프레임워크 고 WebFlux 는 Netty 를 사용하는 새로운 스프링 프레임워크임.
- 그래서 한 프로젝트 내에 (a.k.a 하나의 컨테이너 내에) MVC 와 WebFlux 가 양립할 수 없음. 공식 문서에서 양립할 수 있다고 하는것은 마이크로서비스 아키텍처 내에서 서로 다른 어플리케이션으로 서비스를 구성한다는 이야기.
- 이것을 풀어보자면 논블로킹의 잇점을 뒷받침 할만한 R2DBC, STOMP, 메시지 브로커(메시징 큐) 기술을 ‘본격’ 사용하려면 WAS가 분리되야 한다는 소리임.
- 반대로 트랜잭션 특성이 필요한 서비스에는 여전히 Spring MVC가 유효하다는 이야기.
실제로 Async를 활성화 한 Spring MVC 와 Spring WebFlux의 단순 처리 속도 차이는 있다. (약 5배)
Spring MVC (with Async)
Concurrency Level: 40
Time taken for tests: 101.186 seconds
Complete requests: 1600
Failed requests: 0
Total transferred: 224000 bytes
HTML transferred: 12800 bytes
Requests per second: 15.81 [#/sec] (mean)
Time per request: 2529.642 [ms] (mean)
Time per request: 63.241 [ms] (mean, across all concurrent requests)
Transfer rate: 2.16 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 509 2476 191.4 2501 2587
Waiting: 508 2476 191.5 2501 2586
Total: 510 2476 191.3 2501 2587
Percentage of the requests served within a certain time (ms)
50% 2501
66% 2501
75% 2502
80% 2502
90% 2502
95% 2503
98% 2506
99% 2515
100% 2587 (longest request)
Spring WebFlux
Concurrency Level: 40
Time taken for tests: 21.350 seconds
Complete requests: 1600
Failed requests: 0
Total transferred: 222400 bytes
HTML transferred: 11200 bytes
Requests per second: 74.94 [#/sec] (mean)
Time per request: 533.748 [ms] (mean)
Time per request: 13.344 [ms] (mean, across all concurrent requests)
Transfer rate: 10.17 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 500 504 21.2 502 1186
Waiting: 500 504 19.9 502 1149
Total: 500 504 21.3 502 1186
Percentage of the requests served within a certain time (ms)
50% 502
66% 502
75% 502
80% 502
90% 504
95% 508
98% 560
99% 598
100% 1186 (longest request)