앞선 글에서 RxJava에서는 발행자와 구독자가 존재하며, 발행자는 데이터를 발행하고 구독자는 발행한 데이터를 처리하는 동작을 한다고 하였다.
여기서 발행자는 발행하는 방식에 따라 대분류 두개로 나뉘게 되는데 바로 Cold Observable과 Hot Observable이다. Observable을 직역해보면 "관찰할 수 있는" 이라는 말이 되는데 즉 발행자와 같은 말이다. 그렇다면 Cold Observable과 Hot Observable의 차이는 무엇일까? 아래에서 알아보도록 하자.
예제 링크: https://github.com/seyoungcho2/RxJavaExample
경로 : example/Example2_ColdObservable.kt, example/Example3_HotObservable.kt
Cold Observable
Cold Observable은 구독자(Subscribe)가 구독(subscribe, observe)을 요청하였을 때 아이템을 발행하기 시작하는 발행자이다. Cold Observable은 처음부터 끝까지 발행되는 것이 보장된다. Cold Observable의 대표적인 예는 바로 Observable 클래스이다.
fun main() {
val observable: Observable<Int> = Observable.fromArray(1, 2, 3)
observable.subscribe { it ->
println("first subscriber subscribed : ${it}")
}
observable.subscribe {
println("second subscriber subscribed : ${it}")
}
}
위와 같은 코드를 구독하는 2개의 subscribe을 붙이면 다음과 같은 결과가 나온다.
first subscriber subscribed : 1
first subscriber subscribed : 2
first subscriber subscribed : 3
second subscriber subscribed : 1
second subscriber subscribed : 2
second subscriber subscribed : 3
각각의 subscriber은 발행자로부터 처음부터 끝까지 데이터를 발행 받는다.
Hot Observable
Hot Observable은 구독자가 구독을 요청하였을 때부터 발생한 값들만을 구독자들에게 발행한다. Hot Observable은 구독을 시작한 위치에 따라 몇개의 데이터를 발행 받지 못할 수도 있다. Hot Observable의 대표적인 예시는 PublishSubject이다. Publish Subject는 발행 시점에 구독을 하는 구독자에게만 데이터를 발행한다.
fun main() {
val publisher: PublishSubject<Int> = PublishSubject.create()
publisher.onNext(1)
publisher.subscribe { it ->
println("first subscriber subscribed : ${it}")
}
publisher.onNext(2)
publisher.subscribe { it ->
println("second subscriber subscribed : ${it}")
}
publisher.onNext(3)
}
위와 같이 1번 발행 후 첫 구독자를 붙이면, 첫 구독자는 해당 시점부터 데이터를 구독하므로 1번 데이터는 받지 못한다. 2번 발행 후 둘째 구독자를 붙이면, 둘째 구독자는 해당 시점부터 데이터를 구독하므로 1,2번 데이터는 받지 못한다.
따라서 위 코드의 결과는 다음과 같다.
first subscriber subscribed : 2
first subscriber subscribed : 3
second subscriber subscribed : 3