[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 구현하기 #9

2024. 2. 27. 11:30·안드로이드/Compose Paging3
반응형

1. RemoteMediator 구현하기

안녕하세요. 지난 포스팅에서는 안드로이드 Jetpack Compose Paging3 라이브러리를 사용할 때 로컬 데이터베이스와 상호작용하기 위한 Local Data Source를 구현했습니다.

이번 포스팅에서는 네트워크를 통해 가져온 데이터를 로컬 데이터베이스에 저장하기 위해 RemoteMediator를 구현하겠습니다.

MovieLocalDataSource와 MovieRemoteMediator를 추가한 모습
MovieLocalDataSource와 MovieRemoteMediator를 추가한 모습

2. RemoteMediator란?

RemoteMediator는 안드로이드 Jetpack Compose의 Paging3 라이브러리의 핵심 컴포넌트 중 하나로, 네트워크와 로컬 데이터베이스 간의 데이터 동기화를 담당합니다. 네트워크에서 데이터를 가져온 후 로컬 데이터베이스에 저장하고, 이 데이터를 PagingSource를 통해 UI에 제공하는 역할을 합니다. RemoteMediator를 사용함으로써, 앱은 네트워크 연결 상태에 관계없이 지속적으로 데이터를 제공할 수 있으며, 데이터의 캐싱과 동기화를 효율적으로 관리할 수 있습니다.

2-1. RemoteMediator 생성

네트워크와 로컬 데이터베이스의 동기화를 진행하기 위해서 RemoteMediator를 만들겠습니다. 네트워크를 통해 가져온 데이터를 로컬 데이터베이스에 저장하기 위해서 지난 포스팅에서 구현한 LocalDataSource를 사용합니다. 아래 코드는 RemoteMediator 추상 클래스를 구현한 MovieRemoteMediator입니다. 스크롤 상태에 따라 page 정보를 얻어오고 있으며, page 정보를 이용하여 네트워크 통신을 하고 있습니다. 그 후, local.saveMovies() 함수의 호출을 통해 로컬 데이터베이스에 데이터를 저장합니다. 

 

// MovieRemoteMediator.kt

private const val MOVIE_START_PAGE_INDEX = 1

@OptIn(ExperimentalPagingApi::class)
class MovieRemoteMediator(
    private val local: MovieDataSource.Local,
    private val remote: MovieDataSource.Remote
) : RemoteMediator<Int, MovieDbData>() {
    
    override suspend fun load(loadType: LoadType, state: PagingState<Int, MovieDbData>): MediatorResult {
        val page = when (loadType) {
            LoadType.REFRESH -> MOVIE_START_PAGE_INDEX
            LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true)
            LoadType.APPEND -> local.getLastRemoteKey()?.nextPage ?: return MediatorResult.Success(endOfPaginationReached = true)
        }

        remote.getMovies(page, state.config.pageSize).getResult({ successResult ->
            if (loadType == LoadType.REFRESH) {
                local.clearMovies()
                local.clearRemoteKeys()
            }

            val movies = successResult.data

            val endOfPaginationReached = movies.isEmpty()

            val prevPage = if (page == MOVIE_START_PAGE_INDEX) null else page - 1
            val nextPage = if (endOfPaginationReached) null else page + 1

            val key = MovieRemoteKeyDbData(prevPage = prevPage, nextPage = nextPage)

            local.saveMovies(movies)
            local.saveRemoteKey(key)

            return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached)
        }, { errorResult ->
            return MediatorResult.Error(errorResult.error)
        })
    }
}

3. RemoteMediator 적용 정리

이번 포스팅에서는 LocalDataSource와 RemoteMediator를 구현했습니다. 이제 Pager 객체에 RemoteMediator와 PagingSource만 제공하면 Paging3 라이브러리가 자동으로 페이징 데이터를 전달합니다.

다음 포스팅에서는 Paging3 라이브러리에서 제공하는 RemoteMediator에 있는 LoadType.REFRESH, LoadType.PREPEND, LoadType.APPEND, MediatorResult 등에 대해 설명하겠습니다.

저작자표시 비영리 변경금지 (새창열림)

'안드로이드 > Compose Paging3' 카테고리의 다른 글

[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 적용하기 #11  (0) 2024.02.29
[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 코드 설명 #10  (0) 2024.02.28
[안드로이드 Jetpack Compose Paging3 시리즈] Local Data Source 생성하기 #8  (0) 2024.02.26
[안드로이드 Jetpack Compose Paging3 시리즈] Room Database 세팅하기 #7  (0) 2024.02.25
[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 파헤치기 #6  (0) 2024.02.24
'안드로이드/Compose Paging3' 카테고리의 다른 글
  • [안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 적용하기 #11
  • [안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 코드 설명 #10
  • [안드로이드 Jetpack Compose Paging3 시리즈] Local Data Source 생성하기 #8
  • [안드로이드 Jetpack Compose Paging3 시리즈] Room Database 세팅하기 #7
코딩덕
코딩덕
안드로이드, 리액트 등의 개발 노하우와 최신 AI 기술을 다루는 기술 블로그입니다. 실무 중심의 경험을 바탕으로 마주한 문제와 해결 과정을 체계적으로 기록하며, 개발자에게 실질적으로 도움 되는 프로그래밍 팁과 인사이트를 쉽고 명확하게 공유하고자 합니다.
  • 코딩덕
    개발자가 들려주는 IT 이야기
    코딩덕
  • 전체
    오늘
    어제
    • 분류 전체보기 (66)
      • 안드로이드 (62)
        • 멀티 모듈 (11)
        • 클린 아키텍처 (11)
        • 트러블 슈팅 (5)
        • 코틀린 (3)
        • 코루틴 (2)
        • Compose (1)
        • Compose UI (6)
        • Compose Dialog (8)
        • Compose Paging3 (11)
        • Compose State (2)
        • Util (1)
      • Github (3)
        • PR Template (2)
        • AI Code Review (1)
      • 리액트 (1)
        • NextJs (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    paging3
    트러블슈팅
    OnBackPressedDispatcher
    멀티 모듈
    LazyRow
    Gradle
    pager
    pr template
    enum class
    flow
    MutableState
    데이터 레이어
    안드로이드
    Github
    UI Layer
    ViewModel
    ScrollView
    sealed class
    Dialog
    jsonadapter
    코루틴
    Clean Architecture
    recyclerview
    dynamic json
    Usecase
    ai code review
    multi module
    Jetpack Compose
    코틀린
    클린 아키텍처
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩덕
[안드로이드 Jetpack Compose Paging3 시리즈] RemoteMediator 구현하기 #9
상단으로

티스토리툴바