성장기록지
StateFlow 개념과 사용 이유 본문
StateFlow의 개념
- StateFlow는 SharedFlow의 구체화 버전이다.(상속 받음)
- 구독자가 생기면 값을 발행하지만, 구독자가 사라져도 최신 값을 메모리에 유지한다. (hot Stream)
- 여러 구독자에게 최신 값을 발행할 수 있다. (hot Stream)
- StateFlow는 1의 고정된 replayCache값을 가진다. (한가지 값만 가지고 있을 수 있다는 뜻)
StateFlow를 왜 사용하는가 (LiveData와 비교)
우선 우리는 LiveData에 대해 살펴 볼 필요가 있다.
기존에 viewModel에서는 주로 LiveData를 통해 값을 갖고있도록 하였다.
왜냐면 Observable한 데이터 홀더 클래스인 LiveData는 다음과 같은 장점이 있기 때문이다.
LiveData는 Activity, Fragment 등 안드로이드 컴포넌트의 생명주기를 인식한다.
생명주기를 인식하기 때문에 생명주기가 끝나는 즉시 관찰을 멈추고 삭제되어 메모리 누수를 걱정하지 않아도 된다.
데이터 변화를 관찰하고 Observer 객체에 알려 UI와 데이터 상태의 일치를 보장할 수 있다.
이러한 장점으로 자주 사용되었지만, 아키텍처 관점에서 다음과 같은 문제가 있다.
LiveData는 Android 플랫폼에 종속적이고 UI가 없는 곳에서 LiveData를 사용하기가 어렵다.
클린아키텍처나 안드로이드 권장 아키텍쳐에서, Presentation Layer(UI Layer) 에서는 LiveData를 잘 활용하지만,
안드로이드 플랫폼에 독립적이고, 순수 Kotlin 및 Java만 사용할 수 있는,
즉 언어 의존성만 지니는 Domain Layer에서는 LiveData를 쓰기 어렵다는 것이다.
또한 계층별로 모듈화를 한다면 LiveData만을 위해 안드로이드 의존성을 지니게될 수도 있다.
하지만 Kotlin, Coroutine이 발전하면서 Flow가 등장하게 되었고,
LiveData를 대체할 수 있는 StateFlow와 SharedFlow를 활용할 수 있게 된 것이다.
또한, LiveData는 항상 UI Thread(메인 쓰레드)로 값을 처리하여 Data Layer 에서 문제가 생긴다.
아래는 공식문서의 설명인데, 한번 해석해보도록 하겠다.
Data Layer 에서 LiveData 객체를 작업하고 싶을 수 있지만
LiveData 는 비동기 데이터 스트림을 처리하도록 설계되지 않았다.
LiveData transfromation 과 MediatorLiveData 등을 통해 이를 처리하게 할 수는 있겠지만,
모든 LiveData 의 관찰은 오직 Main Thread 에서만 진행되기 때문에 한계점을 갖고 있다.
따라서 데이터를 받아오는 곳이 서버 또는 DB라면 무거운 작업이 되기 때문에,
메인 쓰레드가 아닌 별도의 워커 쓰레드에서 처리해야 ANR 등을 피할 수 있기 때문에 Flow가 적합하다.
StateFlow를 왜 사용하는가 (Flow와 비교)
그렇다면 Flow도 있는데 왜 StateFlow를 쓰는지 알아 볼 시간이다.
이전 글에서 알아본 Flow의 특징을 다시 살펴보자.
Flow는 상태가 없다. 그러므로 현재 값을 알지못한다.
Flow는 안드로이드 생명주기에 대해 알지못한다. 따라서 생명주기에 따른 다른 처리가 필요하다.
Flow는 Cold Stream 방식이라, 연속해서 들어오는 데이터를 처리할 수 없고 collect할 때마다 flow가 재실행된다.
이러한 특징들을 보면 LiveData를 대체하기는 어려워보인다.
한계점들을 보완하여 나온 것이 바로 StateFlow와 SharedFlow이다.
아까 서술했듯이 StateFlow는 SharedFlow의 구체화 버전이고,
항상 값을 가져야하는 StateFlow의 경우 UI 상태를 View에 노출시킬 때 효과적으로 사용할 수 있기 때문에
LiveData에 가장 가깝다고 할 수 있다.
SharedFlow는 스낵바같은 일회성 이벤트를 전달하기에 유용하다, 다음 글에서 다루겠다.
참고 자료
https://oliveyoung.tech/2022-12-14/Android-State-Flow/
https://velog.io/@wonseok/StateFlow-SharedFlow
https://thdev.tech/android/2021/02/01/LiveData-Intro/#google_vignette
'안드로이드 > 안드로이드 지식' 카테고리의 다른 글
DiffUtil 알아보기 (0) | 2025.01.30 |
---|---|
Kotlin Flow란? (0) | 2025.01.24 |
Kotlin Data Stream (Sequence, Hot, Cold Stream) (0) | 2025.01.23 |
Compose Structure 정리하기 (compiler, Runtime, UI) (0) | 2025.01.22 |
Compose Stability 자세히 알아보기! (0) | 2025.01.21 |