Domain 모듈에서 Paging, Room(RemoteMediator) 라이브러리 의존성 해결하기
오늘 이야기 하는 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