안드로이드 Jetpack Compose 를 적용하여 프로젝트를 진행중이다.
개발 진행 도중, SharedPreferences에 대해 검색하다 Jetpack Datastore 에 대해 알게 되었다.
안드로이드 개발자 사이트 내용 중 아래 문구가 눈에 확 와닿았다...^^;;
현재 SharedPreferences를 사용하여 데이터를 저장하고 있다면 대신 Datastore로 이전하는 것이 좋습니다.
그래서, SharedPreferences 와 Jetpack Datastore에 대해 알아보고,
Jetpack Datastore를 진행중인 프로젝트에 적용시켜 보려 한다.
우선...
SharedPreferences
가벼운 데이터를 key-value 쌍으로 저장하기 위해 사용
한계
비동기 작업을 제대로 해주지 않으면 ANR 발생
오류가 생길 시 확인 불가능
런타임에 예외가 생기면 런타임 에러로 인해 앱 강제 종료됨
Strong consistency가 보장되는 api가 없어 다중 스레드 환경에서 다른 결과값 발생
type safety가 보장되지 않아 어떤 데이터가 저장, 추출되는지를 일일이 데이터로 형변환 해야함
(ANR 에러가 왜 생기는지 궁금했었는데, SharedPreferences로 인해 발생할 수도 있다는 사실을 알게 되었다.)
Datastore
프로토콜 버퍼를 사용해서 키밸류 쌍 또는 유형이 지정된 객체를 저장할 수 있는 데이터 저장소 솔루션
Coroutine을 사용, 동시성 프로그래밍에 최적화된 API 제공
다중 스레드 환경에서 Strong Consistency 보장
Proto Datastore에 한해 Type Safety 보장
2가지 구현 제공
- Preferences DataStore
- 키를 사용하여 데이터를 저장하고 데이터에 액세스.
- type safety 제공하지 않음
- 사전 정의된 스키마가 필요하지 않음
- Proto Datastore
- 맞춤 데이터 유형의 인스턴스로 데이터를 저장
- type safety 제공
- 프로토콜 버퍼를 사용, 스키마를 정의해야 함.
안드로이드 개발자 사이트 내용 중 Datastore 사용시 유의해야 할 규칙에는,
1. 같은 프로세스에서 특정 파일의 DataStore 인스턴스를 두 개 이상 만들지 않는다.
이렇게 하면 모든 DataStore 기능이 중단될 수 있습니다.
동일한 프로세스에서 특정 파일의 DataStore가 여러 개 활성화되어 있다면 데이터를 읽거나 업데이트할 때 DataStore가 IllegalStateException을 발생시킵니다.
2. DataStore의 일반 유형은 변경 불가능해야 합니다.
DataStore에 사용된 유형을 변경하면 DataStore가 제공하는 모든 보장이 무효화되고 잠재적으로 심각하고 포착하기 어려운 버그가 발생할 수 있습니다.
불변성을 보장하고 간단한 API와 효율적인 직렬화를 제공하는 프로토콜 버퍼를 사용하는 것이 좋습니다.
3. 동일한 파일에서 SingleProcessDataStore와 MultiProcessDataStore를 함께 사용하지 않는다.
둘 이상의 프로세스에서 DataStore에 액세스하려면 항상 MultiProcessDataStore를 사용하세요.
앱에서 Jetpack Datastore를 사용하려면 사용할 구현에 따라 다음을 Gradle 파일에 추가한다.
Preferences DataStore
Kotlin
// Preferences DataStore (SharedPreferences like APIs)
dependencies {
implementation("androidx.datastore:datastore-preferences:1.0.0")
// optional - RxJava2 support
implementation("androidx.datastore:datastore-preferences-rxjava2:1.0.0")
// optional - RxJava3 support
implementation("androidx.datastore:datastore-preferences-rxjava3:1.0.0")
}
// Alternatively - use the following artifact without an Android dependency.
dependencies {
implementation("androidx.datastore:datastore-preferences-core:1.0.0")
}
Proto DataStore
Kotlin
// Typed DataStore (Typed API surface, such as Proto)
dependencies {
implementation("androidx.datastore:datastore:1.0.0")
// optional - RxJava2 support
implementation("androidx.datastore:datastore-rxjava2:1.0.0")
// optional - RxJava3 support
implementation("androidx.datastore:datastore-rxjava3:1.0.0")
}
// Alternatively - use the following artifact without an Android dependency.
dependencies {
implementation("androidx.datastore:datastore-core:1.0.0")
}
다음 글에서는, Datastore 를 적용하여 앱 구현하는 내용에 대해 정리할 예정입니다~~
* 참조
https://developer.android.com/topic/libraries/architecture/datastore?hl=ko
앱 아키텍처: 데이터 영역 - Datastore - Android 개발자 | Android Developers
데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.
developer.android.com
'android' 카테고리의 다른 글
slack으로 aab 전송 받기 (0) | 2023.01.30 |
---|---|
민트소프트 개발 프로세스 (0) | 2022.06.15 |
android fastlane 사용법 (0) | 2022.06.15 |