Android/JetPack
Jetpack - Paging Library (1)
봄석
2019. 8. 13. 12:01
Jetpack - Paging Library (1)
페이징이란?
페이징은 데이터베이스의 데이터를 일정한 덩어리로 나눠서 제공하는 것을 의미합니다.
Android라는 키워드를 입력했을 때, 구글은 약 28억 개에 해당하는 모든 검색 결과를 클라이언트로
내려주는 대신 상위 10개의 결과만을 보여줍니다.
이렇게 함으로써 구글은 사용자에게 원하는 결과를 빠르고 제공할 수 있고,
클라이언트에서는 이를 통해 성능, 메모리, 네트워크 비용을 효과적으로 다룰 수 있습니다.
안드로이드에서는 바로 스크롤을 이용해 데이터를 점진적으로 불러오는 무한 스크롤링 기법으로 사용할 수 있습니다.
개념 정리
- PagedList: DataSource로 부터 가져온 불변 데이터 및 페이지에 대한 정보를 들고 있으면서, PagedListAdapter 와 DataSource를 이어주는 중재자
- PagedListAdapter: 페이징을 처리하기 위한 RecyclerView.Adapter
- DataSource: Network, Memory, DB로 부터 페이징 데이터를 질의하는 역할의 추상 클래스
- PagedList.BoundaryCallback<Value>: PagedList가 사용 가능한 데이터의 끝에 도달했을 때 콜백을 받는 추상 클래스. LivePagedListBuilder 에 넘겨서 사용함 (네트워크와 데이터베이스 같이 사용하는 경우 구현)
- ItemKeyedDataSource<Key, Value>: 아이템에 다음 가져올 페이지 시작 키 값이 있는 경우 상속해야할 DataSource
- PageKeyedDataSource<Key, Value>: 페이지에 다음 가져올 페이지 시작 키 값이 있는 경우 상속해야할 DataSource
- PositionalDataSource<T>: 고정된 항목 수를 제공할 수 있는 경우 사용. Room은 PositionalDataSource인 DataSource.Factory를 반환
- PagedList.Config: PagedList가 DataSource에서 가져오는 데이터의 크기, 미리 불러오는 데이터 크기 등을 정의
- DataSource.Factory: DataSource를 감싸 LivePagedListBuilder 로 넘김. 내부적으로 DataSource의 인스턴스 생성을 제어하기 위함
- LivePagedListBuilder: DataSouce.Factory 와 PagedList.Config 혹은 page size 와 같은 설정을 인자로 받아 LiveData<PagedList<Value>> 를 생성
- RxPagedListBuilder : LivepagedListBuilder와 유사하게, RxJava2 기반의 기능을 제공한다. 이 클래스는 아키텍쳐 라이브러리의 RxJava2 기반으로 제공됩니다. 이 클래스를 사용하여, PagedList를 구현할 때 Flowable과 Observable을 생성할 수 있음
흐름
datasource가 Network, DB ,Memory 로부터 값을 받아와서 PagedList에 넘겨주고,
PagedList가 PagedAdapter에 다시 넘겨주어 ,
PagedAdapter의 DiffUtil을 통해 변경된 부분을 확인한 뒤 그 부분만 화면에 갱신합니다.
DataSource 차이점
ItemKeyedDataSource
-
서버나 데이터베이스로부터 해당 기준된 Key로부터 데이터를 로드
- 처음에 RecyclerView가 화면에 나타나게 되면 ItemKeyedDataSource에서는 loadInitial() 메소드를 호출하게 됩니다.초기화에 필요한 Key와 로드하고싶은 데이터의 사이즈 등을 인자로 받아 서버나 데이터베이스 등으로부터 데이터를 로드 할 수 있습니다.
- 이후 RecyclerView를 스크롤 하게 되면 loadAfter()를 호출하게 되고, 이때 기준 Key를 통해 다음 페이지를 로드 하면됩니다. 여기서 Key를 통해 다음 페이지를 가져오려는데 데이터베이스의 내용이 변경된다면 어떻게 될까요? 걱정할 필요없습니다. Key의 비교를 통해 중복된 데이터는 자연스럽게 걸러지게 되고, 애니메이션과 함께 UI가 갱신되게 됩니다.
- N번째 데이터로, N-1 / N+1의 데이터를 가져올 때(ex. 날짜별 정렬, 정렬된 ID 등)이 있을때 , 사용합니다 .
- 리스트의 마지막 요소를 이용해서 다음 페이지를 불러오는 페이징 방식에서 사용할 수 있습니다.
PageKeyedDataSource
-
ItemKeyedDataSource가 하나의 아이템키에 대한 기준으로 데이터를 가져왔다면, PageKeyedDataSource는 페이지키 단위로 데이터를 불러들입니다. 단 데이터베이스나, 네트워크로 부터 다음페이지와 이전페이지를 받아야합니다.
- 먼저 itemKeyDataSource와 같이 loadInitial() 메소드를 통해 한페이지의 데이터를 받습니다.
- 이후 사용자의 RecyclerView 스크롤을 통해 loadAfter를 호출하게 되고 다음 페이지를 로드 하게됩니다.
- before, after ,prev, next 처럼 다음 페이지에 대한 키 값이 있을때 사용합니다.
PositionalDataSoure
- Position기반의 데이터 로더로 셀수 있는 고정된 사이즈를 갖는 데이터집합을 페이징 하는데 적합한 datasource 입니다.
- page 번호나 offset을 이용하여 페이징 합니다.
- 만약에 데이터의 사이즈를 정확하게 모르거나 런타임에만 알 수 있다면 itemsource나 pageKeyedsource를 쓰는것을 추천합니다.