DoReMi

[Kotlin] Flow(StateFlow,SharedFlow) 본문

Android/개념

[Kotlin] Flow(StateFlow,SharedFlow)

도레미누 2023. 12. 19. 21:56

State Flow 왜 써야할까?

State Flow란?

StateFlow 는 현재 상태와 새로운 상태 업데이트collector에 내보내는 Observable한 State holder flow 입니다.

StateFlow는 SharedFlow의 한 종류이며, LiveData에 가장 가깝습니다.

항상 값을 가지고 있고 오직 한 가지 값만 가집니다. 그러므로 초기값이 존재해야합니다.

여러 개의 collector를 지원합니다. 즉 flow를 공유할 수 있습니다.

collector 수에 상관없이 항상 구독하는 것의 최신 값을 받습니다.

Hot Stream 방식으로 collect할 때마다 flow가 재실행되지 않습니다.

LiveData의 문제점

LiveData를 대신해서 StateFlow를 사용하게 되는 것인데..

왜 LiveData 대신 StateFlow를 사용하는 것 일까?

클린 아키텍쳐 관점으로 봐야한다.

  • LiveData 는 UI 에 밀접하게 연관되어 있기 때문에 Data Layer 에서 비동기 방식으로 데이터를 처리하기에 자연스러운 방법이 없다. 
  • LiveData 는 안드로이드 플랫폼에 속해 있기 때문에 순수 Java / Kotlin 을 사용해야 하는 Domain Layer 에서 사용하기에 적합하지 않다.

State Flow를 사용해서 얻는 이점

  • 안드로이드 플랫폼에 종속적이었던 LiveData 와는 달리, StateFlow 는 순수 kotlin 라이브러리이기 때문에 Domain Layer 에서 사용할 수 있습니다.
  • 코루틴을 통해 Work Thread 에서도 비용이 많이 드는 데이터 스트림을 처리할 수 있기 때문에 Data Layer 에서 LiveData 를 사용하는 것보다 향상된 성능으로 사용 가능합니다.
  • StateFlow 는 zip, flatMapMerge 등 다양한 Flow API 를 사용할 수 있기 때문에 LiveData 보다 풍부하게 활용할 수 있습니다.

SharedFlow란?

StateFlow의 일반화된 버전으로 볼 수 있으며, SharedFlow 또한 Flow 와 달리 Hot Stream 이다.

초기값을 가지지 않고, 여러 설정이 가능하기 때문에 주로 이벤트 처리에 사용할 수 있다.

값을 가지지 않으며, 초기값을 갖고있지 않아도 됩니다.

replayCache가 존재하는데, replay란 collect시 전달받을 이전 데이터의 개수이고 몇 개까지 값을 캐싱하고 있을지에 대해서는 인자로 정의할 수 있습니다.

Hot Stream 방식입니다.

파라미터로 relplay, extraBufferCapacity, onBufferOverflow를 받을 수 있습니다.

버퍼 관련 설정

extraBufferCapacity로 버퍼 개수 설정이 가능하다.

버퍼를 설정하는 이유는flow의 emit 이 빠르고 collect가 느리면 지정된 개수만큼 버퍼에 저장하는 식으로 실행하는데 이 개수를 넘어가면onBufferOverflow 으로 설정한 버퍼 정책에 따라 동작하게 된다.

  • BufferOverflow.SUSPEND

buffer가 꽉 찼을 때 emit을 수행하면 emit 코드가 blocking 된다. 즉, buffer의 빈자리가 생겨야 emit 코드 이후의 코드가 수행될 수 있다.

  • BufferOverflow.DROP_OLDEST

buffer가 꽉 찼을 때 emit을 수행하면 오래된 데이터 부터 삭제하면서 새로운 데이터를 넣는다.

  • BufferOverflow.DROP_LATEST

buffer가 꽉찼을때 emit을 수행하면 최근 데이터를 삭제하고 새로운 데이터를 넣는다.


Cold Stream vs Hot Stream

Cold Stream

  • 하나의 소비자(Consumer)에게 값을 보낸다
  • 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행한다
  • 예) 상태가 변하지 않는 값을 읽을 때(DB를 읽거나 URL을 통해 서버 값을 읽는 경우)
  • Flow

Hot Stream

  • 하나 이상의 소비자(Consumer)에게 값을 보낸다
  • 데이터 발행이 시작된 이후 부터 모든 소비자에게 같은 데이터를 발행하고 구독자가 없는 경우에도 데이터를 발행한다
  • 예) 상태가 변하는 값을 읽을 때(라디오에서 방출하는 방송을 청취할 때)
  • State Flow, SharedFlow

Flow와 Channel, Cold Stream과 Hot Stream

 

Flow와 Channel, Cold Stream과 Hot Stream

Cold Stream VS Hot Stream

medium.com

'Android > 개념' 카테고리의 다른 글

[kotlin] ViewModelFactory  (0) 2024.01.26
[Kotlin] ListAdatper / DiffUtil  (0) 2024.01.19
[Kotlin] Coil 라이브러리  (0) 2023.11.19
[Kotlin] 파이어베이스 사용 코드 예시  (0) 2023.09.14
[Kotlin] 키보드 이벤트  (0) 2023.08.15