-
[RxJava] RxJava (3) - Single 과 MaybeANDROID/RXJAVA 2022. 5. 3. 18:47
[RxJava] RxJava 프로그래밍(1) - 리액티브 프로그래밍
서버 다수와 통신하게 되면 API 호출 각각에 콜백을 추가하게 된다. 콜백이 늘어나면 애플리케이션의 복잡성도 증가(callback hell)하게 된다. RxJava는 자바로 리액티브 프로그래밍을 할 수 있는 라이
12bme.tistory.com
Single 클래스
Single 클래스는 RxJava1부터 존재하는 Observable의 특수한 형태이다. Observable 클래스는 데이터를 문한하게 발생할 수 있지만 Single 클래스는 오직 1개의 데이터만 발행하도록 한다. 보통 결과가 유일한 서버 API를 호출할때 유용하게 사용할 수 있다.

single - Single 클래스의 시간 표시줄은 왼쪽에서 오른쪽으로 흐른다.
- Single 클래스에서 발행한 결과데이터이다.
- Single 클래스는 flip() 함수의 결과값이다.
- 오류가 발생하거나 Single이 빗정상적으로 중단되는 경우는 X로 표시한다.
중요한 것은 데이터 하나가 발행과 동시에 종료 (onSuccess)된다는 점이다. 라이프사이클 관점에서 보면 onNext()와 onComplete() 함수가 onSuccess()로 통합된 것이다. 따라서 Single 클래스의 라이프 사이클 함수는 onSuccess(T value) 함수와 onError() 함수로 구성된다.
1. just() 함수
Single 클래스는 Observable과 거의 같은 방법으로 활용할 수 있따. 다음은 just() 함수를 활용해 Single 객체를 생성한다.
val source: Single<String> = Single.just("hardy") source.subscribe(System.out::println)가장 간단한 방법은 Observable처럼 정적 팩토리 함수 just()를 호출하는 것이다. 그리고 subscribe() 함수를 호출하면 Single 클래스에서 데이터를 발행해 출력한다.
2. Observable에서 Single 클래스 사용
Single은 Observable의 특수한 형태이므로 Observable에서 변환할 수 있따. 다음은 Observable에서 Single 클래스를 만드는 다양한 방법이다.
val source = Observable.just("hardy") Single.fromObservable(source) .subscribe(System.out::println) Observable.just("hardy") .single("default item") .subscribe(System.out::println) val members = arrayOf("hardy", "liam", "moya") Observable.fromArray(*members) .first("default item") .subscribe(System.out::println) Observable.empty<String>() .single("default value") .subscribe(System.out::println) Observable.just("hardy", "moya") .take(1) .single("default item") .subscribe(System.out::println)첫번째는 Single.fromObservable을 이용하는 방법이다. 기존 Observable에서 첫번째 값을 발행하면 onSuccess 이벤트를 호출한 후 종료된다.
두번째는 Observable.just()를 통해서 생성된 Observable에 single() 함수를 호출한다. single() 함수는 default value를 인자로 갖는다. Observable에서 값이 발생되지 않을떄도 인자로 넣은 기본값을 대신 발행한다.
세번째는 여러 개의 데이터를 발행할 수 있는 Observable을 Single 객체로 변환하는 것이다. first() 함수를 호출하면 Observable이 Single 객체로 변환된다. 또한 하나 이상의 데이터를 발행하더라도 첫번째 데이터 발행 후 onSuccess 이벤트가 발생한다.
네번째는 empty() 함수를 통해서 Single 객체를 생성하는 방법이다. 세번째처럼 첫번째 데이터 발행 후 onSuccess 이벤트가 발생한다는 점은 같다. 또한 두번째처럼 Obesrvable에서 값이 발행되지 않을때도 기본값을 갖는 Single 객체로 변환할 수 있다.
마지막은 take() 함수를 통해서 Single 객체를 생성하는 방법이다.
함수인가? 메서드인가?
리액티브 프로그래밍은 함수형 프로그래밍 기법을 활용하므로 용어를 혼용해서 사용할 수 있다. 예를 들어 데이터를 변환하는 map(), filter(), zip() 등의 연산자는 함수라고 부르는 것이 자연스럽다. '함수형 프로그래밍'에 가까운 리액티비 연산자(operator)는 함수라고 표기한다. 일반 자바 언어 기반은 메서드로 표기하기도 한다.
Maybe 클래스
Maybe 클래스는 RxJava2에 처음 도입된 Observable의 또 다른 특수한 형태이다. Maybe라는 뜻 그대로 Single클래스와 마찬가지로 최대 하나의 데이터를 가질수 있지만 데이터 발행 없이 바로 데이터 발생을 완료할 수도 있다. 즉, Maybe 클래스는 Single클래스에 onComplete 이벤트가 추가된 형태이다.

maybe 상단부터 onSuccess 이벤트, onError 이벤트, onCompelete 이벤트이다.
Maybe 객체는 Maybe 클래스를 이용해 생성할 수 있지만 보통 Observable의 특정 연산자를 통해 생성할 때가 많다. 또한 Maybe 객체를 생성할 수 있는 리액티브 연산자에는 elemnetAt(), firstElement(), flatMapMaybe(), lastElement(), reduce(), singleElement() 함수 등이 있다.
'ANDROID > RXJAVA' 카테고리의 다른 글
[RxJava] RxJava에 대한 이해 (0) 2022.12.21 [RxJava] RxJava (2) - Observable (0) 2022.04.01 [RxJava] RxJava (1) - 시작 (0) 2022.03.30