JEP's Diary

Observable 알고가기 본문

Development/Reactive

Observable 알고가기

지으니88 2018. 7. 25. 21:39

Observable 알고가기


1.Observable이란?

: 데이터 흐름에 맞게 알림을 보내 구독자가 데이터를 처리 할 수 있도록 한다.

: RxJava1.x에서는 Observable과 Single클래스로 구성

: RxJava2.x에서는 Observable, Single, Maybe, Flowable로 클래스를 구분

: Maybe클래스는 reduce()함수나 firstElement()함수와 같이 데이터가 발행 될 수 있거나 혹은 발행되지 않고도 완료되는 경우를 의미

: Flowable클래스는 Observable에서 데이터가 발행되는 속도가 구독자가 처리하는 속도보다 현저하게 빠른 경우 배압이슈에 대응하는 기능을 추가로 제공한다.

- onNext : Observable이 데이터의 발행을 알린다.

- onComplete : 모든 데이터의 발행을 완료함을 알린다. 단 한번만 발생하고, 발생한 후에는 더이상 onNext가 발생하지 않는다.

- onError : 에러가 발생했음을 알린다. 발생한 후에는 onNext, onComplete가 발생하지 않고, Observable의 실행을 종료한다.


2.subscribe()와 Disposable 객체

: Observable의 just() 함수 등 데이터흐름을 정의한 후 subscribe()함수를 호출해야 실제 데이터가 발행된다.

: dispose() 는 Observable에게 더이상 데이터를 발행하지 않도록 구독을 해지하는 함수이다. 보통 onComplete() 알림을 보냈을때 자동으로 dispose()함수가 불린다.

: subscribe() 함수의 여러 원형 모두 Disposable 인터페이스의 객체를 리턴한다.


3.생성함수

: RxJava1.x

- just() : 인자로 넣은 데이터를 차례로 발행하려고 Observable을 생성.1~N(최대10개) 개의 인자로 넣을 수 있고, 타입이 같아야한다. 자동으로 알림 이벤트가 발생한다.

- create() : onNext(), onComplete(), onError() 같은 알림을 개발자가 직접 호출해야 한다. 익숙한 사용자만 활용하도록 권고.

: RxJava2.x (from함수 세분화)

- fromArray() : 배열에 들어 있는 데이터를 처리.

- fromIterable() : 다음에 어떤 데이터가 있는지와 그 값을 얻어오는 것만 관여할 뿐 데이터 타입에 의존하지 않는 장점이 있다. ArrayList, HashSet, LinkedList, Stack, Vector등

- fromCallable() : 동시성 API인 Callable 인터페이스. 기존에 사용하던 callable객체가 있다면 Observable.fromCallable()을 활용해 바로 RxJava와 연동이 가능하다.

- fromFuture() : Future 인터페이스 역시 동시성 API로 비동기 계산의 결과를 구할 때 사용한다. 

- fromPublisher() : Publisher는 자바 9의 표준인 Flow API의 일부이다. Observable.create()와 같이 onNext(), onComplete()을 호출 할 수 있다.


4.Single 클래스

: Observable클래스는 데이터를 무한하게 발행 할 수 있지만, Single 클래스는 오직 1개의 데이터만 발행 하도록 한정한다. 보통 결과가 유일한 서버 API호출할 때 사용한다.

: 데이터가 발행과 동시에 종료된다. 라이크사이클관점으로는 onNext()와 onComplete()함수가 onSuccess()함수로 통합된것.

: 라이브 사이클 함수는 onSuccess(), onError()함수


5.Maybe 클래스

: RxJava2.x에 처음 도입된 Observable의 또 다른 특수형태로 최대 데이터 하나를 가질 수 있지만 데이터 발행 없이 바로 데이터 발생을 완료할 수도 있다.

: 즉 Single클래스에 onComplete() 이벤트가 추가된 형태.

: 라이프 사이클 함수는 onSuccess(), onError(), onComplete()

: Maybe객체를 생성 할 수 있는 연산자는 elementAt(), firstElement(), flatMapMaybe(), lastElement(), reduce(), singleElement()함수 등


6.뜨거운 Observable, 차가운 Observable

: 차가운 Observable은 Observable을 선언하고 just(), fromIterable() 함수를 호출해도 옵저버가 subscribe() 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않는다.

- 예는 웹 요청, 데이터 베이스쿼리, 파일 읽기 등.

: 뜨거운 Observable은 구독자가 존재여부와 관계 없이 데이터를 발행하는 Observable이다. 따라서 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신한다는 보장을 받을 수 없다. 뜨거운 Observable은 구독한 시점부터 Observable에서 발행한 값을 받는다.

- 예는 마우스 이벤트, 시스템 이벤트, 센서 데이터 등

- 배압을 고려해야한다. 배압은 데이터를 발행하는 속도와 구독자가 처리하는 속도의 차이가 클 때 발생한다.

:차가운 Observable을 뜨거운 Observable로 변환하는 방법은 Subject 객체를 만들거나 ConnectableObservable클래스를 활용한다.


7.Subject 클래스

: Observable의 속성과 구독자의 속성이 모두 있다. Observable처럼 데이터를 발행할 수도 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있다.

: AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject등이 있다.


8.ConnectableObservable 클래스

: Observable을 여러 구독자에게 공유할 수 있으므로, 원 데이터 하나를 여러 구독자에게 동시에 전달 할 때 사용한다.

: subscribe() 함수를 호출해도 아무 동작이 일어나지 않고, connect()함수를 호출한 시점부터 subscribe() 함수를 호출한 구독자에게 데이터를 발행한다.



참고 : RxJava프로그래밍 (리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에)

'Development > Reactive' 카테고리의 다른 글

스케줄러  (0) 2018.07.28
리액티브 연산자2  (0) 2018.07.28
리액티브 연산자1  (0) 2018.07.28
리액티브 프로그래밍 개념  (0) 2018.07.24