본문 바로가기

안드로이드/Compose Paging3

[안드로이드 Jetpack Compose Paging3 시리즈] Paging3 라이브러리 구조 설명 #2


1. PagingConfig, PagingSource, RemoteMediator 개념

안녕하세요. 오늘은 안드로이드 Jetpack Compose Paging3 라이브러리에서 사용되는 개념인 PagingConfig, PagingSource, RemoteMediator에 대해서 포스팅하겠습니다. Paging3 라이브러리를 사용하면 DB 캐싱 여부를 선택할 수 있는데, DB 캐싱은 제외한 페이징 기능 먼저 구현하고, 추후에 RemoteMediator를 구현해서 DB 캐싱까지 포함된 페이징 처리도 하겠습니다. 먼저, 페이징을 구현하기에 앞서 PagingConfig, PagingSource, RemoteMediator 개념에 대해서 설명하겠습니다.

PagingSource와 PagingData 데이터 흐름도
PagingSource와 PagingData를 사용한 Paging 데이터 흐름도. Database영역이 네트워크로 대체될 수 있다.

1-1. PagingConfig

PagingConfig는 페이징 처리에 필요한 다양한 설정값을 정의합니다. 여기서는 한 페이지에 로드할 데이터의 수(pageSize), 초기 로드 시 가져올 데이터의 수(initialLoadSize), 데이터를 미리 로드할 거리(prefetchDistance) 등을 설정할 수 있습니다.

  • pageSize : PagingSource에서 가져올 데이터의 크기를 정의합니다. 크기를 설정할 때는 대역폭과 UI 크기 등을 고려해서 설정해야 합니다. 예를 들어, 너무 크면 초기 로드 시간이 길어질 수 있으며, 너무 작으면 네트워크 요청이 빈번하게 발생할 수 있습니다.
  • enablePlaceholders : 데이터가 로드되지 않은 위치에 placeholder를 표시할지 여부를 결정합니다.
  • prefetchDistance : 사용자가 얼마나 스크롤을 더 해야 다음 페이지의 데이터를 로드할지를 결정하는 값입니다. 기본값은 pageSize가 설정되어 있으며 스크롤할 때마다 데이터의 로드가 미리 이루어져서 스무스한 스크롤 경험을 제공하기 위해 사용됩니다. 너무 작으면 사용자가 데이터의 끝에 도달하기 전에 로드가 이루어지지 않을 수 있으며, 너무 크면 불필요한 데이터가 미리 로드될 수 있으므로 적절한 값을 넣어주는 게 좋습니다.
  • initialLoadSize : 초기 데이터 로드 시 요청할 아이템의 수를 설정합니다. 기본값은 pageSize * 3입니다.
  • maxSize : Paging3 라이브러리는 불러오는 페이지를 메모리에 유지할 수 있는데, 최적화를 위해서 메모리에 저장되는 항목 수를 제한할 수 있는 옵션입니다. 기본값은 Int.MaxValue(MAX_SIZE_UNBOUNDED)로 되어있어서 모든 데이터가 메모리에 유지되고 있습니다.

1-2. PagingSource

PagingSource는 실제 데이터 소스(로컬 데이터베이스 또는 네트워크 API)로부터 데이터를 불러오는 방법을 정의합니다. 특정 키를 기준으로 데이터를 요청하고, 요청 결과를 PagingData 형태로 변환하여 제공합니다. PagingSource는 데이터 로딩 성공, 실패 여부와 함께 다음 페이지 키를 관리하여 페이징 처리의 핵심 역할을 담당합니다. PagingSource는 추상클래스로 제공되는데 이를 상속해서 구현하게 됩니다.

1-3. RemoteMediator

RemoteMediator를 사용하면 쿼리 결과를 내부 DB에 저장하게 됩니다. RemoteMediator에서는 페이징 된 데이터를 로컬 DB에 저장하는 역할만 하며 UI로 전달하지는 않습니다. UI로 데이터를 전달하는 역할은 PagingSource에서 하게 되며, 캐시 된 DB 데이터를 전달합니다. 즉, RemoteMediator는 네트워크와 로컬 데이터베이스 간의 데이터 동기화를 담당합니다.

2. Paging3 라이브러리 구조 정리

이번 포스팅은 안드로이드 Jetpack Compose Paging3을 사용하기 위한 PagingConfig, PagingSource, RemoteMediator 개념을 정리했습니다.

다음 포스팅에서는 PagingConfig, PagingSource를 활용해서 Pager 객체를 만들고, UI Layer에서 데이터 스트림을 읽어서 무한 스크롤 리스트를 구현할 예정입니다.