배경
초기에는 RecyclerView를 사용해 모든 데이터를 한 번에 로드하는 방식을 사용했습니다
문제 인식
한 번에 모든 데이터를 로드할 때 발생하는 문제점들을 경험한 후, 효율적인 데이터 로딩을 위해 Paging3를 도입했습니다
목적
이 글에서는 RecyclerView와 Paging3를 사용한 데이터 로딩 방식을 비교하고, Paging3 도입으로 얻은 성능 개선과 장단점을 설명합니다
- 구현이 상대적으로 간단
- 한 번에 모든 데이터를 로드하므로 페이지 간의 전환이 빠름
- 한 번에 많은 데이터를 로드할 때 메모리 사용량 증가로 앱 성능 저하
- 네트워크 상태가 좋지 않을 때, 모든 데이터를 받아오기까지 시간이 오래 걸림
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Feed> {
val page = params.key ?: 0
return try {
val accessToken = sharedPreferences.getString("ApiAccessToken", null)
val response = api.getAllFeeds(
accessToken,
page,
params.loadSize,
"createdAt,DESC"
)
val responseData = response.body()
LoadResult.Page(
data = responseData?.content ?: emptyList(),
prevKey = if (page == 0) null else page - 1,
nextKey = if (responseData?.last == true) null else page + 1
)
} catch (e: Exception) {
LoadResult.Error(e)
} catch (e: HttpException) {
LoadResult.Error(e)
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
override suspend fun getFeeds(): Flow<PagingData<Feed>> {
return Pager(
config = PagingConfig(pageSize = 20, enablePlaceholders = false),
pagingSourceFactory = {
CommunityFeedPagingSource(
communityApi,
sharedPreferences
)
}
).flow
}
- 필요한 데이터만 로드하여 메모리 사용량 감소
- 점진적으로 데이터를 로드하여 사용자 인터페이스가 더 부드럽고 응답성 높음
- 초기 로딩 시 일부 데이터만 받아오기 때문에 응답 속도가 빨라짐
- 구현이 복잡하고 추가 설정이 필요
- 페이지 간 데이터 로딩 시 약간의 지연이 발생할 수 있음
Paging3를 도입함으로써 얻은 장점들이 기존의 Recyclerview 방식의 단점을 효과적으로 해결하는 모습을 통해,
데이터 로딩 방식의 중요성을 알 수 있었습니다그러나 무작정 Paging을 사용하기보다 본인의 해당 프로젝트에서 많은 데이터를 다루지 않을 것 같다 생각이 든다면
Recyclerview로 해도 괜찮을 것 같습니다