Kotlin,  Android Development

Kotlin Coroutines의 StateFlow와 Channel 비교

사진: Unsplash의 Roberto Shumski

비동기 데이터 스트림을 처리하는 Kotlin Coroutines 환경에서 StateFlowChannel은 안드로이드 상태 관리에서 가장 핵심적인 도구이다. 두 요소 모두 데이터를 전달하는 Hot Stream의 성격을 가지지만, 설계 목적과 동작 방식에는 분명한 차이가 존재한다. 이 글에서는 Kotlin Coroutines의 StateFlow와 Channel의 차이점을 중심으로 언제 어떤 도구를 선택해야 하는지를 예제와 다이어그램을 통해 정리한다.

 


StateFlow란 무엇인가: 상태(State)를 위한 데이터 스트림

StateFlow는 이름 그대로 상태(State)를 표현하고 유지하기 위해 설계된 데이터 스트림이다.

항상 하나의 최신 값을 보유하며, 새로운 구독자가 시작되면 즉시 현재 상태를 전달한다.

StateFlow의 핵심 특징

  • 상태 보존
    • 항상 최신 값을 내부에 유지한다.
    • value 프로퍼티를 통해 현재 상태에 즉시 접근 가능하다.
  • 초기값 필수
    • 생성 시 반드시 초기 상태가 필요하다.
    • UI는 항상 유효한 상태에서 시작된다.
  • Conflation(값 합치)
    • 짧은 시간에 여러 값이 방출되더라도 구독자는 최종 값만 수신한다.
    • 중간 상태가 중요하지 않은 UI 상태 관리에 적합하다.
  • 다중 구독자 지원
    • 여러 Collector가 동일한 상태를 동시에 관찰할 수 있다.

 


Channel이란 무엇인가: 이벤트(Event)를 위한 파이프라인

Channel은 데이터의 전달 자체에 초점을 둔 통신 수단이다.

생산자가 보낸 데이터는 소비자가 한 번 수신하면 즉시 사라진다.

Channel의 핵심 특징

  • 휘발성
    • 이벤트는 소비되는 즉시 제거된다.
  • 일회성 이벤트 처리
    • 기본적으로 하나의 이벤트는 하나의 소비자만 처리한다.
  • 버퍼 전략
    • 소비자가 없을 경우 생산자가 대기하거나, 버퍼에 저장된다.
  • 이벤트 중심
    • 상태 유지보다는 “어떤 일이 발생했다”는 사실 전달에 적합하다.

 


StateFlow와 Channel의 차이점 정리

구분StateFlowChannel
목적상태 유지이벤트 전달
최신 값 보존항상 유지소비 시 제거
초기값필수불필요
소비 방식모든 구독자가 동일 상태 수신단일 소비가 기본
대표 사례UI 상태, 화면 데이터토스트, 네비게이션

 


이해를 돕기 위한 동작 방식 그림

StateFlow 상태 전달 흐름

StateFlow 흐름

Channel 이벤트 전달 흐름

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도 같이 알고 있으면 좋은데, 그건 별도 글로 작성하였으니 필요하다면 함께 참고하면 좋다.

댓글 남기기

Dev Repository에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기