[Android] StateFlow vs SharedFlow 어디에 쓰는지는 알겠는데..??

우발자·2025년 8월 3일
1


우선 안드로이드 개발을 하면서 StateFlow와 SharedFlow를 많이 써왔다. 하지만 차이점을 알고 써왔다기보다는 그냥 그래왔으니깐...이런 생각이 더 컸던 것 같아서 나 자신이 조금 한심했다. 그래서 간단하게라도 차이점을 공부하여 기록할 목적이다.


StateFlow

StateFlow란 무엇일까

StateFlow는 현재 상태와 새로운 상태를 내보내는 관찰 가능한 상태 홀더 흐름입니다.

안드로이드에서 주로 UI 업데이트를 할 때 많이 쓰인다. 왜냐하면 크게 몇가지가 있다.
1. 초기상태를 가지고 있다
2. 같은 값은 emit하지 않는다.
3. jetpack Compose랑 호환이 잘된다

1번 같은 경우에는 UI를 보여줘야되는 입장에선 매우 중요한 부분이다. 왜냐하면 어떠한 상황이라도 항상 값은 가지고 있다라는 점이다! 그렇기에 UI를 그리는 부분에선 예외처리할 부분이 적어진다는 의미이다.

2번도 매우 중요한데 UI 그릴 때 같은 값이 업데이트 돼도 UI적으로는 아무 변화가 없을 것이다. 그래서 불필요한 Recomposition을 줄일 수 있도록 해준다.

3번은 모두 공감할 듯이 collectAsState()이 있는데, Composition에 lifeCycle을 따르고 Composition에 진입 시 FloW를 수집을 한다. 그리고 따로 collect을 안해도 내부에서 감지하여 자동으로 값을 바꿔준다.

물론 이번에 공부하면서 새로운 사실도 알았다. StateFlow는 코드 내부적으로 SharedFlow를 상속받고 있다는 점이다. 이 부분도 나중에 제대로 공부해보고 싶다


SharedFlow

SharedFlow란 무엇일까

여러 코루틴에서 동일한 데이터 스트림을 공유하고 수집할 수 있도록 하는 Flow Api이다.

SharedFlow는 이벤트처리를 할때 많이 쓰인다. 이유를 살펴보자
1. 초기값이 필요없다.
2. 최신상태를 가지고 있지 않는다.
3. buffer, replay 옵션이 있음.

1번은 이벤트처리에 있어서 초기값이 존재한다는 건 까다로울 것 같다. 화면 진입시, 화면 회전시마다 매번 이벤트를 방출 할 것이기 때문에 사용자의 목적에 맞게 사용하기가 어려울 것이다.

2번 또한 마찬가지로 이벤트 처리에 있어서 최신상태를 가질 필요가 없다. 이벤트는 단발성이기 때문에 소비한 후 그 이벤트를 가지고 있을 이유가 없다.

3번 StateFlow는 최신 상태만 방출한다. 하지만 SharedFlow는 buffer나 replay를 통해 컨트롤하여 최신값 말고 이전값들을 저장했다가 차례로 방출 할 수 있다. 이 부분도 중요한 이벤트인 경우에는 아주 유용할 것 이다. 하지만 UX적으로는 그만큼 딜레이 될 수있으니 잘 사용해야 될 것 같다.

buffer와 replay에 역할을 간단하게 살펴보자면

buffer는 소비에 비해 방출이 빠를때 사용하면 유용하다. 이전 값들을 쌓아뒀다가 차례로 방출할 수 있게 해준다.
replay는 최신 값을 얼마나 유지할 까이다. 구독하는 시점에 따라 어떤값을 방출 해줄지에 대해 고민할 때 사용하면 좋을 것 같다.


후기

물론 내가 상황에 맞게 잘 써왔던 건 맞지만 왜 쓰는지는 잘 몰랐던 것 같다.
이번 기회에 조금은 그 이유를 알았으니 앞으로 사용할 때 더 잘 활용할 수 있을 것 같다.

profile
나는 안드로이드 개발자다.

0개의 댓글