본문 바로가기
👩‍💻TIL/Spring

[WebFlux] Mono와 Flux 개념과 구현

by devuna 2021. 5. 9.
728x90

[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);

 

 

 

 

 

참고

github.com/reactor/reactor-core

godekdls.github.io/Reactor%20Core/contents/

728x90

댓글