Hot Observable과 Cold Observable의 차이

Reactive Programming을 배우면서 가장 많이 접한 개념이 Flow가 어떻게 흘러가는지이다. Observable은 우리에게 데이터를 배출 시키는 존재이고, 우리는 이를 subscribe 함으로써 배출되는 데이터를 얻을 수 있다.

Cold Observable

먼저 cold observable부터 설명하자면, 앞서 다뤘던 기본적인 예제들처럼 동일한 옵저버블을 여러번 구독해도 그 시점에 항상 새로운 데이터 flow를 얻을 수 있었다.

fun main(args : Array<String>){
    val observable : Observable<String> = listOf("String 1", "String 2", "String 3")
    .toObservable()

    observable.subscribe({
        println("Recieved $it")
    }, {
        println("Error ${it.message}")
    }, {
        println("Done")
    })
    
        observable.subscribe({
        println("Recieved $it")
    }, {
        println("Error ${it.message}")
    }, {
        println("Done")
    })
}

출력결과

Recieved String 1
Recieved String 2
Recieved String 3
Done
Recieved String 1
Recieved String 2
Recieved String 3
Done


위의 예제처럼 여러번 구독을 하더라도 구독을 한 시점부터는 list의 요소인 "String 1", "String 2", "String 3" 값을 얻을 수 있었다. 이러한 특징을 가지고 있는 Observable을 Cold Observable이라고 한다.

Hot Observable

Hot Observalbe은 old와 반대로 구독을 하기 전 부터 데이터를 내보내기 시작한다. Cold Observable을 CD나 레코드로 본다면 Hot Observable은 TV 채녈의 특징과 비슷하다. 이는 결국 구독을 하지 않아고 데이터를 배출 시키기 때문에 구독을 할 필요가 없다. 여기서 중요한 Observable의 개념이 바로 ConnectableObservable이다. 이 Observablecoldhot으로 바꿀 수 있기도 하다.

fun main(args: Array<String>) {
    val connectableObservable = Observable.interval(100, TimeUnit.MILLISECONDS)
        .publish()

    connectableObservable.subscribe({ println("subscription 1: $it") })
    connectableObservable.subscribe({ println("subscription 2: $it") })
    connectableObservable.connect()
    runBlocking{ delay(500) }

    connectableObservable.subscribe({ println("subscription 3: $it") })
    runBlocking{ delay(500) }
}

출력결과

subscription 1: 0
subscription 2: 0
subscription 1: 1
subscription 2: 1
subscription 1: 2
subscription 2: 2
subscription 1: 3
subscription 2: 3
subscription 3: 3
subscription 1: 4
subscription 2: 4
subscription 3: 4
subscription 1: 5
subscription 2: 5
subscription 3: 5

위의 출력 결과를 보면 1, 2 구독자가 구독을 한 후 connect 한 시점 즉, 데이터가 배출되기 시작한 시점부터 500ms를 대기 하면서 총 5개의 데이터를 받게 된다. 그 5초가 지났을 때 부터 또 다른 3 구독자가 구독하기 시작하면서 다시 500msdelay를 주게 된다. 이렇게 총 10개의 데이터를 시간 순서에 따라 받아 올 것이고, 출력 결과과 같이 3번 구독자는 이 전에 1, 2 구독자가 받았던 데이터는 받지 못 한 것을 알 수 있다. 이것이 바로 Hot Observable의 개념이다.

결국 hot observablecold observable의 차이는 구독 한 시점에 다시 새로운 데이터를 받아오느냐, 이미 지나간 데이터는 받아오지 못하고 중간에 흐름에 껴서 받아오느냐의 차이이다.