[Flow] Flow란? #1
우선 나는 지금까지 liveData를 통해 값을 저장하고 observe를 등록해 값의 변경에 따라 ui를 업데이트시켰다.
이번에 ui와 관련된 데이터를 UIState로 일관되게 관리하기 위해서 Flow를 적용해보려고 한다. 우선 그 전에 Flow란 뭔지, LiveData 대신 Flow를 사용했을 때 이점이 뭔지를 명확히 이해하고 넘어가고자 한다.
flow와 liveData에 대해서는 해당 블로그에 정말 자세히, 이해하기 쉽게 정리되어 있다. 이 게시글을 통해 학습한 내용을 토대로 글을 작성해보고자 한다.
👩🏻💻 FLow란?
livedata로도 너무 편하게 값 업데이트를 감지할 수 있는데, 굳이 flow가 필요할까?
내가 flow에 대해 학습하기 전에 들었던 생각이다. 그렇다. liveData로도 값의 변경을 감지하고 ui를 업데이트하는 데는 아무런 어려움이 없다. 그렇다면 어떠한 상황에서 liveData 대신 flow를 사용하는 것이 더 이득이 될까?
👩🏻💻 LiveData의 특징
liveData의 특징 중 다음 두가지가 있다.
- main 쓰레드에서 observe 된다.
- 안드로이드 종속성을 가지고 있다.
각 특징으로 인해 다음의 경우 어려움을 겪을 수 있다.
- main 쓰레드에서 observe된다.
- 비동기 상황에서 데이터 스트림을 처리할 수 없게 된다.
- 단순히 비동기 처리의 결과 관찰하고, 이를 main 쓰레드에서 안전하게 처리하기 위한 도구라 생각하면 쉽다.
- 안드로이드 종속성을 가지고 있다.
- domain layer에서 사용할 경우, liveData 하나만을 위해 안드로이드 의존성을 추가해야 한다.
- 하지만 domain은 순수 자바/코틀린 코드로 구성되어야 하는 레이어이므로 이는 클린 아키텍쳐 관점을 벗어나게 된다.
👩🏻💻 Ui 업데이트를 위한 liveData?
위에서 한 번 언급한 것처럼 가장 많이 사용되는 단순히 viewmodel을 통해 뷰룰 업데이트하는 경우에는 liveData를 사용하는 것이 문제가 되지 않는다.
앱의 다른 layer(domain, data…)에서 데이터 스트림을 써야 한다면 Flow를 사용하고, asLiveData()
를 사용해 liveData로 변환하는 것이 권장된다.
👩🏻💻Flow를 사용했을 때 문제점
Flow 자체는 콜드 스트림 방식이므로 collect(요청)되었을 때만 값이 생성, 반환된다.
하지만 StateFlow
의 등장으로 핫 스트림이 가능해지면서 관찰 가능한 상태 홀더 흐름으로 사용할 수 있게 되었다.
그럼에도 liveData를 완전히 대체하기에는 무리가 있다. liveData의 경우, View가 stopped 상태가 되면 자동으로 observe를 취소한다. 하지만 StateFlow는 그렇지 않기에 repeatOnLifeCycle
과 함께 사용하여 flow를 수집해야 한다.
댓글남기기