Kotlin Coroutines의 StateFlow와 Channel 비교

비동기 데이터 스트림을 처리하는 Kotlin Coroutines 환경에서 StateFlow와 Channel은 안드로이드 상태 관리에서 가장 핵심적인 도구이다. 두 요소 모두 데이터를 전달하는 Hot Stream의 성격을 가지지만, 설계 목적과 동작 방식에는 분명한 차이가 존재한다. 이 글에서는 Kotlin Coroutines의 StateFlow와 Channel의 차이점을 중심으로 언제 어떤 도구를 선택해야 하는지를 예제와 다이어그램을 통해 정리한다.
StateFlow란 무엇인가: 상태(State)를 위한 데이터 스트림
StateFlow는 이름 그대로 상태(State)를 표현하고 유지하기 위해 설계된 데이터 스트림이다.
항상 하나의 최신 값을 보유하며, 새로운 구독자가 시작되면 즉시 현재 상태를 전달한다.
StateFlow의 핵심 특징
- 상태 보존
- 항상 최신 값을 내부에 유지한다.
value프로퍼티를 통해 현재 상태에 즉시 접근 가능하다.
- 초기값 필수
- 생성 시 반드시 초기 상태가 필요하다.
- UI는 항상 유효한 상태에서 시작된다.
- Conflation(값 합치)
- 짧은 시간에 여러 값이 방출되더라도 구독자는 최종 값만 수신한다.
- 중간 상태가 중요하지 않은 UI 상태 관리에 적합하다.
- 다중 구독자 지원
- 여러 Collector가 동일한 상태를 동시에 관찰할 수 있다.
Channel이란 무엇인가: 이벤트(Event)를 위한 파이프라인
Channel은 데이터의 전달 자체에 초점을 둔 통신 수단이다.
생산자가 보낸 데이터는 소비자가 한 번 수신하면 즉시 사라진다.
Channel의 핵심 특징
- 휘발성
- 이벤트는 소비되는 즉시 제거된다.
- 일회성 이벤트 처리
- 기본적으로 하나의 이벤트는 하나의 소비자만 처리한다.
- 버퍼 전략
- 소비자가 없을 경우 생산자가 대기하거나, 버퍼에 저장된다.
- 이벤트 중심
- 상태 유지보다는 “어떤 일이 발생했다”는 사실 전달에 적합하다.
StateFlow와 Channel의 차이점 정리
| 구분 | StateFlow | Channel |
|---|---|---|
| 목적 | 상태 유지 | 이벤트 전달 |
| 최신 값 보존 | 항상 유지 | 소비 시 제거 |
| 초기값 | 필수 | 불필요 |
| 소비 방식 | 모든 구독자가 동일 상태 수신 | 단일 소비가 기본 |
| 대표 사례 | UI 상태, 화면 데이터 | 토스트, 네비게이션 |
이해를 돕기 위한 동작 방식 그림
StateFlow 상태 전달 흐름

Channel 이벤트 전달 흐름

활용 예시
UI 상태 관리 – StateFlow
화면 회전이나 재구성 이후에도 유지되어야 하는 정보는 StateFlow가 적합하다.
class MainViewModel : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState: StateFlow<UiState> = _uiState
fun loadData() {
_uiState.value = UiState.Success(data)
}
}
일회성 이벤트 처리 – Channel
토스트, 다이얼로그, 화면 이동과 같은 이벤트는 중복 발생을 막기 위해 Channel을 사용한다.
class LoginViewModel : ViewModel() {
private val _effect = Channel<SideEffect>()
val effect = _effect.receiveAsFlow()
fun onLoginSuccess() {
viewModelScope.launch {
_effect.send(SideEffect.NavigateToMain)
}
}
}
SharedFlow와의 선택 기준
- StateFlow: 항상 최신 상태가 필요한 경우
- Channel: 단일 소비 이벤트
- SharedFlow: 다중 소비 이벤트, replay가 필요한 경우
cf. SharedFlow 관련 글 : https://dev-repository.com/?p=1573
StateFlow vs Channel 선택 기준 정리
- 현재 상태를 표현해야 한다면 StateFlow
- 한 번만 처리할 이벤트라면 Channel
두 도구의 목적을 명확히 구분하면 안드로이드 상태 관리와 MVI 아키텍처가 훨씬 단순해진다. 안드로이드 앱 개발 시 상태 관리 및 이벤트 처리를 할 때 어떤 것이 적합할지 잘 기억했다가 활용하면 좋다. SharedFlow도 같이 알고 있으면 좋은데, 그건 별도 글로 작성하였으니 필요하다면 함께 참고하면 좋다.