Spring MVC와 Spring Webflux
- Spring MVC는 Blocking / 동기방식으로 동작한다.
- 요청이 발생할 경우, 스레드풀 내 스레드 하나를 점유해 요청을 처리한다.
- Spring Webflux는 Non-Blocking / 비동기방식으로 동작한다.
- 요청이 발생할 경우, 이벤트 루프가 돌아서 해당 이벤트를 처리하는 핸들러에게 처리를 위임하고, 처리가 완료되면 callback 메소드 등을 통해 응답을 반환한다.
Spring Webflux를 사용하는 이유
- Spring MVC에 비해 적은 스레드를 이용하여 동시성을 핸들링한다.
- 즉 서버 자원을 낭비하지 않고 효율적으로 동작하는 것을 목적으로 사용한다.
- 보통 Spring MVC 의 Tomcat 서버에서는 스레드 수가 Default 200개이다. 서버에 요청이 많지 않을 경우, 노는 스레드가 생기고, 그만큼 자원이 낭비된다.
Reactive
Reactive Stream
- Spring Webflux 에서 사용하는 Reactor는 Reactive Stream의 구현체이다.
- 논블로킹과 백프레셔를 이용한 비동기 데이터 처리의 표준
- Subscriber -> Publisher: 구독 요청
- Publisher -> Subscriber: Subscription 정보 전달
- Subscriber -> Subscription -> Publisher: Subscription의 request 함수를 통해 Publisher에게 요청
- Publisher -> Subscription -> Subscriber: Subscription의 시그널(onNext, onComplete, onError 등)을 응답
Mono와 Flux
- Flux와 Mono는 Reactive Stream의 구현체인 Reactor 객체이며, 차이점은 발행하는 데이터 갯수이다.
- Flux: 0 ~ N 개의 데이터 전달
- Mono: 0 ~ 1 개의 데이터 전달