본문 바로가기

안드로이드/Compose Paging3

[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 코드 설명 #10


1. RemoteMediator 코드 분석을 하는 이유

안녕하세요. 지난 포스팅에서는 안드로이드 Jetpack Compose Paging3 라이브러리를 사용하기 위해서 LocalDataSource와 RemoteMediator를 구현했습니다. 해당 라이브러리의 정확한 원리를 이해해야 응용력도 생기고 개발자로서의 성장에도 도움이 되기 때문에 이번 포스팅에서는 RemoteMediator의 코드를 분석하겠습니다.

RemoteMediator를 상속받아서 구현한 MovieRemoteMediator 코드
RemoteMediator를 상속받아서 구현한 MovieRemoteMediator

2. RemoteMediator의 LoadType, MediatorResult 정리

안드로이드 Jetpack Compose Paging3의 RemoteMediator를 사용하려면 RemoteMediator라는 추상클래스를 상속받아서 구현하게 됩니다. 해당 클래스에서는 LoadType, PagingState를 제공해 주고 MediatorResult를 반환해야만 하는데 각각의 기능과 역할에 대해서 알아보겠습니다.


2-1. RemoteMediator LoadType의 세 가지 상태

LoadType은 스크롤을 할 때 페이지가 어떤 상태인지 알려주는 역할을 합니다. LoadType에서는 세 가지 상태가 있는데 각각의 상태에 따른 적절한 처리를 해줘야 합니다. 사용자가 맨 위로 스크롤을 한다면 LoadType은 PREPEND가 될 것이고, 맨 아래로 스크롤을 했다면 APPEND가 되는 형태입니다.

2-1-1. LoadType.REFRESH

사용자에 의한 새로고침 또는 PagingSource의 무효화가 발생했을 때 LoadType.REFRESH가 전달됩니다. 이 상태에서는 페이지를 다시 로드해야 하므로 페이지의 첫 번째를 뜻하는 '1' 값을 반환했습니다.

2-1-2. LoadType.PREPEND

첫 번째 페이지 데이터로 스크롤했을 때 LoadType.PREPEND가 전달됩니다. 현재 로드된 데이터의 앞쪽에 데이터를 추가하는 작업을 나타냅니다. 이번 프로젝트에서 구현하는 페이징 시스템은 아래에만 데이터가 붙는 형태이기 때문에 MediatorResult.Success(endOfPaginationReached=true)를 반환해서 별다른 작업을 하지 않아도 됩니다.

2-1-3. LoadType.APPEND

마지막 페이지 데이터로 스크롤했을 때 LoadType.APPEND가 전달됩니다. 현재 로드된 데이터의 뒤쪽에 데이터를 추가하는 작업을 나타냅니다. 다음 페이지가 있으면 다음 페이지 값을 반환하고, 없으면 MediatorResult.Success(endOfPaginationReached=true)를 반환해서 작업을 종료합니다.


2-2. PagingState에 저장된 정보

PagingState는 RemoteMediator의 load 함수에 전달되는 매개변수 중 하나로, 현재 Paging 상태에 대한 정보를 포함합니다. 

2-2-1. anchorPosition

사용자가 보고 있는 항목의 위치를 나타내며, 이 위치를 기준으로 데이터 로드를 시작할 페이지를 계산할 수 있습니다.

2-2-2. closestPageToPosition

주어진 위치에 가장 가까운 페이지 정보를 반환합니다. 이를 통해 이전 또는 다음 페이지의 키를 알아낼 수 있으며, 특히 PREPEND 또는 APPEND 작업 시 다음에 로드할 페이지 번호를 결정하는 데 유용합니다.

2-2-3. config

Pager 객체게 전달한 PagingConfig 설정에 대한 정보를 제공합니다. 페이지 크기(pageSize), 프리페치 거리(prefetchDistance), 초기 로드 크기(initialLoadSize) 등이 포함되고, 네트워크 요청 시 요청할 데이터의 양을 해당 정보를 이용해서 설정할 수 있습니다.


2-3. MediatorResult의 두 가지 결과

RemoteMediator를 구현할 때 데이터 로드의 성공, 실패 여부에 대해 반환해주어야 합니다. MediatorResult는 Sealed class로 Success와 Error라는 2가지 상태가 있는데 적절하게 반환하면 됩니다.

2-3-1. MediatorResult.Success

데이터 로드 작업이 성공적으로 완료되었음을 나타냅니다. endOfPaginationReached 속성을 통해 더 이상 로드할 데이터가 없음을 알릴 수 있습니다. 모든 데이터를 로드했거나, 페이징의 끝에 도달했을 때 true로 전달해서 MediatorResult.Success를 반환하면 됩니다.

2-3-2. MediatorResult.Error

데이터 로드 작업 중 오류가 발생했음을 나타냅니다. 이 경우, 예외 객체를 전달하여 어떤 오류가 발생했는지 알릴 수 있습니다.


3. RemoteMediator 코드 분석 정리

이번 포스팅에서는 안드로이드 Jetpack Compose Paging3 라이브러리에서 제공하는 RemoteMediator의 코드 분석을 통해 데이터 페이징 처리의 세밀한 조정과 응용이 가능해진다고 생각해서 코드를 분석하고 정리했습니다.

특히, 네트워크와 로컬 데이터베이스 간의 동기화를 효과적으로 관리함으로써, 오프라인 지원이 가능한 더욱 견고한 앱을 만들 수 있습니다.

RemoteMediator와 PagingSource를 Pager 객체에 전달하고, 데이터가 UI에 보이는 모습까지 확인하겠습니다.

반응형