Skip to content

핫 데이터 소스와 콜드 데이터 소스

Published: at 오후 05:03

Table of contents

Open Table of contents

핫 데이터 소스와 콜드 데이터 소스

채널은 값을 핫 스트림으로 가지지만 콜드 스트림이 필요할 때가 있습니다.

우리가 사용하는 대부분의 데이터 소스는 두 가지 종류로 구분할 수 있습니다.

List, Set과 같은 컬렉션은 핫이며, 자바의 Stream은 콜드입니다.

Channel은 핫이지만 Flow와 RxJava 스트림은 콜드입니다.

핫 vs 콜드

핫 데이터 스트림은 열정적이라 데이터를 소비하는 것과 무관하게 원소를 생성하지만, 콜드 데이터 스트림은 게을러서 요청이 있을 때만 작업을 수행하며 아무것도 저장하지 않습니다.

콜드 데이터 스트림은 다음과 같은 특징이 있습니다.

리스트의 원소는 컬렉션이지만, 시퀀스는 원소를 어떻게 계산할지 정의한 것에 불과합니다.

핫 데이터 스트림은 다음과 같은 특징이 있습니다.

핫 채널, 콜드 플로우

플로우를 생성하는 가장 일반적인 방법은 produce 함수와 비슷한 형태의 빌더를 사용하는 것입니다. 이 빌더가 바로 flow입니다.

val channel = produce {
    repeat(true) {
        val x = computeNextValue()
        send(x)
    }
}

val flow = flow {
    repeat(true) {
        val x = computeNextValue()
        emit(x)
    }
}

두 빌더는 개념적으로는 동일하지만, 채널과 플로우의 방식이 아주 다르기 때문에 두 함수에도 중요한 차이가 있습니다.

채널은 핫이라 값을 곧바로 계산합니다. 별도의 코루틴에서 계산을 수행합니다. 따라서 produceCoroutineScope의 확장 함수로 정의되어 있는 코루틴 빌더가 되어야 합니다.

수신자가 없을 때 데이터 생성이 중단되는 것과 요청할 때 데이터를 생성하는 것의 차이에 대해 알아야 합니다. 채널은 핫 데이터 스트림이기 때문에 소비되는 것과 상관없이 값을 생성한 뒤에 가지게 됩니다.

수신자가 얼마나 많은지에 대해선 신경쓰지 않습니다.

플로우를 사용해 처리하는 방식은 매우 다릅니다. 플로우는 콜드 데이터 소스이기 때문에 값이 필요할 때만 생성합니다.

따라서 flow는 빌더가 아니며 어떤 처리도 하지 않습니다. flow는 단지 최종 연산이 호출될 때 원소가 어떻게 생성되어야 하는지 정의한 것에 불과 합니다.

그래서 flow 빌더는 CoroutineScope가 필요하지 않습니다.

flow 빌더는 빌더를 호출한 최종 연산 스코프에서 실행됩니다(coroutineScope와 다른 코루틴 스코프 함수처럼 중단 함수의 컨티뉴에이션 객체로부터 스코프를 가지고 옵니다.)

플로우의 각 최종 연산은 처음부터 데이터를 처리하기 시작합니다.