HiStory 어플 리팩토링 과정에서 현재 서버 연동이 불가능한 상황이라 Room을 사용하여 데이터를 관리하려고 한다. 이 과정에서 Flow와 LiveData를 사용하게 되었는데, 둘 사이의 차이점에 대해 정리해보고자 한다.
Flow는 비동기 작업에서 값을 생성 할 때 한번에 모든 값을 받는 것이 아니라, 한번에 하나씩 받는다.
LiveData는 옵저버 패턴을 활용하여 구현되어서, 데이터가 변경될 때마다 알림을 받을 수 있고, 수명 주기를 인식하여 자동으로 관찰을 시작하거나 중단하기 때문에 UI에서 사용하거나 표시되는 데이터에 사용하기 적절하다. 그래서 Room DB에서 Flow형태로 값을 가져온 다음 ViewModel에서 이를 LiveData 형태로 변환한다면 데이터베이스의 데이터에 변경 사항이 있을 때 UI에도 바로 변경 사항이 적용되게 된다.
그래서 ViewModel과 View 사이의 작업은 LiveData를 사용하고, 저장소와 ViewModel 사이의 작업은 Flow로 작업을 하면 되겠다는 생각을 했지만, 다른 글들을 읽어 보면서 StateFlow로 LiveData를 대체하면서 Flow 관련 API를 활용할 수 있고, LiveData의 관찰은 메인 스레드에서만 진행되지만 Flow는 코루틴을 활용하여 worker 스레드에서 작업할 수 있기 때문에 데이터 레이어에서 비동기 데이터 스트림을 처리할 수 있다는 이점을 갖는다는 생각이 들었다.
StoryFragment에서는 각 탭 별로 해당하는 종류의 Story 리스트를 전달 받아 이를 표시해야 한다. 그래서 이를 viewModel을 통해 화면에 표시할 데이터를 넘겨받아야 한다. repeatOnLifecycle() 함수를 통해 해당하는 수명주기에 도달하면 코루틴이 자동으로 실행되고, 해당 수명 주기 아래로 간다면 자동으로 취소되므로 백그라운드에서 낭비를 막을 수 있을 것이다.
//StoryFragment.kt
private fun getStory(){
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
storyViewModel.allStory.collect { adapter.submitList(it) }
}
}
}
'Kotlin_study' 카테고리의 다른 글
[Kotlin] RecyclerView와 ViewModel 적용해보기 (0) | 2023.01.19 |
---|---|
[HiStory 리팩토링] 3. 카카오 로그인 기능 적용(2) (0) | 2023.01.04 |
[HiStory 리팩토링] 2. 카카오 로그인 기능 적용 (0) | 2023.01.03 |
[HiStory 리팩토링] 1. 리팩토링을 시작하다 (0) | 2022.12.28 |
[Kotlin] Custom Calendar Library(kizitonwose) 사용하기 (0) | 2022.07.13 |