Kotlin 문법 - Coroutine Flow

느린달팽이·2025년 10월 22일

코틀린 복습

목록 보기
25/25

비동기 데이터를 다루는 가장 코틀린스러운 방법.


1️⃣ Flow란?

Flow비동기적으로 여러 값을 순차적으로 내보내는(emit) 데이터 스트림이에요.

데이터를 한 번에 다 가져오지 않고, 필요할 때마다 값을 흘려보내는 구조라고 보면 됩니다.


2️⃣ Cold Flow vs Hot Flow

구분설명예시
Cold Flowcollect가 호출될 때 비로소 실행됨flow { emit() }, asFlow()
Hot Flow구독 여부와 상관없이 계속 동작StateFlow, SharedFlow

→ 대부분의 경우 Cold Flow로 충분하며,

Hot Flow는 UI 상태 관리(ViewModel)이벤트 전달용으로 사용됩니다.


3️⃣ Flow의 기본 구조 (생산자–중개자–소비자)

Flow는 데이터의 “흐름(stream)”을 구성하는 3단계로 이루어져 있어요.

역할키워드설명
생산자 (Producer)flow { emit(...) }데이터를 생성하고 내보냄
중개자 (Intermediate Operator)map, filter, onEach데이터를 가공하거나 필터링
소비자 (Consumer)collect { ... }최종 데이터를 받아 처리
flow {
    emit(1) // 생산자: 데이터 방출
    emit(2)
    emit(3)
}.filter { it % 2 == 1 } // 중개자: 홀수만 통과
 .map { "값: $it" }     // 중개자: 형식 변경
 .collect { println(it) } // 소비자: 최종 처리

출력:

값: 1
값: 3

4️⃣ emit이란?

emit()은 Flow 내부에서 데이터를 방출(내보내는) 함수예요.

생산자가 emit()으로 값을 보내고, 소비자는 collect()로 받습니다.

val flow = flow {
    emit("첫 번째 데이터")
    emit("두 번째 데이터")
}

즉, emit = 생산자 → 소비자 방향으로 “데이터 신호를 보냄”


5️⃣ Flow와 스레드 (flowOn)

기본적으로 Flow는 collect가 실행되는 코루틴 컨텍스트에서 동작합니다.

데이터 생성은 백그라운드에서, 수집은 UI 스레드에서 하고 싶다면 flowOn()을 사용합니다.

flow {
    emit(loadData()) // I/O
}.flowOn(Dispatchers.IO)
 .collect { updateUI(it) } // Main

6️⃣ Hot Flow (상태 관리용 Flow)

🟢 StateFlow

  • 항상 하나의 최신 상태를 유지
  • 새로운 구독자도 즉시 현재 값 수신
  • LiveData 대체로 UI 상태 관리에 자주 사용
private val _uiState = MutableStateFlow("Loading")
val uiState: StateFlow<String> = _uiState

_uiState.value = "Success"

🟣 SharedFlow

  • 여러 구독자가 같은 이벤트를 공유
  • Snackbar, Toast, Navigation 이벤트 등 단발성 알림에 적합
private val _event = MutableSharedFlow<String>()
val event = _event.asSharedFlow()

viewModelScope.launch {
    _event.emit("데이터 저장 완료!")
}

7️⃣ MutableListFlow 패턴 (리스트 상태 관리)

MutableListFlow는 관용적으로 부르는 이름으로,

정식 타입은 MutableStateFlow<List<T>>입니다.

리스트를 상태로 관리할 때 자주 쓰입니다.

private val _items = MutableStateFlow<List<String>>(emptyList())
val items: StateFlow<List<String>> = _items

fun addItem(newItem: String) {
    _items.value = _items.value + newItem
}

기존 리스트를 수정하는 대신 새 리스트로 교체해야 UI가 갱신됩니다.


✨ 요약

개념역할
Flow비동기 데이터 스트림
emit()Flow 내부에서 데이터 방출
collect()Flow의 데이터를 수집
flowOn()생산자 스레드 변경
StateFlowUI 상태 관리용 Hot Flow
SharedFlow이벤트 전달용 Hot Flow
MutableListFlow리스트 형태의 상태 관리 패턴

안드로이드 개발에서 Flow를 쓰는 이유

상황권장 Flow 타입
네트워크/DB 데이터 스트림flow {} / asFlow()
UI 상태(State 관리)StateFlow
이벤트(단발성 알림, SnackBar 등)SharedFlow
Room 데이터베이스Flow<List<T>> (자동 업데이트)

핫 플로우를 꼭 알아야 하는 이유

  • 안드로이드 ViewModel에서 UI 상태를 노출할 때 거의 표준처럼 사용됨 (LiveData보다 더 강력하고 코루틴 친화적)
  • Jetpack Compose의 collectAsState() 와 완벽하게 호환됨 → Compose 전환 시 필수 개념
  • 이벤트 처리(SharedFlow)는 UI 피드백 구현 시 자주 등장
profile
한걸음이라도 제대로... 쓰임있는 앱을 만들자

0개의 댓글