레이니스트에서는 뱅크샐러드 안드로이드 앱의 경우에는 RxJava와 RxAndroid, iOS의 경우 RxSwift, 공식 웹사이트에서는 RxJS를 사용하는 등 플랫폼을 가리지 않고 ReactiveX를 적극적으로 사용하고 있습니다.
RxJava1을 (나름대로) 잘 사용하고 있었지만, RxJava2 문서를 살펴본 결과 기존 안드로이드 코드 베이스에서 발생하던 문제를 해결할 수 있을 것 같다는 생각에 도입하기로 했습니다. 이 글을 통해 저희가 RxJava2를 도입하면서 겪은 바에 대해 공유하고자 합니다.
이제 Observable
에서 null
을 보내게 되면 바로 NullPointerException 이 발생합니다. Completable, 또는 새로 추가된 Maybe를 활용하거나 enum
을 선언해서 null
대신 enum
을 emit 하는 방법으로 대체할 수 있습니다.
Flowable
은 Backpressure를 지원하는 Observable
입니다. RxJava2부터는 Observable
에 Backpressure handling을 추가할 수 없으므로, Backpressure 지원을 위해서는 Flowable을 무조건 사용해야 합니다.
하지만 Flowable
을 사용한다 해서 MissingBackpressureException
이 사라진 건 아닙니다. Operator가 onNext
를 더는 호출하지 못하는 경우, MissingBackpressureException
이 발생합니다.
Reactive Streams 명세에서 Source와 Consumer의 상호작용을 나타내는데 Subscription
이라는 이름을 사용했기 때문에, 이름 충돌을 막기 위해 Disposable로 변경되었습니다.
값이 있는 경우엔 onSuccess
, 값이 없는 경우엔 onComplete
이 호출됩니다. 저도 처음에 보고 잘 이해가 되지 않아 예제 코드를 통해 간단하게 Maybe를 소개해드리고자 합니다.
먼저 1번 예제와 2번 예제를 보면, 1번 예제의 경우 값이 있으므로 Single처럼 onSuccess
가 호출됩니다. 따라서 Maybe
가 콘솔에 찍히게 됩니다. 반면에 2번 예제의 경우 값이 없기 때문에 onComplete
이 호출되게 됩니다.
Maybe
를 사용하다 보면, flatMap을 활용해서 다른 Observable type으로 변경하고 싶을 때가 있습니다. 위 예제는 Maybe
를 Single
로 바꾸는 예제인데요, 3번 예제를 실행시키면 어떻게 될까요? 바로 NoSuchElementException
이 발생합니다. MaybeFlatMapSingle을 살펴보면, Maybe(Source)
에서 onComplete이 호출되는 경우 Source Observer
(flatMap에서 Maybe
를 observe하는 부분)의 onError
를 호출하는 것을 확인할 수 있습니다.
우리 팀과 함께 한 세 번의 생일 (0) | 2020.02.03 |
---|---|
RxJava로 뒤로가기 버튼 확인 기능 구현하기 (0) | 2020.02.02 |
사운들리 방송 송출테스트 이야기 (0) | 2020.02.02 |
스타트업! 해답은 속도일까? (0) | 2020.02.01 |
문득 찾아온 첫사랑 (첫 투자사 본엔젤스) (0) | 2020.02.01 |