Skip to content

09. How Project Reactor adapts in RxJava

이진혁 edited this page May 25, 2021 · 2 revisions

이번에는 Reactive Streams를 구현하는 라이브러리간의 Publisher 상호변환에 대해 알아볼 것입니다.
우리가 지금 공부하고 있는 Project Reactor 라이브러리는 Publisher의 구현체로 FluxMono를 지원합니다.
마찬가지로 RxJava에서는 Flux와 대응되는 ObservableFlowable을 지원하고
Mono와 대응되는 Single을 지원합니다.
모두 Reactive Streams라는 명세서를 바탕으로 만들어진 라이브러리이기 때문에 서로 상호변환이 가능합니다.

// Observable -> Flux
Flux.from(Observable.just("apple", "banana", "grape").toFlowable(BackpressureStrategy.BUFFER));
// Flux -> Observable 
Observable.fromPublisher(Flux.just("apple", "banana", "grape"));

// Flowable -> Flux
Flux.from(Flowable.just("apple", "banana", "grape"));
// Flux -> Flowable 
Flowable.fromPublisher(Flux.just("apple", "banana", "grape"));

// Single -> Mono
Mono.from(Single.just("apple").toFlowable());
// Mono -> Single
Single.fromPublisher(Mono.just("apple"));

Example

Flowable을 Flux로
Flux를 Flowable로
Observable을 Flux로
Flux를 Observable로
Single을 Mono로
Mono를 Single로

FlowablePublisher 인터페이스를 구현한 반면에,
ObservableSinglePublisher가 아닌 ...Source를 구현한 것을 알 수 있습니다.
그래서 상호변환하면서 Flowable로 변환 뒤 변환하는 두 번의 변환 과정을 거쳐야 한다는 것을 알 수 있는데,
RxJava 측에서는 왜 Publisher를 구현하지 않았는지 모르겠습니다.

또한 Flux처럼 여러 개의 데이터를 담고 있는 Publisher
RxJava에는 FlowableObservable로 나누어지는데,
이는 데이터의 양과 사용되는 출처에 따라 나뉜다고 합니다.
정확한 정보는 나중에 RxJava에 대해 깊게 공부하면서 알아보도록 하겠습니다.

자바가 8버전에 이르면서 CompletableFuture라는 클래스가 추가되었습니다.
CompletableFuture는 자바에서 비동기 프로그래밍을 하기 위해서 추가된 것으로,
Project Reactor가 내부적으로 CompletableFuture로 구현되어 있습니다.
그래서 CompletableFutureProject ReactorMono간의 상호변환이 가능합니다.

// CompletableFuture -> Mono
Mono.fromFuture(CompletableFuture.supplyAsync(() -> "apple"));
// Mono -> CompletableFuture 
Mono.just("apple").toFuture();

Example

CompletableFuture를 Mono로
Mono를 CompletableFuture로

Flux는 안 되고 Mono만 가능한 것으로 보아 하나만 가질 수 있는 스트림을 모아서
Flux를 구현하지 않았을까라고 추측해봅니다.


Reference

백기선님의 Adapt 강의