
state 는 UI 와 관련된 데이터를 저장하고 관리하는데 사용되는 상태홀더 ViewModel 을 통해 관리되다. 이러한 state 데이터를 다루기 위해 LiveData 를 사용한다. LiveData 는 Activity LifeCycle 에 반응하여 데이터 변경 사항을 observing 한다.
Activity 가 있는 UI 레이어가 아닌, Domain 레이어와 상호작용해야한다면..
Flow 를 사용해야한다.
cold stream?
flow 를 수집하는 각각의 collector 들이 데이터를 수집할 때 마다 새로운 데이터 스트림 생성한다. collector 들은 각각의 개별 데이터 스트림에서 데이터 수집. 스트림 행성 후 이를 소비하지 않으면, 아무것도 수행하지 않는다. ex)Flow
hot stream?
flow 를 수집하는 각각의 collector 들이 데이터 스트림을 공유하여 동일한 데이터를 수집. 구현에 따라 collector 유/무에 따라 시작되기도 하지만, 기본적으로 collector 가 없어도 Provider 는 데이터 스트림을 제공. ex)StateFlow, SharedFlow
[!TIP]
일반적인 Flow 는 상태를 가질 수 없다. 고로, 데이터 홀더의 역할 수행 x
private val _artistProfileUiState = MutableStateFlow(ArtistProfile())
val artistProfileUiState: StateFlow<ArtistProfile> = _artistProfileUiState.asStateFlow()
| 항목 | StateFlow | MutableStateFlow |
|---|---|---|
| 역할 | 읽기 전용 상태 흐름 | 읽고 + 값 변경 가능 |
| 사용 위치 | UI (Activity, Fragment 등) | ViewModel 내부 |
| 값 변경 | ❌ 안 됨 (val only) | ✅ 가능 (value =, .update {} 등) |
| 생성 방법 | .asStateFlow()로 생성 | MutableStateFlow(초기값) 생성 |
| 외부 노출 | 보통 StateFlow로 외부에 노출 | 내부에서만 사용 |
MutableStateFlow: ViewModel 내부에서 상태를 변경할 때
StateFlow: UI에서는 값만 관찰하면 될 때 (ViewModel 외부 노출)