[Android Jetpack] 데이터 영역 라이브러리 DataStore
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다. 👍
DataStore?
Android DataStore는 SharedPreferences를 대체하기 위해 Google에서 도입한 최신 데이터 스토리지 솔루션입니다. 사용자의 기본 설정, 간단한 설정 또는 앱의 상태 등 작은 부분의 데이터를 저장하도록 설계되었습니다. SharedPreferences보다 DataStore를 사용하는 주요 이점에는 향상된 성능, 유형 안전성(Type safety) 및 트랜잭션 작업의 일관성(Consistency) 향상 등이 있습니다.
DataStore는 Kotlin Coroutine 및 Flow를 기반으로 구축되어 앱 데이터를 비동기적이고 일관된 트랜잭션 방식으로 저장하고, 관리하기 위한 보다 강력하고 효율적인 솔루션을 제공합니다.
Android 데이터 저장소 에코시스템에 원활하게 통합되어 Key-Value 데이터 저장을 위한 최신의 안정적인 API입니다. DataStore 공식 문서의 도입 부분에서도 현재 SharedPreferences를 사용해서 데이터를 저장하고 있다면, DataStore로 마이그레이션 하는 것을 고려하라고 언급되어 있습니다.
DataStore의 특징
Datastore는 Preferences Datastore와 Proto Datastore라는 두 가지 구현 방법을 제공하고 있습니다.
- Preferences DataStore
- Key-Value 구조를 사용하여 데이터를 저장하고 액세스합니다.
- 사전 정의된 스키마가 필요하지 않으므로, 유형 안전성(Type safety)을 제공하지 않습니다.
- Proto Datastore와 비교해서 더 단순하며, SharedPreferences와 유사합니다. Key는 문자열(String)이고, Value는 기본 데이터 유형(String, Int, Float 등) 중 하나를 저장합니다.
- 복잡한 스키마 없이 적은 양의 데이터를 저장해야 하는 경우 적합한 방식입니다
- 비동기 및 트랜잭션 특성 덕분에 SharedPreferences에 비해 더 나은 성능과 일관성을 제공합니다.
- Proto Datastore
- 사용자가 정의한 커스텀 데이터 유형의 인스턴스로 데이터를 저장합니다.
- 프로토콜 버퍼(Protocol buffers)를 사용하여 커스텀 데이터 스키마를 정의하므로, 보다 발전된 유형 안전성(Type saftey)을 제공하는 솔루션입니다.
- 데이터 구조를 설명하는 .proto 파일을 생성하고, protobuf 컴파일러는 스키마를 기반으로 Type safe 한 Kotlin 코드를 생성합니다. 이렇게 하면 저장하고 검색하는 데이터가 항상 스키마와 일치하여 런타임 오류의 위험이 줄어듭니다.
- Preferences DataStore보다 더 복잡한 스키마로 구조화된 데이터를 저장해야 하거나 데이터 스토리지에서 유형 안전성을 강화하려는 경우 탁월한 방식입니다.
- Proto DataStore는 명확하게 정의된 스키마 덕분에 향상된 가독성 및 유지 관리성과 함께 Preferences DataStore의 모든 이점을 제공합니다.
- Proto DataStore는 새로운 직렬화 메커니즘을 학습해야 하지만, Proto DataStore가 제공하는 강력한 유형의 이점은 가치가 있다고 생각합니다.
결론적으로 DataStore는 Android 애플리케이션에 데이터를 저장하기 위한 유연하고 효율적인 두 가지 솔루션을 제공합니다.
Preferences DataStore와 같은 단순한 key-value 스토리지 솔루션이 필요하든, 아니면 Proto DataStore와 같은 고급 Type safety 스토리지 솔루션이 필요하든, DataStore는 SharedPreferences에 대하여 훨씬 더 현대적이고 강력한 대안을 제공합니다.
마지막으로 SharedPreferences, Preferences Datastore, Proto Datastore를 비교해보겠습니다.
기능 | SharedPreferences | Preferences Datastore | Proto Datastore |
비동기적 API (Async API) |
✅ (리스너를 통해 값의 변경만 읽을 수 있음) | ✅ (Flow, RxJava 2 & 3 Flowable 사용 가능) | ✅ (Flow, RxJava 2 & 3 Flowable 사용 가능) |
동기적 API (Sync API) |
✅ (단, UI 스레드에서 호출하는 것은 안전하지 않음) | ❌ | ❌ |
UI 스레드에서의 호출 안전성 |
❌ (ANR 가능성 있음) | ✅ (작업은 내부적으로 Dispatchers.IO 로 이동되어서 처리됨) | ✅ (작업은 내부적으로 Dispatchers.IO 로 이동되어서 처리됨) |
오류 신호 전송 가능 | ❌ | ✅ | ✅ |
런타임 예외로부터의 안전성 |
❌ | ✅ | ✅ |
Strong consistency 보장 | ❌ | ✅ | ✅ |
데이터 마이그레이션 처리 | ❌ | ✅ | ✅ |
유형 안전성 (Type safety) |
❌ | ❌ | ✅ (with Protocol buffers) |
다음 글부터는 Preferences Datastore 및 Proto Datastore 를 직접 구현해 보면서, 어떻게 사용하는지 방법을 살펴보도록 하겠습니다.