Cold Flow vs Hot Flow
Cold Flow vs Hot Flow
코틀린의 Flow API는 두 가지 근본적으로 다른 방출(emission) 모델을 제공합니다. Cold Flow는 수집자(collector)가 존재할 때만 값을 생성하며, 새로운 수집자마다 처음부터 독립적으로 실행됩니다. 반면 Hot Flow는 수집자의 존재 여부와 관계없이 값을 방출하며, 구독자는 수집을 시작한 시점 이후에 방출된 값만 관찰할 수 있습니다. 이 두 가지 모델의 차이를 정확히 이해하는 것은 네트워크 요청, 데이터베이스 쿼리, UI 상태 관리, 이벤트 브로드캐스팅 등 다양한 상황에서 올바른 Flow 타입을 선택하는 데 필수적입니다. 면접에서도 이 개념에 대한 질문이 자주 등장하므로, 단순히 차이점만 암기하기보다는 각 모델이 왜 필요한지 근본적인 이유까지 이해하시는 것이 중요합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- Cold Flow가 수집(collection) 시점까지 실행을 지연하는 원리
- Hot Flow가 여러 수집자 간에 공유되는 활성 방출 소스를 유지하는 방식
- 안드로이드 애플리케이션에서 각 모델을 언제 사용해야 하는지에 대한 판단 기준
- Cold Flow와 Hot Flow가 생명주기에 미치는 영향과 고려 사항
Cold Flow
Cold Flow는 flow { } 빌더를 사용하여 생성합니다. 빌더 내부의 코드는 collect와 같은 종단 연산자(terminal operator)가 호출되기 전까지 실행되지 않습니다. 각 수집자는 빌더 블록의 독립적인 실행을 트리거합니다.
val coldFlow = flow {
println("Flow started")
emit(1)
emit(2)
emit(3)
}
coldFlow.collect { println("Collector A: $it") }
coldFlow.collect { println("Collector B: $it") }
위 코드의 출력 결과를 살펴보면 "Flow started"가 두 번 출력됩니다. 각 collect 호출이 별도의 실행을 트리거하기 때문입니다. Collector A와 Collector B는 각각 독립적으로 세 개의 값을 모두 수신하며, 두 수집자 간에 공유되는 상태는 없습니다.
이러한 동작 특성 덕분에 Cold Flow는 각 소비자(consumer)마다 새롭게 실행해야 하는 작업에 적합합니다. 네트워크 요청, 데이터베이스 쿼리, 파일 읽기 등이 대표적인 사용 사례인데, 각 소비자가 자신만의 독립적인 결과를 기대하기 때문입니다. 가령, UI의 두 군데에서 동일한 Cold Flow를 수집하면 네트워크 요청이 두 번 별도로 실행됩니다. 면접에서 이 점을 설명하실 때, 단순히 "독립 실행"이라고만 답변하기보다는 구체적인 시나리오와 함께 설명하시면 좋은 인상을 줄 수 있습니다.
Cold Flow는 지연(lazy) 실행 방식을 따릅니다. 아무도 수집하지 않으면 어떠한 작업도 수행되지 않습니다. 이 특성은 안드로이드에서 생명주기 인식 수집(lifecycle-aware collection)과 자연스럽게 맞물리는데, UI가 화면에 표시되는 동안에만 Flow를 수집하는 패턴과 잘 어울립니다.
map, filter, flatMapConcat, catch 같은 표준 Flow 연산자는 Cold Flow의 의미(semantics)를 그대로 유지합니다. 각 연산자는 변환 계층을 추가하지만, 전체 체인은 여전히 지연 방식으로 동작하며 각 수집자에 대해 독립적으로 실행됩니다. 이러한 조합 가능성(composability)은 Cold Flow의 핵심 강점 중 하나입니다.
val users: Flow<List<User>> = flow {
emit(api.fetchUsers())
}.map { response ->
response.filter { it.isActive }
}.catch { e ->
emit(emptyList())
}
각 수집자는 API 호출부터 필터링, 에러 처리에 이르기까지 전체 체인을 트리거합니다. 이러한 독립성 덕분에, 한 수집자의 체인에서 발생한 에러가 다른 수집자에게 영향을 미치지 않으며, 하나의 수집을 취소해도 다른 수집이 취소되지 않습니다.
Hot Flow
Hot Flow는 수집자의 활성 여부와 관계없이 값을 방출합니다. 코틀린은 두 가지 내장 Hot Flow 타입을 제공합니다. 바로 SharedFlow와 StateFlow입니다.
SharedFlow는 모든 활성 수집자에게 동시에 값을 브로드캐스트합니다. 방출 이후에 구독한 수집자는 replay 매개변수가 설정되지 않은 경우 해당 값을 수신할 수 없습니다.