일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 라이선스 종류
- android ar 개발
- 스택 큐 차이
- 안드로이드 유닛 테스트 예시
- rxjava hot observable
- 멤버변수
- 안드로이드 라이선스
- 2022 플러터 안드로이드 스튜디오
- jvm 작동 원리
- 객체
- 플러터 설치 2022
- android retrofit login
- 안드로이드 레트로핏 사용법
- 안드로이드 레트로핏 crud
- 큐 자바 코드
- 2022 플러터 설치
- 안드로이드 유닛테스트란
- 안드로이드 os 구조
- jvm이란
- 클래스
- 서비스 vs 쓰레드
- rxjava cold observable
- 자바 다형성
- rxjava disposable
- 안드로이드 유닛 테스트
- Rxjava Observable
- ar vr 차이
- 서비스 쓰레드 차이
- ANR이란
- 스택 자바 코드
- Today
- Total
나만을 위한 블로그
[Rxjava] Observable vs Flowable 본문
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
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는 배압을 지원하는 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
아래 페이지는 Observable 규약을 정리해서 설명해놓은 페이지다.
https://reactivex.io/documentation/ko/contract.html
https://question0.tistory.com/24
'개인 공부 > Rxjava' 카테고리의 다른 글
[Rxjava] Disposable이란? CompositeDisposable이란? (0) | 2021.11.21 |
---|---|
[Rxjava] Single, Maybe, Completable이란? (0) | 2021.11.17 |
[Rxjava] 연산자의 종류와 생성 연산자(create, interval, just) (0) | 2021.05.26 |
[Rxjava] Observable이란? - 2 - (0) | 2021.05.26 |
[Rxjava] Observable이란? - 1 - (0) | 2021.05.26 |