Observable에는 [뜨거운 Observable(Hot Observable)]과 [차가운 Observable(Cold Observable)]이 있습니다.
1. Cold Observable
[차가운 Observable]인 Observable은 Observabled.just() Observable.fromIterable() 함수를 호출해도 옵저버가 subscribe() 함수를 호출하여 구독하지 않으면 데이터를 발행하지 않습니다.
[차가운 Observable]은 다음과 같습니다.
- Observable
- Single
- Maybe
[차가운 Observable]의 예는 웹 요청, 데이터베이스 쿼리와 파일 읽기 등 입니다. 보통 내가 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스 서버에 요청을 보내고 결과를 받아옵니다.
[차가운 Observable]은 구독자가 구독하면 준비된 데이터를 처음부터 발행 합니다. 하지만, [뜨거운 Observable]은 구독한 시점부터 Observable에서 발행한 값을 받습니다.
2. Hot Observable
[뜨거운 Observable]은 구독자가 존재 여부와 관계없이 데이터를 발행하는 Observable 입니다. 따라서 여러 구독자를 고려할 수 있습니다. 단, 구독자로서는 Observable에서 발행하는 데이터를 처음부터 모두 수신할 것을 보장할 수 없습니다.
[뜨거운 Observable]의 예는 마우스 이벤트, 키보드 이벤트, 시스템 이벤트, 센서 데이터와 주식 가격 등이 있습니다. 온도, 습도 센서의 데이터를 처리하는 앱이라면 최근의 온도, 습도 정보만 사용자에게 표시하면 됩니다.
[뜨거운 Observable]의 예로는 아래와 같습니다.
- AsyncSubject
- BehaviorSubject
- PublishSubject
- ReplaySubject
[뜨거운 Observable]에는 주의할 점이 있습니다. 배압(BackPressure)을 고려해야 합니다. 배압은 Observable에서 데이터를 발행하는 속도와 구독자가 처리하는 속도의 차이가 클 때 발생합니다.
3. Subject 클래스
Subject 클래스는 차가운 Observable을 뜨거운 Observable로 바꿔줍니다. Subject 클래스의 특성은 Observable의 속성과 구독자의 속성이 모두 있습니다. Observable 처럼 데이터를 발행할 수도 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있습니다.
4. PublishSubject 클래스
가장 일반적인 Subject 클래스 입니다. 구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작합니다. 오직 해당 시간에 발생한 데이터를 그대로 구독자에게 전달 받습니다.
5. PublishSubject kotlin 소스
fun publishSubjectTest() {
val subject = PublishSubject.create<String>()
subject.subscribe{data -> println("subscribe 1 : ${data}")}
subject.onNext("1")
subject.onNext("3")
subject.subscribe{data -> println("subscribe 2 : ${data}")}
subject.onNext("5")
subject.onCompleted()
}
출력 결과
첫번째 구독자가 subscribe() 함수를 호출하면서 구독을 합니다. 이후의 데이터 '1', '3' 이 발행 됩니다. 첫번째 구독자(subscribe 1)은 '1', '3' 을 배출 합니다. 그리고, 두번째 구독자(subscribe 2)가 구독 합니다. 그리고, 데이터 '5'가 입력 됩니다. (subscribe 1)과 (subscribe 2)는 데이터 '5' 를 발행 합니다.
'Reactive Programing' 카테고리의 다른 글
flatMap vs concatMap vs switchMap (2) | 2021.02.03 |
---|---|
FlatMap 파헤치기 (0) | 2021.02.02 |
리액티브 프로그래밍 (Reactive Programming) RxJava (0) | 2020.11.01 |
Java API를 RxJava와 통합 하는 방법 (0) | 2020.10.31 |
Flowable 배압(BackPressure) 대응 (0) | 2020.10.30 |