그동안 당연하게 써 온 Repository 패턴인데 이론적으로 잘못 이해하고 있었다.
추상화해서 갈아끼우기 좋은 구조로 만들고 계층간 분리하는 것까지 Repository 패턴인 줄 알았는데 아니었다.
따라서 오늘은 안드로이드 공식문서에서 말하는 Repository 패턴에 대해서 확실히 알고 넘어가자.
Repository
저장소 패턴은 데이터 레이어를 앱의 나머지 부분에서 분리하는 디자인 패턴 이다.
데이터 레이어는 UI 와는 별도로 앱의 데이터와 비즈니스 로직을 처리하는 부분이다.
Repository 는 앱의 나머지 layer 에서 이 데이터에 액세스할 수 있도록 일관된 API를 노출한다.
데이터 레이어에는 네트워킹 코드, Room 데이터베이스, 오류 처리, 데이터를 읽거나 조작하는 코드 등이 포함.
즉, 데이터를 관리하는 모든 관심사를 Data Layer 로 분리하고 다른 레이어는 Repository 의 API 를 통해 액세스하는 것이다.
Repository는 Data Source(예: 영구 모델, 웹 서비스, 캐시) 간의 충돌을 해결하고 이 데이터의 변경사항을 집중할 수 있다.
그럼 액티비티와 같은 앱 컴포넌트가 Repository 와 어떻게 상호작용할까?
Repository 를 구현하려면 VideosRepository, UserRepository 등 클래스로 분리하면 된다.
이 클래스는 앱의 나머지 layer 에서 데이터 관리 책임을 분리하고 데이터 엑세스를 위해 깔끔한 API 를 제공해야한다.
위 그림에서 처럼 ViewModel 클래스는 Repository 를 통해서만 데이터 엑세스가 가능해진다.
Repository 사용의 이점
Repository module 은 데이터 작업을 처리하고 여러 Backend 사용을 허용한다.
네트워크에서 데이터를 가져올지, 로컬에서 캐시된 결과를 가져올지 결정하는 로직을 구현한다.
이 Repository 를 사용하면 ViewModel 코드에 영향을 주지 않고 다른 지속성 라이브러리로의 이전과 같은 구현 세부정보를 교체할 수 있다.
코드의 모듈화, 테스트 가능성을 높이는데 도움이 된다. 쉽게 Repository 를 목킹하던가 Fake 객체로 만들어 테스트하기 쉬워진다.
Repository 는 앱 데이터의 특정 부분에 대해 single source of truth(SSOT) 를 지켜야한다.
https://en.wikipedia.org/wiki/Single_source_of_truth
remote, local 등 여러 Data Source 로 작업할 때 Repository 는 데이터가 최대한 정확하고 최신 상태로 유지되도록 하므로 앱이 오프라인 상태일 때도 최상의 환경을 제공한다.
캐싱
앱에서 사용하는 데이터 저장소 "캐시"
사용자의 인터넷 연결이 끊기는 경우, 데이터를 일시적으로 사용할 수 있다.
네트워크를 더 이상 사용하지 못하더라도 캐시된 데이터로 대체할 수 있다.
필자의 생각 : 이는 사용자에게 더 나은 경험을 제공할 수 있지만 실시간으로 유효해야하는 데이터라면 캐싱하지 않는 것이 더 좋은 방법이 아닐까?
필자 역시 Room 과 DataStore 를 많이 사용한다.
Flow 와 연계하면 효율적으로 개발이 가능하기 때문이다.
결론
Repository 패턴: 데이터 레이어를 앱의 나머지 부분에서 분리하는 디자인 패턴 이다.
Repository 는 데이터와 관련된 비즈니스 로직을 처리하며 나머지 layer 에게 데이터 엑세스 API 를 제공해야 한다.
다른 layer 의 코드를 변경하지 않고 네트워크 에서 가져올지 로컬에서 가져올지 결정하며 구현 세부 정보를 교체가능하다.
이는 Repository 를 추상화한다는 얘기가 아니라 캡슐화라고 보는게 맞다.
모듈화, 테스트 용이성을 높여주며 앱 최상의 환경을 구성하는데 용이하다.
마무리
당연하게 사용했던 Repository 패턴에 대해 제대로 개념을 잡을 수 있는 시간이었다.
공부하다가 알게된 사실인데 안드로이드에서 얘기하는 Repository 가 다른(DDD 등) 곳에서 얘기하는 Repository 랑 조금 다른 것 같다.
익숙하다고 당연하게 사용하지 말고 확실히 알고 쓰자!
https://developer.android.com/codelabs/basic-android-kotlin-training-repository-pattern#3
'Android' 카테고리의 다른 글
[안드로이드] DataStore 이해하기 (0) | 2024.01.08 |
---|---|
RecyclerView 목록 스크롤에 CoordinatorLayout 적용하기 (0) | 2023.11.17 |
뷰가 그려지는 과정(View Lifecycle) 이해하기 : [우아한테크코스 5기 AN_베르] (0) | 2023.10.22 |
[안드로이드] LiveData 를 Flow 로 Refactoring 하기 (0) | 2023.09.20 |
Reflection [우아한테크코스 5기 AN_베르] (0) | 2023.09.10 |