Paging이란 데이터를 가져올 때 한 번에 모든 데이터를 가져오는 것이 아니라 일정한 덩어리로 나눠서 가져오는 것이다. Paging을 사용하면 성능, 메모리, 비용 측면에서 굉장히 효율적이다. 인터넷 페이지를 생각하면 된다.
Android Jetpack에서는 페이징을 위한 Paging3 라이브러리를 제공해준다. Paging3 라이브러리는 로컬 저장소에서나 네트워크를 통해 데이터를 나누어 효율적으로 로딩할 수 있게 도와준다. Paging3는 구글에서 권장하는 Android 앱 아키텍쳐에 맞게 설계 되었으며, 다른 Jetpack 컴포넌트와 잘 동작할 수 있도록 설계되었다. 라이브러리는 로컬 데이터베이스 또는 네트워크(Remote)의 데이터를 페이지 단위로 UI에 쉽게 표현할 수 있도록 도와주는 라이브러리이다.
Paging3 라이브러리는 Repository, ViewModel, UI 총 3개의 layer로 구성된다.
📌 PagingData
페이징된 데이터의 Container 역할을 한다. 데이터가 새로고침 될 때마다 이에 상응하는 PagingData가 별도로 생성된다.
📌 PagingSource
로컬 데이터베이스 또는 네트워크로 데이터를 불러오는 것을 담당하는 추상 클래스이다. 데이터 소스를 정의하고 데이터를 검색하는 방법을 정의한다.
📌 RemoteMediator
네트워크에서 데이터를 불러올 때 캐싱하여 로컬 데이터베이스에 저장하고 그 데이터베이스에서 데이터를 불러온다. 오프라인 상태에서도 캐시된 데이터를 불러옴으로 유저 경험을 향상시켜줄 수 있다.
📌 Pager
Repository Layer에서 구현된 PagingSource와 함께 PagingData 인스턴스를 구성하는 반응형 스트림을 생성한다. Pager로부터 Flow, Observable, LiveData 형태로 반환한다.
PagingSource에서 데이터를 로드하는 방법, 옵션을 정의한 PagingConfig클래스와 함께 사용된다.
📌 PagingDataAdapter
PagingData를 RecyclerView에 바인딩하기 위해 사용된다. 데이터를 어느 시점에서 더 받아올 것인가 등 UI와 관련된 대부분의 일을 책임진다.