오프라인 캐시를 구현해서 네트워크가 아닌 데이터베이스에서 데이터를 가져와서 보여줄 수 있다.
그 결과, 사용자들은 기기가 오프라인 상태일 때에도 앱을 사용할 수 있다.
오프라인 캐시를 구현하기 위해서 Android에서는 Room
을 사용하여 데이터를 기기의 로컬 데이터베이스에 영구적으로 저장한다.
그리고 Room
데이터베이스는 레포지터리 패턴을 이용하여 접근하고 관리한다.
Retrofit은 안드로이드에서 type-safe한 REST 클라이언트를 구현하는데 사용되는 네트워킹 라이브러리이다.
Retrofit이 네트워킹 결과를 로컬에 저장해놓도록 설정할 수 있다.
사용할 때: 단순한 요청 혹은 응답, 자주 일어나지 않는 네트워크 호출, 작은 데이터 집합을 캐싱할 때 사용하면 좋다.
key, value 쌍 형태의 데이터를 저장하기 위해 SharPreferences를 사용할 수 있다.
사용할 때: 적은 양의 key, value 쌍이며, value가 단순한 형태일 경우 사용하면 좋다.
(왜냐하면, SharedPreferences의 value로는 primitve data type 만 저장할 수 있기 때문이다.)
따라서 많은 양의 구조화된 데이터를 저장할 때는 사용할 수 없다.
앱의 내부 저장소에 접근하여 데이터를 파일로 저장할 수 있다.
우리 앱의 패키지 이름이 앱의 내부 저장소 디렉토리 이름을 나타낸다. 안드로이드 파일 시스템에서 우리 앱만 접근할 수 있는 아주 특별한 장소이다.
또한 앱이 삭제되면, 내부 저장소도 같이 삭제된다.
사용할 때: 파일 시스템이 해결해야만 할 때, 예를 들어서 미디어 파일이나 데이터파일을 저장해야 하며, 그 파일을 우리가 다뤄야만 할 때, 사용하면 좋다.
복잡하고 구조화된 데이터를 저장할 때 이 방법을 사용할 수 없다.
Room
Room
을 이용하여 캐싱하기DAO
에서 데이터를 가져오는 메서드의 경우 타입을 LiveData로 하면 데이터베이스의 데이터가 변할 때마다, UI가 변하도록 할 수 있다.fun getDatabase(context: Context): VideosDatabase {
synchronized(VideosDatabase::class.java) {
if (!::INSTANCE.isInitialized) {
INSTANCE = Room.databaseBuilder(context.applicationContext,
VideosDatabase::class.java,
"videos").build()
}
}
return INSTANCE
}
.isIntialized
코틀린 프로퍼티을 사용했다.
isInitialized
프로퍼티는 lateinit
프로퍼티가 값이 할당되었으면 true
를 반환하고 그렇지 않으면 false
를 반환한다.Repository 패턴에서는 Repository가 데이터 소스(지속성 모델, 웹 서비스, 캐시)와 앱의 나머지를 중개한다.
LiveData
를 사용하는 Activity
와 같은 앱의 구성요소가 repository를 통해서 앱의 데이터 소스와 통신하는 방식을 보여준다.withConext(Dispatcher.IO){...}
를 실행하면, 디스크 디스패처는 블락킹 IO작업을 공유 스레드 풀로 넘긴다.