[WebFlux] Mono와 Flux 개념
💡 WebFlux란?
Spring WebFlux는 Spring 5에서 새롭게 추가된 모듈이다.
WebFlux는 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며,
reactive-stack web framework이며 non-blocking에 reactive stream을 지원합니다.
👉🏻 WebFlux의 개념 / Spring MVC와 간단비교 더 알아보기
💡 Mono와 Flux
Spring Webflux에서 사용하는 reactive library가 Reactor이고 Reactor가 Reactive Streams의 구현체이다.
그래서 Webflux 문서에 Reactive Streams가 언급되는 것이고 그거와 같이 Reactor가 나오고
주요 객체인 Mono / Flux가 나오는 것이다. 결국 Webflux의 동작 구조를 이해하는 Flux 와 Mono를 알고 넘어가야 한다.
Flux 와 Mono 의 차이점은 발행하는 데이터 갯수이다.
- Flux : 0 ~ N 개의 데이터 전달
- Mono : 0 ~ 1 개의 데이터 전달
💡 0 ~ 1 개의 데이터를 전달하는 Mono
Mono 역시, Reactive Streams 의 Publisher 인터페이스를 구현하는 구현체인데, Flux 와의 차이점은, Flux 는 0-N 개의 데이터를 처리하지만, Mono 는 0-1 개의 데이터를 처리한다.
Mono in action :
Mono.fromCallable(System::currentTimeMillis)
.flatMap(time -> Mono.first(serviceA.findRecent(time), serviceB.findRecent(time)))
.timeout(Duration.ofSeconds(3), errorHandler::fallback)
.doOnSuccess(r -> serviceM.incrementSuccess())
.subscribe(System.out::println);
💡 0 ~ N 개의 데이터를 전달하는 Flux
Flux 는 Reactive Streams 에서 정의한 Publisher 의 구현체로서, 0-N 개의 데이터를 발행(전달,방출)할 수 있다. 하나의 데이터를 전달할 때마다 onNext 이벤트를 발생한다. Flux 내의 모든 데이터의 전달 처리가 완료 되면 onComplete 이벤트가 발생하며, 데이터를 전달하는 과정에서 오류가 발생하면 onError 이벤트가 발생한다.
Flux in action :
Flux.fromIterable(getSomeLongList())
.mergeWith(Flux.interval(100))
.doOnNext(serviceA::someObserver)
.map(d -> d * 2)
.take(3)
.onErrorResume(errorHandler::fallback)
.doAfterTerminate(serviceM::incrementTerminate)
.subscribe(System.out::println);
참고