StateFlow vs SharedFlow의 차이점 알고있니?

0
post-custom-banner

Android를 공부하다보면, StateFlowSharedFlow를 한번쯤 들어보셨을껍니다.
하지만 서로 이름이 비슷하기도 하고, 쓰임새도 비슷해 뭐가 다른지 모르는 일이 있을것같습니다.
한번 뭐가 다른지 정리해 봅시다!


1. StateFlow는 뭐고 SharedFlow는 어떻게 만들어졌는가?

MVVM으로 개발하였을때를 생각해봅시다.

상태 데이터가 ViewModel에 위치하게 되며, 바인드된 View들이 해당 상태에 따라 처리하도록 구성하게 됩니다.

Android에서는 이런 상태에 대한 데이터를 다루기위해 LiveData를 제공하고 있습니다.


sealedClass를 이용해 편하고 쉽게 상태를 전달할수있다.

하지만 LiveData는 라이프사이클과 자연스럽게 연동되므로 편리하게 사용할수 있지만, Android에 종속되기때문에 비지니스 레이어에서 사용하기에는
무리가 있습니다.
더구나 KMM이 두각되는 만큼, 플랫폼 독립적으로 가고자 한다면 불편하겠죠.

이것을 보완하기 위해 만들어진것이 StateFlowSharedFlow라고 할수 있습니다.

2. SharedFlow vs StateFlow?

일단 공통점은 둘은 HotStream이라는 것입니다.
collect()된 시점 이후부터 방출하는 데이터를 받아올수 있습니다.

차이점은
1. StateFlow는 반드시 초기값을 명시 해주어야 합니다.
2. StateFlow는 value 속성을 이용해 값을 방출할수 있습니다(또는 가져올수도 있죠)
3. SharedFlow는 좀더 detail한 설정값들을 생성자에 전달해줄수 있습니다.

그리고 가장 큰 차이점은 StateFlow는 값을 중복으로 방출할경우, collect()해오지 않는다는것 입니다.

override fun onCreate(savedInstanceState: Bundle?) { 
// sharedFlow collect 
	MainScope().launch { 
	testViewModel.sharedFlow.collect { Log.i(TAG, "sharedFlow: $it") } 
	} 
// stateFlow였을때 
	MainScope().launch { 
    testViewModel.stateFlow.collect { Log.i(TAG, "stateFlow: $it") 
	} 
} // 양쪽 flow에 emit 시작 


// 100의 값을 100번 호출해보자
	MainScope().launch { 
	testViewModel.repeatSameDataToEachFlow() 
	} 
}

stateFlow는 100을 한번밖에 호출하지 않는것을 볼수있는데, stateFlowcollect()가 내부적으로 값이 같을경우, Skip하기 때문입니다.

profile
쉽게 가르칠수 있도록 노력하자
post-custom-banner

0개의 댓글