목차

Spring WebFlux vs Spring MVC

🗓️

WebFlux는 기존의 Spring MVC와 무엇이 다른가?

  1. 웹 어플리케이션을 위한 Spring MVC (블로킹)과 Spring WebFlux(넌블로킹) 방식이 있음
  2. 물론 Spring MVC안에서도 @Async 어노테이션으로 비동기 처리를 활성 할 수 있으나 Filter, Interceptor 자체가 동기 처리라 엄청난 성능 향상은 없음
  3. Spring WebFlux에도 Spring MVC와 마찬가지로 @Controller 어노테이션이 있있음. Spring MVC와 큰 차이라면 스트림을 위해 반환에 Mono, Flux를 사용.
  4. Spring MVC 는 톰캣 서블릿을 사용하는 프레임워크 고 WebFlux 는 Netty 를 사용하는 새로운 스프링 프레임워크임.
  5. 그래서 한 프로젝트 내에 (a.k.a 하나의 컨테이너 내에) MVC 와 WebFlux 가 양립할 수 없음. 공식 문서에서 양립할 수 있다고 하는것은 마이크로서비스 아키텍처 내에서 서로 다른 어플리케이션으로 서비스를 구성한다는 이야기.
  6. 이것을 풀어보자면 논블로킹의 잇점을 뒷받침 할만한 R2DBC, STOMP, 메시지 브로커(메시징 큐) 기술을 ‘본격’ 사용하려면 WAS가 분리되야 한다는 소리임.
  7. 반대로 트랜잭션 특성이 필요한 서비스에는 여전히 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)

볼만한 글