관리 메뉴

나만을 위한 블로그

[Rxjava] Observable vs Flowable 본문

개인 공부/Rxjava

[Rxjava] Observable vs Flowable

참깨빵위에참깨빵_ 2021. 6. 21. 00:15
728x90
반응형

Rxjava에는 2가지 타입이 있다. 이전에 포스팅한 Observable과 새로 소개할 Flowable이 그것이다.

그러니 2가지를 비교하기 전에 먼저 Flowable이 무엇인지 확인해보자.

Flowable을 사전에 치면 아래의 뜻이 나온다.

Flowable : 유동적임

 

그런데 잘 보면 Flowable은 flow 뒤에 can을 의미하는 able이 붙은 형태다. 즉, flow란 단어가 원형인 단어다.

이 flow의 사전적 정의는 아래와 같다.

Flow : 흐름 / 계속적인 공급(생산), (공급생산품의) 흐름, 이동 / 흐르다

 

흐름의 사전적 정의를 통해 생각해보면, flow란 한 자리에 멈춰 있는 게 아니라 어떤 방향을 향해 한 줄기로 잇따라 진행되는 것을 말하는 단어라는 걸 알 수 있다. 그럼 이젠 다른 궁금증이 생긴다. Rxjava 개발자들은 왜 이 단어에 able이 붙은 형태의 요소를 만들어냈을까? Observable은 Rxjava 공식 홈페이지에서 Rxjava의 시작이라고까지 말하는 것인데, 혹시 이것에 어떤 문제가 있어서 Flowable이라는 새로운 개념이 탄생한 것인가?

아래 포스팅에서 단서가 될 만한 문단을 발견했다.

https://medium.com/mindorks/rxjava-types-of-observables-404d75605e35

 

RxJava — Types of Observables

Understanding RxJava for Android Development is like one of the most important things for an Android Developer.

medium.com

Flowable은 Observable과 유사하지만 옵저버가 수신(received) / 소비(consumed)할 수 없는 엄청난 수의 값을 Observable이 방출(emitting)할 때 나타난다. 이 경우 Observable은 전략에 따라 일부 값을 건너뛰어야 한다. 그렇지 않으면 예외가 발생한다. 여기서 Flowable Observable은 전략으로 이 예외를 처리하기 때문에 의미가 있다. 이 전략을 BackPressureStrategy라고 한다.
Flowable은 Observable과 유사하게 Flowable.create()와 같이 만들 수 있다. Flowable의 관찰자(Observer)는 Observable의 관찰자와 동일하다.

 

이 문단에서 내가 이해한 내용은 아래와 같다.

 

  • Flowable은 Observable의 일종이다. create()를 통해 생성하는 방법이 Observable과 일치한다.
  • Flowable은 옵저버가 수신 또는 소비할 수 없는 많은 양의 데이터가 방출될 때 사용할 수 있다.
  • 많은 양의 데이터가 방출될 때 Observable을 사용하면 예외가 발생한다. Flowable은 BackPressureStrategy라는 전략으로 이를 커버한다.

단순히 많은 데이터를 처리할 때 용이하기 때문에 Flowable이 생겨난 것인가?

스다 토모유키라는 사람이 지은 "Rxjava 리액티브 프로그래밍"에선 아래와 같이 말한다.

Observable과 Observer의 관계는 Flowable과 Subscriber의 관계와 거의 같지만, Reactive Stream 사양을 구현하지 않았다는 점과 배압 기능이 없는 점이 다릅니다.
클래스 구성이나 제공되는 메서드 등도 배압에 관련된 기능을 제외하고 Flowable과 거의 같아서 Flowable 사용법을 알고 있으면 Observable도 사용할 수 있습니다.

 

Observable과 Observer, Flowable과 Subscriber의 관계를 표로 나타내면 아래와 같다.

구분 생산자 소비자
Reactive Streams 지원 Flowable Subscriber
Reactive Streams 미지원 Observable Observer

그리고 Observable과 Flowable의 차이 중 하나는 "배압"이라는 것을 알 수 있다. 그런데 Reactive Streams는 또 뭘까? 일단 제쳐두고 계속 보자.

또한 아래의 내용도 적혀 있다.

Rxjava 2.x 버전을 사용할 때 Flowable을 사용해야 할지 Observable을 사용해야 할지 고민된다면 Rxjava의 위키에서 MissingBackPressureException OutOfMemoryError 를 피하는 방법으로 제안하는 다음 기준을 살펴보면 도움이 됩니다.
Flowable 사용 : 대량 데이터(예를 들어 10,000건 이상)를 처리할 때 / 네트워크 통신이나 DB 등의 I/O 처리를 할 때
Observable 사용 : GUI 이벤트 / 소량 데이터(예를 들어 1,000건 이하)를 처리할 때 / 데이터 처리가 기본적으로 동기 방식이며 자바 표준의 Stream 대신 사용할 때

 

