상세 컨텐츠

본문 제목

RxJava2를 도입하며

커리어피드 정보

by 더팀스 2020. 2. 2. 12:01

본문

레이니스트(뱅크샐러드)에서 발행한 RxJava2를 도입하며


레이니스트에서는 뱅크샐러드 안드로이드 앱의 경우에는 RxJavaRxAndroid, iOS의 경우 RxSwift, 공식 웹사이트에서는 RxJS를 사용하는 등 플랫폼을 가리지 않고 ReactiveX를 적극적으로 사용하고 있습니다.

RxJava1을 (나름대로) 잘 사용하고 있었지만, RxJava2 문서를 살펴본 결과 기존 안드로이드 코드 베이스에서 발생하던 문제를 해결할 수 있을 것 같다는 생각에 도입하기로 했습니다. 이 글을 통해 저희가 RxJava2를 도입하면서 겪은 바에 대해 공유하고자 합니다.

이제 Observable에서 null을 보내게 되면 바로 NullPointerException 이 발생합니다. Completable, 또는 새로 추가된 Maybe를 활용하거나 enum을 선언해서 null 대신 enum을 emit 하는 방법으로 대체할 수 있습니다.

FlowableBackpressure를 지원하는 Observable입니다. RxJava2부터는 ObservableBackpressure handling을 추가할 수 없으므로, Backpressure 지원을 위해서는 Flowable을 무조건 사용해야 합니다.

하지만 Flowable을 사용한다 해서 MissingBackpressureException이 사라진 건 아닙니다. OperatoronNext를 더는 호출하지 못하는 경우, MissingBackpressureException이 발생합니다.

Reactive Streams 명세에서 SourceConsumer의 상호작용을 나타내는데 Subscription이라는 이름을 사용했기 때문에, 이름 충돌을 막기 위해 Disposable로 변경되었습니다.

값이 있는 경우엔 onSuccess, 값이 없는 경우엔 onComplete이 호출됩니다. 저도 처음에 보고 잘 이해가 되지 않아 예제 코드를 통해 간단하게 Maybe를 소개해드리고자 합니다.

먼저 1번 예제와 2번 예제를 보면, 1번 예제의 경우 값이 있으므로 Single처럼 onSuccess 가 호출됩니다. 따라서 Maybe가 콘솔에 찍히게 됩니다. 반면에 2번 예제의 경우 값이 없기 때문에 onComplete이 호출되게 됩니다.

Maybe를 사용하다 보면, flatMap을 활용해서 다른 Observable type으로 변경하고 싶을 때가 있습니다. 위 예제는 MaybeSingle로 바꾸는 예제인데요, 3번 예제를 실행시키면 어떻게 될까요? 바로 NoSuchElementException이 발생합니다. MaybeFlatMapSingle을 살펴보면, Maybe(Source)에서 onComplete이 호출되는 경우 Source Observer(flatMap에서 Maybeobserve하는 부분)의 onError를 호출하는 것을 확인할 수 있습니다.

...

더 읽어보러 가기

직군 정보
iOS 안드로이드

기업 문화 정보


기술 스택 정보
RxJS

더 많은 내용은 더팀스에서 확인하세요!

관련글 더보기