Skip to content

학습‐Channel, SharedFlow, StateFlow

easyhak edited this page Dec 4, 2024 · 2 revisions

저희 프로젝트는 이벤트를 처리하는데 SharedFlow를 사용하지 않고 Channel을 사용했습니다. 이 글에서 Flow, SharedFlow, Channel의 특징을 가지고 있는지 정리해보고 이벤트 처리에 왜 Channel을 사용했는지에 대한 것을 정리해보겠습니다.

Flow

Flow는 콜드 스트림으로 데이터를 소비하는 collect가 호출될 때 데이터를 발행하는 특성을 가지고 있습니다. 특징

  • 콜드 스트림: 구독할 때 데이터를 생성합니다.
  • 구독자가 존재하지 않으면 데이터는 생성되지 않습니다.
  • 저희 프로젝트에서는 UseCaseRepository 데이터를 발행할 때 사용합니다.

SharedFlow

SharedFlow는 HotStream입니다. 그래서 구독자가 없더라도 데이터를 발행합니다. 특징

  • 핫 스트림: 구독자가 없어도 데이터가 발행됩니다.
  • replay 설정 가능: 발행된 데이터를 일정 개수만큼 보관하여 새로운 구독자에게 전달할 수 있습니다.
  • StateFlow와의 차이점
    • replay를 1로 설정하면 stateFlow와 유사하나 초기값을 갖지 않아도 된다는 점이 다릅니다.

Channel

Channel은 1:1 통신을 기반으로 하는

특징

  • 구독자가 없으면 이벤트를 버퍼에 저장하여 대기합니다(0일 때는 제외)
  • 소비자(Collector)가 준비되면 발행된 데이터를 처리합니다.
  • 기본적으로 1:1 통신 모델을 지원하며, 한 번 처리된 이벤트는 다른 소비자가 받을 수 없습니다.

SharedFlow의 문제점

이벤트 유실이 발생할 수 구독자가 없으면 이벤트가 유실될 수 있습니다. SharedFlow는 기본적으로 핫 스트림이므로 구독자가 없는 시점에서 발행한 이벤트는 유실됩니다. 예를 들어, 화면 전환을 하거나, 홈 화면으로 이벤트가 발생했을 때가 있습니다.

즉, 저장 버튼을 누르고 이벤트를 발행했으나, 사용자가 화면을 이동하면 이벤트가 구독되지 않고 유실될 수 있습니다.

커뮤니티에서 저장버튼을 누르자마자 사용자는 홈으로 이동 -> 이벤트 발생했지만 구독이 해제되었기 때문에 Collect되기전에 백그라운드에서 이벤트가 발생하면 홈에 와있으면 그 이벤트가 유실됨

replay: sharedflow의 replay의 개수만큼 가지고 있음. 가지고 있다가 어떻게 쓰냐면 새로운 구독자가 오면 replay 보관해뒀던 것을 보내줌

SharedFlow의 replay(1)은 StateFlow랑 사실상 똑같다. 차이점은 초기값 여부

SharedFlow로 이벤트를 관리 홈 키를 눌렀을 때 유실되는 문제 -> 어떠한 구독자가 없기 때문에 문제가 발생

replay(5)라고 가정 -> 화면 회전 -> 이벤트가 5개 옴 -> 이것에 대한 처리를 immutable한 값으로 mark할 수 있는 값을 보내줌 -> 그리고 그 값을 바꿈

화면을 돌렸을 때 그 이벤트가 오면 이벤트 체크 -> 이미 소비된 이벤트라는 것을 알 수 있음

SharedFlow를 구독할 때 lifecycle과 관계없이 collect하면 view가 안보이는데도 구독? 실제로 손해일까?/ collectaswithlifecycle

Channel

collect가 collector를 안하면 그 이벤트를 가지고 있으면

우리 상황에서는 viewmodel 이 하나이기 때문에 1:1이여도 괜찮음

sharedFlow는 lifeCycle에 따라 이벤트를 유실할 수 있다.

홈 화면 emit은 작동 sharedFlow가 아무도 안들고 있으니까 버려짐 -> 유실!!!!

Clone this wiki locally