이 외에도 저자의 개인적인 생각이 적혀 있는데, 이 부분은 따로 책을 사서 읽어보는 게 낫겠다. 이 지면을 할애해서 굳이 적어야 할 필요성을 느끼지 못해서기도 하다.


본론으로 돌아와서, 위에서 Flowable이란 무엇인지에 대해서 조금 감을 잡은 것 같다. 그러나 같은 Observable이라도 둘의 차이는 배압이라고 방금 말했다. 배압이 뭘까?

"Rxjava 리액티브 프로그래밍" 의 어느 페이지 아래 귀퉁이에 배압에 대해서 아래와 같이 설명하고 있다.

배압이란 정해진 임계값에 도달하면 이미 버퍼에 있는 요청의 내부 처리가 들어오는 요청을 따라잡을 때까지 버퍼에 넣는 것을 일시적으로 정지하거나 막는 것을 말합니다. 역압이라는 용어로 번역되기도 합니다.

 

 

그럼 첫 번째 인용 문장에서 Observable과 Flowable의 차이는 배압이라고 했었다. 둘 중 하나는 배압이 없는 것이다.

어떤 것에 배압이 없는지는 아래 포스팅을 비롯한 여러 글들을 보고 확인했다.

https://medium.com/@theMikhail/rxjava2-an-early-preview-5b05de46b07

 

RxJava2: An Early Preview

As an avid RxJava user I’ve been following the development of RxJava2 which just hit its first Release Candidate. Here are some of the most…

medium.com

Rxjava2는 배압을 지원하는 Observable인 Flowable이라는 새로운 기본 유형을 도입했다. 배압은 Observable이 Observer가 처리할 수 있는 것보다 더 빠르게 값을 방출하는 경우다. Rxjava2에서 Observable은 역압(=배압)을 지원하지 않는 반면, Flowable은 역압을 지원한다(다른 전략 사용). 

 

Observable은 배압을 지원하지 않지만, Flowable은 배압을 지원한다는 걸 알 수 있다.

그래서 배압을 지원하는 Flowable을 사용하면 10,000개 이상의 많은 데이터들을 수월하게 처리할 수 있어서 DB에서 많은 양의 값을 가져올 때 Flowable을 사용하고, Observable은 그보다 훨씬 적은 1,000개 이하의 데이터나 UI를 변경하는 등 GUI 이벤트에 사용된다.

 

결론)

  • Flowable은 Observable의 일종이지만, 둘의 차이는 배압이 있느냐 없느냐다.
  • Flowable은 서버-클라이언트 통신 시 DB에서 많은 양의 데이터를 가져올 때 사용한다.
  • Observable은 UI 이벤트(UI 변경 등), 적은 양의 데이터를 가져올 때 사용한다.

 

참고한 사이트)

 

아래 깃허브 페이지는 reactive streams에 대해 설명해놓은 페이지다.

https://github.com/reactive-streams/reactive-streams-jvm/blob/master/README.md

 

reactive-streams/reactive-streams-jvm

Reactive Streams Specification for the JVM. Contribute to reactive-streams/reactive-streams-jvm development by creating an account on GitHub.

github.com

 

아래 페이지는 Observable 규약을 정리해서 설명해놓은 페이지다.

https://reactivex.io/documentation/ko/contract.html

 

ReactiveX - The Observable Contract

Observable 계약 소스 문서나 이 사이트에서 제공하는 문서들을 읽다 보면 "Observable 계약"이란 용어가 자주 사용되는 것을 알것이다. Observable 계약이란 Observable을 공식적으로 정의하려는 시도로써,

reactivex.io

 

https://question0.tistory.com/24

 

[RxJava] RxJava 에서 Observable 와 Flowable 선택하여 사용하는 기준

Observable 와 Flowable 선택하여 사용하시는 기준에 대해 개인적으로 이해한 부분을 정리하여 포스팅하도록 하겠습니다. 시스템 환경 운영 체제 : macOS Mojave Java 1.8.0_201 junit 4.12 '배압' 이란? 국어사전

question0.tistory.com

 

https://stackoverflow.com/questions/40947649/what-is-the-difference-between-observable-and-flowable-in-rxjava-2-0

 

What is the difference between Observable and Flowable in RxJava 2.0?

Observable and Flowable interfaces seem to be identical. Why Flowable was introduced in RxJava 2.0? When should I prefer to use Flowable over Observable?

stackoverflow.com

 

반응형
Comments