[Android] Paging 사용 시 Domain Layer 에서 Android 의존성 피하기

D.O·2024년 6월 4일
2

Why?

클린 아키택처 적용 시 일반적으로 책임에 따라 3가지 레이어로 구분합니다.

presentation layer, domain layer, data layer
이렇게 3개의 레이어로 구분하는데요

더 자세히 알고 싶으신 분은 아키택처 관련해서 제가 작성한 아래 글을 참고해주세요
[Android] 아키택처, 디자인 패턴

일반적으로 Android에서는 Domain Layer를 작성할 때 Android 종속성 없이 순수 코틀린 언어으로 작성하라고 합니다.

왜 Android 종속성이 없어야 할까요?

찾아본 결과로 정리를 해보자면 플랫폼 독립성을 통한 재사용성이 가장 큰 이유로 생각이 되었습니다. 좀 더 자세히 설명해보자면

도메인 레이어는 애플리케이션의 UseCase, Entity 등을 정의하는 곳이며 이는 시스템의 핵심 비즈니스 로직을 구현하는 것입니다.
이 로직을 특정 플랫폼에 종속되지 않게 구현한다면, 동일한 비즈니스 로직을 다른 플랫폼(ios,웹 등)에서도 재사용 할 수 있습니다. 최근에 KMP(Kotlin Multiplatform)에 대해 많은 사람들이 관심을 가지고 있는데 이러한 멀티플랫폼을 구축할 때도 비즈니스 로직이 특정 플랫폼에 종속적이지 않게 구현한다면 재사용에서 큰 이점을 가져갈 수 있겠죠

또 다른 제 생각을 포함해서 이유를 좀 더 추가해보자면 Domain Layer는 Presentation Layer와 Data Layer가 둘다 알고 있습니다. Domain Layer라는 중간다리를 통해 두 레이어는 서로를 알지 못하면서도 소통할 수 있는데요.

Domain을 제외한 두 레이어가 Domain을 알고 있다는건 어떤 의미를 가지고 있을까요?
Domain이 변경된다면 두 레이어에도 영향이 있는지 체크해야하는 Cost가 존재 할 수 있다는 것입니다.

흠 그렇다면 Domain은 변경이 적게 구성하는게 좋을 것 같다는 생각이 들지 않나요?
그런데 특정 플랫폼에 종속적이라는 것은 그 플랫폼에 영향을 받을 수 있다는 것을 의미하고 변경 가능성이 좀 더 높아진다라고도 미래에 예측해볼수도 있을 것 같습니다.

이전에도 말했지만 좋은 아키택처는 미래의 문제에 대해 유연하게 대처할 수 있게 미리 설계를 된 것이고 그래야 좀 더 의미 있어진다고 했습니다. 따라서 특정 플랫폼에 종속적이지 않게 만드는게 잘 "설계"했다라고 말할 수 있겠죠

Paging Issue

최근에 진행 중인 프로젝트에서 저희 팀은 Domain에 UseCase를 통해 비즈니스 로직을 정의하기로 했습니다.

하지만 특정 부분에서는 Paging 단위로 데이터를 로드하는 부분의 로직 정의가 필요했고 이는 결국 PagingData 데이터 컨테이너가 필요함을 의미하는데요 이는 Paging 라이브러리를 필요로하고 이는 결국 Android 종속성을 필요로 하게 됩니다.

How?

스택오버플로에 관련해서 고민하는 글과 이를 해결하는 답변을 발견했습니다.

안드로이드 Paging 라이브러리에서는, RecyclerView나 LazyColumn과 같이 안드로이드에 특화된 UI 컴포넌트 관련 코드는 안드로이드에 종속적인 반면,PagingSource, PagingData, Pager, RemoteMediator와 같은 컴포넌트들은 androidx.paging:paging-common에 포함되어 있어 플랫폼에 독립적이라고 합니다.

공식문서에 Paging 설정 부분을 보면 // alternatively - without Android dependencies for tests 로 표시되서 안드로이드에 종속적이지 않다고합니다.

공식문서에서는 테스트를 위한 것이라 주석이 되어있습니다. 저희는 클린 아키택처의 룰을 따르기 위해 testImplementation이 아닌 implementation을 사용하면 됩니다.

저희는 이것을 도메인 build.gradle에 추가함으로써 Paging 관련한 컴포넌트를 이용하되 Android에 종속적이지 않게 가져갈 수 있는 것입니다.


질문 및 피드백은 언제든 환영입니다.
감사합니다.

profile
Android Developer

0개의 댓글