구독시점과 발행시점에 주의해서 Hot & Cold Observable에 대해 살펴보자.
1. Cold Observable
Cold Observable은 구독시에 데이터 발행을 시작한다.
옵저버가 구독할 때마다 새로운 데이터 스트림을 시작하고 처음부터 데이터를 방출한다.
이것은 옵저버가 Cold Observable을 구독할 때마다 독립적인 데이터 스트림을 생성하고 발행하는 것을 의미한다.
아래의 예시는 interval 연산자를 이용하여 1초마다 아이템을 발행하는 Cold Observable 이다.
아래는 두 개의 구독자가 있다. 첫 번째 구독자가 구독을 시작하고 3초후 두 번째 구독자가 구독을 시작한다.
val ob = Observable.interval(1, TimeUnit.SECONDS)
ob.subscribe {
println("first subscriber : $it")
}
Thread.sleep(3000)
ob.subscribe {
println("second subscriber : $it")
}
Thread.sleep(3000)
first subscriber : 0
first subscriber : 1
first subscriber : 2
first subscriber : 3
second subscriber : 0
first subscriber : 4
second subscriber : 1
first subscriber : 5
second subscriber : 2
first subscriber : 6
second subscriber : 3
Observable을 첫 번째 구독자가 구독하고 3초 뒤에 새로운 구독자가 다시 구독해도 Observable은 처음부터 데이터를 발행하고 있다. 같은 Observable 인스턴스에 구독하여도, 각 옵저버는 자신만의 데이터 스트림을 가지게 된다.
이처럼 Cold Observable은 데이터의 재사용과 재생성이 가능하며, 각각의 데이터 스트림을 가지기 때문에 여러 옵저버 간에 데이터가 공유되지 않는다.
2. Hot Observable
Hot Observable은 구독자의 존재 여부와 상관없이 데이터를 발행한다.
데이터가 발행된 시점 이후에는 모든 구독자에게 동시에 같은 아이템을 발행한다.
구독시점에 데이터가 발행되는 Cold Observable과 달리 구독 메소드(subscribe)이 아닌 특정 트리거를 통해 데이터를 발행시킨다. 그리고 데이터가 발행된 이후 여러 구독자가 구독할 시에 현재 위치에서 방출하고 있는 데이터를 수신하게 된다.
Cold Observable과 Hot Observable의 예시를 들자면, Cold Observable은 CD/DVD 레코딩으로 본다면 Hot Observable은 TV 채널과 같이 해당 채널에 전환하는 시점과 별개로 콘텐츠를 Broadcasting 송출하고 있다.
아래 예시는 Hot Observable인 ConnectableObservable이라는 특수한 Observable이다. 해당 옵저버블은 Cold Observable을 Hot Observable로 변환이 가능하다. publish() 함수는 Observable을 ConnectableObservable로 변환하고 구독 메소드인 subscribe() 메소드를 사용하기에 앞서 connect() 라는 메서드를 호출하여 곧바로 데이터 발행을 시작한다.
val ob: ConnectableObservable<Long> = Observable.interval(1, TimeUnit.SECONDS).publish()
ob.connect()
ob.subscribe {
println("first subscriber : $it")
}
Thread.sleep(3000)
ob.subscribe {
println("second subscriber : $it")
}
Thread.sleep(3000)
first subscriber : 0
first subscriber : 1
first subscriber : 2
first subscriber : 3
second subscriber : 3
first subscriber : 4
second subscriber : 4
first subscriber : 5
second subscriber : 5
Cold Observable처럼 두 번째 구독자가 첫 번째 구독자보다 3초 뒤에 구독을 늦게 시작했다. 하지만 두 번째 구독자는 처음 3초동안 발행된 데이터를 놓치고, 구독 시점부터 현재 옵저버블이 발행하고 있는 데이터부터 수신하고 있다.
Hot Observable은 데이터의 흐름을 제어할 수 있어서 여러 옵저버 간에 데이터를 공유하거나 브로드캐스팅할 때 유용하다.
필자는 PublishSubject라는 Hot Observable 사용을 많이 하는데 다음편은 이와 관련한 포스팅을 하겠다.
참고자료
'💤 RxJava' 카테고리의 다른 글
[RxJava] Single, Maybe and Completable (0) | 2023.09.12 |
---|---|
[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 |