RxJava2부터는 다양한 타입의 Observable을 사용할 수 있다. Observable과 Single은 RxJava 1버전부터 존재했고 Maybe와 Completable은 그 이후에 등장했다. 때문에 현재 Rx 공식문서에도 Observable과 Single 타입만 설명이 있다. 필자도 사실상 Observable 원형 그대로 먼저 실무에서 사용한 것이 아니라 이렇게 변형된 타입들부터 익힌 경우이다. Single, Maybe Completable 세 가지에 대해 다뤄보고자 한다.
Observable can emit multiple items
Single, Maybe and Completable are one or no emission of items.
Single
it always either emits one value or an error notification.
- onSuccess()
a Single passes this method the sole item that the Single emits - onError()
a Single passes this method the Throwable that caused the Single to be unable to emit an item
Single은 오직 하나의 아이템 또는 에러를 방출하는 Observable이다. 따라서 onNext()와 onComplete()는 onSuccess()로 합쳐지며 오직 하나의 데이터만 발행이 완료됨을 알린다.
보통 API 호출에 있어, 응답은 단 하나만 오므로 HTTP 통신시 이 Single Observable을 자주 사용한다.
HTTP 통신을 위한 Retrofit2 빌더에 RxJava CallAdapter를 추가하는 것을 지원하기 떄문에 응답받을 객체를 Observable하게 지정하거나 HTTP 요청을 Single 스트림으로 만들어 사용할 수 있다.
Maybe
it is similar to Single only difference being that is allows for no emissions as well
Single 과 비슷하지만, 이름과 같이 데이터를 발행할 수도 있고 안 할수도 있는 stream이다. 따라서 데이터를 발행할 때는 onSuccess(), 그렇지 않을 때는 onComplete()만 호출하며 에러 발생시 onError()를 호출한다.
- onSuccess()
- onComplete()
- onError()
Completable
it can only emit either a completion or error signal
- onComplete()
- onError()
Completable은 오직 작업이 정상적으로 실행되었는지 또는 에외가 발생했는지에만 관심을 가진다. 데이터를 발행하지 않기 때문에 onComplete(), onError()만 사용하게 된다.
Cmpletable는 값을 반환하지 않기 때문에 결과 데이터가 없고 작업의 성공 또는 실패 여부만 중요한 경우에 사용된다. 예를 들어, Single과 함께 HTTP 통신에 자주 쓰는데 Single의 경우 받은 데이터가 있을 경우에 사용하고 Completable 경우 응답을 받을 것이 없을 경우, 주로 POST, PUT 메소드와 쓸 때 사용한다.
예시로 파일을 비동기적으로 다운로드하는 작업을 수행할 때 Completable를 사용할 수 있다. 이 작업이 성공적으로 완료되면 onComplete()를 호출하고, 작업 중에 예외가 발생하면 onError()를 호출한다. 이처럼 결과 데이터가 필요하지 않을 때 유용하게 사용되며 emitter의 알림을 받고 그 후에 앱 단에서 처리하면 된다.
참고자료
'💤 RxJava' 카테고리의 다른 글
[RxJava] Hot & Cold Observable (0) | 2023.09.22 |
---|---|
[RxJava] Observable 생성하기 (0) | 2023.09.12 |
[RxJava] Observable (0) | 2023.09.12 |
[RxJava] subscribe inside subscribe (0) | 2023.09.06 |
[RxJava] Scheduler로 Multi Thread 관리하기 (0) | 2023.07.04 |