본문 바로가기

Android

[Android] Paging3 Library in Jetpack

사진은 그냥 여행하면서 찍었던,,, 코로롱 끝나라,,,

 

Paging3란?

 

Jetpack의 라이브러리 중 하나로 다양한 데이터 소스로 부터 데이터를 나누어 효과적으로 로딩해준다.

네트워크 또는 로컬 데이터베이스에서 데이터 페이지를 쉽게 로드할 수 있다.

Paging3의 강력한 장점은 Coroutines 뿐만 LiveData, RxJava를 최고수준으로 지원한다.

 

Paging3의 주요 클래스에 대해서 알아보자!

 

1️⃣ Paging Source

- 네트워크 또는 데이터베이스에서 페이징된 데이터 로드를 담당하는 추상 클래스이다.

- 이 클래스를 구현하려면 페이지 키 타입을 정의해야한다.

- PagingSource에서 로드된 데이터는 PagingData 인스턴스로 관리된다.

- 데이터를 검색하는 방법을 정의한다.

 

PagingDatasource에는 크게

1) PositionalDataSource, 2) ItemKeyedDataSource, 3) PageKeyedDataSource가 있다.

 

✔ PositionalDataSource

- 말 그대로 position based data loader이다.

- 셀 수 있는고정된 사이즈를 갖는 데이터를 페이징하는데 적합하다. 만약 데이터의 사이즈를 정확히 모르거나 런타임에만 알 수 있다면 적합하지 않다.

 

ItemKeyedDataSource

가장 일반적인 케이스이다. ItemKeyedDataSource는 서버나 데이터베이스로부터 해당 기준된 Key로부터 데이터를 로드시켜 페이징을 할 수 있게 도와준다.

 

 PageKeyedDataSource

ItemKeyedDataSource가 하나의 아이템키에 대한 기준으로 데이터를 가져왔다면, PageKeyedDataSource는 페이지키 단위로 데이터를 불러들인다. 단 데이터베이스로부터 다음페이지와 이전페이지를 받아야한다.

 

2️⃣ RemoteMediator

- 네트워크 및 로컬DB에서 페이징 데이터를 로드하는 역할을 한다.

 

3️⃣ Pager

- PagingSource 객체 및 PagingConfig 구성 객체를 바탕으로 반응형 스트림에 노출되는 PagingData를 발행한다.

- 각 PagingData는 페이징 된 데이터 스냅샷을 나타내며, Pager로부터 Flow, Observable, LiveData 형태로 반환된다.

 

4️⃣ Paging Data

- 페이징된 데이터를 담아두는 역할을 한다. 최종적으로 반환되는 데이터 타입이며, PagingDataAdapter가 이를 전달받는다.

 

5️⃣ PagingConfig

- Pager 객체를 생성하는데 필요한 필수요소로, 페이징에 관한 설정을 담당한다.

- 페이징하는 데이터 크기 및 PlaceHolder사용유무등 PagingSource를 구성하는 방법을 정의한다.

 

6️⃣ PagingDataAdapter

- 주된 UI구성요소로 Recyclerview에 데이터를 나타내는 책임을 갖는다.

- 또한 PagingData를 입력받아 내부적으로 언제 데이터를 추가적으로 Load할지 관찰한다.

- 백그라운드에서 DiffUtil을 사용하여 데이터를 정제한 뒤에 데이터를 불러오기 때문에 최종적으로 UI Thread에서 새로운 아이템들을 추가할 때 부드럽게 나타난다.

 

 

다음에는 Paging을 이용하여 로컬 이미지파일을 읽어온 후 uri를 띄워주어 갤러리를 만들어볼 예정이다.