[Flow] Flow란? #1

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를 수집해야 한다.


📃참고

댓글남기기