오늘 이야기 하는 Tips 은 거의 활용되기 뻘팁이 될 확률이 높고, 그냥 "이렇게도 가능하다" 정도로만 이해해주시면 감사합니다.
해당 프로젝트 주소는 하단에 적어두었습니다.
일반적으로 Domain 은 Pure Java/Kotlin 으로 하는 경우가 많습니다.
따라서 Paging3 를 사용하다보면 도메인에 PagingSource, PagingData 등의 자료구조를 활용하지 못하기 때문에 고민에 빠지게 됩니다.
거의 대부분 아티클을 보면
// alternatively - without Android dependencies for tests
implementation "androidx.paging:paging-common:$paging_version"
를 추가해서 사용해라 라는 이야기가 많습니다.
하지만 오늘은 다른 방법에 대해 이야기 해보려고 합니다.
사용된 프로젝트에서는 Paging3 Local, Remote Paging 이 모두 적용되어, RemoteMediator 와 PagingSource 를 모두 활용하고 있습니다.
먼저 PagingSource 를 사용하는 Remote 의 경우는 처리가 간단합니다.
이전, 이후 페이지 넘버와 데이터를 담는 클래스를 하나 생성하고 매핑 해주면 됩니다.
그리고 RemoteMediator 를 사용하는 Local 의 경우 입니다.
처음에는 도메인에 있어야하는 Repository interface 가 데이터 모듈에 있었습니다.
RemoteMediator 를 사용하면, pagingSourceFactory 에 Local 에 저장되어 있는 데이터를 넘겨주는데 이때, 위의 이미지처럼 PagingSource<Int, PhotoEntity> 로 되어 있어서 PagingSource 와 Entity 의 의존성을 분리하는 것이 어려웠습니다
구글 에서 제공하는 샘플 프로젝트를 봐도, Room, Paging 의 의존성이 그대로 담겨 있었습니다.
Room 의 의존성을 가지는 RedditPost 클래스
결과적으로 getAllPhoto 를 대체할 것이 필요했고, Dao 클래스에서 빌드타임에 생성되는 클래스로 대신할 수 있지 않을까 생각했습니다. 따라서 생성되는 클래스를 직접 만들어서 대체 했습니다.
핵심은 Entity 로 반환되는 객체를 도메인 객체로 매핑하는 것입니다.
결과적으로 PagingSource 와 Room(Entity) 의 의존성을 모두 분리할 수 있었습니다.
친한 친구들과 오랜만에 만나 술 한잔 걸치고 쓰는 글이라, 횡설수설 이해가 가지 않으실 것 같아서, 프로젝트 링크 첨부합니다.
https://github.com/Nanamare/Picsum-photos
'Android > Development Tips' 카테고리의 다른 글
간단 Tips. Lottie 가 Android, iOS, Web, Window 등 에서 다르게 보인다면? (0) | 2022.11.29 |
---|---|
간단 Tips. KotlinxSerialization 를 사용하여 Date 를 파싱하는데 에러가 난다면? (0) | 2022.11.29 |
2.4.1 이상 버전에서 Navigation Component 사용할 때 주의점 (0) | 2022.02.23 |
DataStore Protocol Buffer 사용시 Tips (0) | 2022.02.06 |
알고 계시나요 Fragment 가 복원되는 시점? (1) | 2021.12.12 |