[kotlin] 코틀린의 hot 스트림과 cold 스트림

코틀린에서는 오직 RxJava가 아닌 다른 방법으로도 reactive 프로그래밍을 할 수 있습니다. 이러한 방식 중 두 가지가 있는데, 바로 hot 스트림cold 스트림입니다. 이 두 가지 스트림은 서로 다른 동작 방식을 가지고 있으며, 각각의 장단점이 있습니다.

Cold 스트림

Cold 스트림은 옵저버블이나 퍼블리셔가 구독되기 전까지는 데이터를 생성하지 않는 스트림입니다. 이는 구독이 일어나야 데이터를 발행하기 시작합니다. 따라서 여러 번 구독이 가능하며, 각 구독은 독립적으로 데이터를 받을 수 있습니다.

코틀린에서는 Cold 스트림을 사용하기 위해 Flow를 사용할 수 있습니다. 예를 들어, 다음과 같이 Flow를 생성하고 사용할 수 있습니다.

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow

fun getNumbers(): Flow<Int> = flow {
    for (i in 1..10) {
        delay(1000)
        emit(i)
    }
}

fun main() = runBlocking {
    val numbers = getNumbers()
    numbers.collect { value -> println(value) }
}

Hot 스트림

반면에 hot 스트림은 옵저버블이나 퍼블리셔가 데이터를 생성하고 옵저버블이 구독되었는지에 관계없이 데이터를 생성하는 스트림입니다. 이는 구독 여부와 관계 없이 데이터를 발행하며, 구독 이후에 생성된 데이터에 한해 이를 구독자에게 전달합니다.

코틀린에서 hot 스트림을 생성하고 사용하기 위해 SharedFlowStateFlow를 사용할 수 있습니다. 예를 들어, 다음과 같이 SharedFlow를 생성하고 사용할 수 있습니다.

import kotlinx.coroutines.flow.MutableSharedFlow

val sharedFlow = MutableSharedFlow<Int>()

fun main() {
    runBlocking {
        launch {
            sharedFlow.collect { value -> println("First: $value") }
        }
        delay(1000)
        sharedFlow.emit(1)
    }
}

결론

두 가지 스트림은 다른 시나리오에 적합하며, 적재적소에 따라 적절히 사용하여 reactive 프로그래밍을 할 수 있습니다. Cold 스트림은 데이터 흐름을 구독 시점에 제어할 수 있지만, hot 스트림은 구독 이전의 데이터도 포함되어 최신 데이터에만 관심이 있는 경우에 유용합니다.

자바의 옵저버블과 비슷한 개념을 가진 스트림을 통해 코틀린에서도 reactive 프로그래밍을 할 수 있으며, 각각의 특징에 따라 적절히 활용할 수 있습니다.

참고자료: