이번에
Reposiory에 데이터를 저장하고, ViewModel을 통해 노출 시킨 뒤 해당 데이터를 Composable에서 사용하는 로직으로 변경했더니 뷰에 표현이 안되는 오류가 발생했다.
//Repository
private val _gatheringData = MutableStateFlow<List<GatheringNetworkData>>(emptyList())
val gatheringData: StateFlow<List<GatheringNetworkData>> get() = _gatheringData
//ViewModel데이터 노출
val gatheringPostingData
get() = gatheringRepository.gatheringData
//UI에서 데이터 이용
val gatheringFlow by plazaViewModel.gatheringPostingData.collectAsState()
위 처럼 했었는데, Repository의 데이터 변경이 적용되지 않는 문제 발생..
Log를 찍어보니 ViewModel에서부터 데이터 변화를 인지하지 못함.
몇번의 디버깅 끝에 찾아낸 오류는.... 다른 부분에서 발생했었다.
혹시나 해서 repository, ViewModel이 노출하는 데이터 HashCode를 로그찍어 봤더니, 같아야 하는 코드가 서로 다르게 표현되고있었고, Repository가 여러번 생성된다는 것을 알게되었다.
그래서Hilt 모듈을 추가해서 Repository가 싱글톤으로 관리되도록 종속성 주입을 진행하였다.
@Module
@InstallIn(SingletonComponent::class)
object DataRepositoryModule{
@Provides
@Singleton
fun provideGatheringRepository(
gatheringDataSource: GatheringDataSource,
@IoDispatcher ioDispatcher: CoroutineDispatcher
): GatheringRepository {
return GatheringRepository(
gatheringDataSource = gatheringDataSource,
ioDispatcher = ioDispatcher
)
}
}
데이터를 가져오고 뷰에 전달해 주니 다행히도 데이터 전달은 정상적으로 동작하였다.
하지만 다른 문제가 생겼다.
페이지 네이션을 구현하는 도중에 분명히 마지막 페이지를 가져오게되면, 더이상 네트워크 호출을 하면 안되는데, 계~속 데이터 호출을 하여 비용을 발생하고 있었다.
로그를 찍어서 확인해 보았더니,
중복적으로 가져오는 시나리오는
[ 스크롤을 통해서 특정 조건에 도달 시 ViewModel에 요청 ->
ViewModel은 더 불러올 것이 있는가를 확인 ->
있으면 Repo를 통해 데이터 요청 ]
이렇게 진행되어야 했지만 '더 불러올 것이 있는가'라는 Variable이 항상 False로 저장되고 있었다.
가장 큰 실수는 아래와 같이 Repository의 요청 로직에 Join()을 안써서 업데이트 전에 먼저 리턴하게 만든 잘못이었다.
suspend fun fetchData(
....
): Pair<MutableSet<String>, Boolean> {
......
var endOfList = false
gatheringUpdateJob[plazaOption].let {
Log.e("GetDataProcess","gathering getting job start")
CoroutineScope(ioDispatcher).launch{
...데이터 가져오는 로직
endOfList(마지막 데이터인지 확인하고 갱신)
}.join()
}
return searchCandidate to endOfList
}
위 처럼 Join을 붙여주어야 정상적으로 예상한대로 동작하였다.
'어플 개발일기' 카테고리의 다른 글
MutableStateFlow(Kotlin) -> CurrentValueSubject(swift) (0) | 2025.02.08 |
---|---|
코루틴에 대해서 공부 (1) | 2024.11.13 |
24.7.29. AGP 8.5.1 업데이트와 환경설정(SDK, JVM 등) (0) | 2024.07.31 |
24.7.28-29. 앱 내에서 게시글 동기화 문제 해결 (0) | 2024.07.29 |
안드로이드 개발과 관련해서 알아가기(1) (0) | 2024.07.09 |