SharedPreference
- 초기화할 때 디스크 IO 에서 UI 스레드를 차단한다.
private val sortOrder: SortOrder
get() {
val order = sharedPreferences.getString(SORT_ORDER_KEY, SortOrder.NONE.name)
return SortOrder.valueOf(order ?: SortOrder.NONE.name)
}
- 데이터를 저장하고, 직접 수정 가능한 MutableStateFlow 를 메모리에 유지하여 값이 변경될 때 알림을 받을 수 있다. 그러나 애플리케이션의 다른 위치에서 값이 수정될 경우, 이러한 변경 사항에 대한 알림을 받지 못한다.
- 한 메서드가 완료되기 전에 다른 한 메서드가 호출되면 최종값이 잘못 생성된다. 또한 이러한 메서드는 UI 스레드에서 호출될 때 UI 버벅거림 및 엄격 모드 위반을 일으킬 수 있다.
- UI 스레드에서 호출하기에 안전해 보일 수 있지만, 실제로는 동기 API 를 통해 디스크 I/O 작업을 수행한다. 또한, apply() 메서드는 fsync() 호출로 인해 UI 스레드를 차단할 수 있다.
- 대기 중인 fsync() 호출은 서비스가 시작되거나 중지될 때마다, 그리고 애플리케이션에서 Activity 가 시작되거나 중지될 때마다 트리거된다.
- UI 스레드는 apply() 에서 예약한 대기 중인 fsync() 호출에서 차단되며 주로 ANR 의 소스가 된다.
- Strong Consistency 가 보장되는 api 가 없어 다중 스레드 환경에서 다른 결과값이 생길 수 있다.
- type safety 가 보장되지 않아 어떤 데이터가 저장되고 추출되는지를 일일히 데이터로 type converting(형 변환) 해주어야 한다.
- 파싱 오류를 런타임 예외로 발생시킨다.
DataStore
- Kotlin 코루틴과 Flow 를 기반으로 한 Datastore
- 타입 객체를 저장하는 *Proto Datastore 및 키-값 쌍을 저장하는 *Preferences Datastore 를 제공한다.
- Preferences Datastore : SharedPreferences 와 마찬가지로 스키마를 먼저 정의하지 않은 상태에서 키를 기반으로 데이터에 액세스한다. Type Safety 을 제공하지 않아 데이터 저장소에서 꺼낸 데이터에 대해 타입을 잘못 지정한다면 오류가 발생할 수 있다.
- Proto Datastore : 프로토콜 버퍼를 사용하여 스키마를 정의한다. Protobuf 를 사용하기 때문에 강타입(strongly typed) 데이터를 유지할 수 있다. 이러한 데이터는 XML 등 다른 유사한 데이터 형식보다 빠르고 작고 간결하며 덜 모호하다. Proto Datastore 를 사용하려면 새로운 직렬화 메커니즘을 배워야 하지만 Proto Datastore 의 강타입 이점이 그만한 가치가 있다.
- Coroutine 의 IO Dispatcher 을 사용해 IO 를 담당하는 스레드풀에서 데이터를 조작하도록 강제했다. 이 때문에 Datastore 에서는 IOException 이 발생할 수 있다.
- Strong Consistency 가 보장되는 Transaction API 를 제공한다.
- 데이터의 현재 상태를 나타내는 Flow 를 노출하고, 변경 가능한 참조를 내부 상태에 반환하지 않는다.
- 타입 키가 있는 Map 및 MutableMap 과 유사한 API 를 제공한다.
[Android Datastore] 1. Datastore을 사용해야 하는 이유 : SharedPreferences는 왜 대체되어야 하는가?
SharedPreferences의 한계점 Datastore가 나오기 전까지 안드로이드에서는 가벼운 데이터를 key-value 쌍으로 저장하기 위해 SharedPreferences를 사용했다. SharedPreference는 다양한 한계점이 있었다. SharedPreferenc
kotlinworld.com
[Android] Why DataStore? (부제 : Good-bye SharedPreferences)
개요 안드로이드 개발을 하다보면, 간단한 데이터에 대해 로컬에 저장하고 사용하고자 하는 니즈를 자주 마주하게 됩니다. 그럴 때마다 그동안에는 SharedPreferences 라는 라이브러리를 사용해왔는
readystory.tistory.com
앱 아키텍처: 데이터 영역 - Datastore - Android 개발자 | Android Developers
데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.
developer.android.com
Preferences Datastore를 사용하여 작업하기 | Android Developers
이 Codelab에서는 샘플 앱을 수정하여 SharedPreferences를 대체하는 새로운 향상된 데이터 저장소 솔루션인 Jetpack Preferences Datastore를 통합합니다.
developer.android.com
GitHub - android/codelab-android-datastore
Contribute to android/codelab-android-datastore development by creating an account on GitHub.
github.com
'안드로이드 > Android' 카테고리의 다른 글
[Android] Memory Cache와 Disk Cache (0) | 2024.11.08 |
---|---|
[Android] 직렬화(Serialization, Parcelable), 역직렬화(Deserialization) (0) | 2024.10.27 |
[Android] Strong, Soft, Weak, Phantom Reference (0) | 2024.10.21 |