StateFlow와 SharedFlow에 대해 알아보자.

차경민
쓱싹팀 이야기
4 min readJul 31, 2022

이 포스팅은 코루틴 공식 가이드 읽기 Part 9 — Dive1 를 참고하여 만들었습니다.

Photo by Aaron Burden on Unsplash

State(상태)

State를 해석하면 상태입니다. 어플리케이션의 상태란 사용자의 관점과 개발자의 관점으로 나눌 수 있습니다.

사용자의 관점에선 만약 로그인을 한다 해봅시다. 로그인 자체가 상태가 되며
로그아웃, 계정잠금 등 여러 인증에도 상태를 가지고 있습니다.

개발자의 관점에서는 만약 사용자가 로그인을 한다 했을 때 걸리는 로딩중, 에러 등 상태를 반드시 한가지를 가지고 있습니다.

MVVM 아키텍쳐를 이용할 경우 UI와 관련된 상태들은 ViewModel에 위치되어 있으며 ViewModel에 바인드 된 View에 상태를 표현할 수 있습니다.

https://myungpyo.medium.com/stateflow-%EC%99%80-sharedflow-32fdb49f9a32

Kotlin에서 상태를 정의할 때 부가적인 데이터가 없다면 Enum, 데이터가 필요하다면 Sealed class를 이용합니다.

Android의 ViewModel에서 상태를 정의할려면 LiveData를 사용할 수 있습니다.
하지만 LiveData는 UI와 밀접한 관게가 있으며 비지니스 로직을 처리하기엔 어려움이 있습니다.

이를 해결하기 위해 전에 Android 에서는 Rx로 상태를 구현했습니다.
Rx를 사용할 때 Subject로 상태를 구현했습니다.

Android에서 Kotlin을 공식 언어를 사용하면서 굳이 Rx를 사용하지 않고 경량화된 Rx 즉 Flow로 상태를 구현할 수 있습니다.
Flow는 기본적으로 Cold Stream이지만 StateFlow, ShareFlow로 Hot Stream을 구현할 수 있습니다.
HotStream은 기본값으로 모든 구독자에게 최신 상태를 전달해 줍니다.

ViewModel에서 Flow 의 사용할때도 Coroutine ViewModelScope를 사용하여 ViewModel lifecycle에 바인딩 되여 사용하기 편리합니다.
또한 AndroidX에서 다양한 중단함수를 제공하고 있기 때문에 Flow를 사용안할 이유가 없습니다.
Rx Observable과 비교하여 장점 중 하나는 Flow chain에서 중단함수를 사용
해 가독성을 높일 수 있습니다.

코드를 살펴보면
6~7의 코드에서는 먼저 _uiState는 viewModel 내부에서 사용하기 위한 Flow이고 외부로 노출하기 위한 uiState는 asStatefLOW를 사용하여 Immutable Flow로 변환한 Flow 입니다.

16번 라인의 getAll 함수를 호출했을 시 viewModelScope에서 코루틴이 생성되어 repository의 중단함수가 호출되고 성공,실패 여부에 따라 구독하고 있는 Ui에 값을 전달합니다.

Event(이벤트)

상태는 항상 기본 상태를 가지고 있지만 이벤트는 기본 값 없이 특정 상황이 나타났을 때 구독자에게 상황을 전달하는 것을 이벤트로 전달됩니다.

  • 상태는 기본값을 가지고 있고, 이벤트는 기본값이 없습니다.
  • 상태는 신규 구독시 가장 최신 값을 받고, 이벤트는 구독 이후 발생한 값을 받습니다.

이벤트를 사용하는 경우에는 Ui 단계에서 사용자와 뷰와 상호작용할 때 발생한 이벤트를 전달하거나, 시스템 메모리 부족, 오류 발생 등의 이벤트를 대응하기 위해 사용됩니다.-

--

--