SW 공부노트

저장소 패턴(Repository pattern) 본문

안드로이드/안드로이드 공부

저장소 패턴(Repository pattern)

요빈 2023. 4. 5. 16:57

저장소 패턴데이터의 출처에 관계 없이 동일한 인터페이스로 데이터에 접근할 수 있도록 하는 패턴이다.

즉, 데이터소스(DataSource)를 캡슐화 시킨다.

 

위 이미지를 통해 쉽게 이해할 수 있다.

ViewModel에서 직접 데이터를 가져오는 것이 아니라 Repository에 접근해 데이터를 받아오는 것이다.

Repository에서 Remote Data인지, Loval Data인지 필요한 데이터를 가져와 ViewModel에 전달해준다.

 

즉, Data Layer가 캡슐화되고 ViewModel이 포함된 Presentation Layer에서 직접 Data Layer를 호출하지 않고, Repository를 통해서만 접근이 가능하게 되는 것이다.

* Data Layer = 리포지터리 + 데이터 소스

 

Data Layer를 캡슐화하는 것이 저장소 패턴의 주된 목적이며, 캡슐화를 통해 얻을 수 있는 장점은 다음과 같다.

  • Data Layer에 대한 의존성을 줄일 수 있다.
  • Presentation Layer에서 Data Layer에 직접 접근하지 않으므로 새로운 데이터 추가가 쉽다.
  • Presentation Layer에서는 Repository에 데이터 요청만 하면 되므로, 일관된 인터페이스로 데이터를 요청할 수 있다.
  • Unit Test를 통한 검증이 쉬워진다.

하지만 관리가 필요한 코드와 파일들이 증가한다는 단점이 존재한다.

 

* 저장소 패턴은 ViewModel에서 Data를 호출할 때 사용된다.


 

저장소(Repository)

 

리포지터리 클래스는 여러 데이터 소스(local, remote) 액세스를 추상화한다.

리포지터리는 코드 분리와 아키텍처를 위한 권장사항이다. 

리포지터리 클래스는 나머지 애플리케이션의 데이터에 액세스 하기 위한 깔끔한 API를 제공한다.

 

리포지터리를 사용하는 이유는?

 

리포지터리는 쿼리를 관리하고 여러 백엔드를 사용하도록 허용한다. 가장 일반적인 리포지터리는 데이터를 네트워크에서 가져올지, 로컬 데이터베이스에 캐시된 결과를 사용할 지 결정하는 로직을 구현한다.

 저장소를 사용하면 뷰 모델과 같은 호출 코드에 영향을 주지 않고 다른 지속성 라이브러리로의 이전과 같은 구현 세부정보를 교체할 수 있습니다. 이는 코드를 모듈식으로, 테스트 가능하게 만드는 데도 도움이 됩니다.
쉽게 저장소를 모의 처리하고 코드의 나머지 부분을 테스트할 수 있습니다. 저장소는 앱 데이터의 특정 부분에 관한 단일 정보 소스 역할을 해야 합니다. 네트워크 리소스와 오프라인 캐시 등 여러 데이터 소스로 작업할 때 저장소는 앱의 데이터가 최대한 정확하고 최신 상태로 유지되도록 하므로 앱이 오프라인 상태일 때도 최상의 환경을 제공합니다.
캐시란 앱에서 사용하는 데이터 저장소를 나타냅니다. 예를 들어 사용자의 인터넷 연결이 끊기는 경우 네트워크의 데이터를 일시적으로 저장할 수 있습니다. 네트워크를 더 이상 사용할 수 없더라도 앱은 여전히 캐시된 데이터로 대체할 수 있습니다. 캐시는 더 이상 화면에 표시되지 않는 활동의 임시 데이터를 저장하거나 앱 실행 사이에 데이터를 유지하는 데도 유용할 수 있습니다.  캐싱 구현 예시로는 Retrofit, DataStore, 앱 내부 저장소 디렉터리, Room 등이 있습니다.

캐싱네트워크에서 가져온 데이터를 기기의 저장소에 저장하는 프로세스입니다. 캐싱을 사용하면 기기가 오프라인 상태일 때 또는 앱이 같은 데이터에 다시 액세스해야 하는 경우 앱에서 데이터에 액세스할 수 있습니다.

 

핵심은 다음과 같다.

  • DAO는 전체 데이터베이스가 아닌 저장소 생성자에 전달된다. DAO에 데이터베이스의 모든 읽기/쓰기 메서드가 포함되어 있기 때문에 전체 데이터베이스를 저장소에 노출할 필요가 없다.
  • Room은 기본 스레드 밖에서 suspend 쿼리를 실행한다.

 

Reference

https://developer.android.com/codelabs/android-room-with-a-view-kotlin?hl=ko#8 

 

뷰를 사용한 Android Room - Kotlin  |  Android 개발자  |  Android Developers

이 Codelab에서는 Kotlin 코루틴과 함께 Android 아키텍처 구성요소(RoomDatabase, Entity, DAO, AndroidViewModel, LiveData)를 사용하는 Android 앱을 Kotlin으로 빌드합니다. 이 샘플 앱은 단어 목록을 Room 데이터베이스

developer.android.com

https://developer.android.com/codelabs/basic-android-kotlin-training-repository-pattern?hl=ko&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-5-pathway-2%3Fhl%3Dko%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-repository-pattern#3 

 

저장소 패턴  |  Android Developers

저장소 패턴을 사용하여 기존 앱에서 캐싱을 구현합니다.

developer.android.com