DataStore를 알아보기 전에 앱에 데이터를 저장하는 방법에 대해 먼저 정리해 보자 ❗
앱에 데이터를 저장하는 방법은 크게 3가지로 나눌 수 있다.
- 파일 I/O (내부 또는 외부 저장소) : 접근 권한을 획득하고 파일을 열었다 닫았다 하는 수고가 필요하다는 단점이 있음
- 관계형 데이터 베이스 : SQLite, Room 등을 이용해 복잡한 관계형 데이터를 저장할 수 있음, 간단한 데이터를 저장할 거라면 구축과 관리에 많은 시간과 노력이 요구됨
- SharedPreference : Key/Value 형태로 이용함, 내부적으로는 XML 파일로 저장되고 파일을 열고 닫을 필요 없이 핸들러를 만들어서 간편하게 사용가능
기존에 앱의 데이터를 간단하게 저장하는 방법으로, SharedPreference를 자주 사용했다.
DataStore는 이를 대신하여 나온 것으로, 프로토콜 버퍼를 사용해서 Key, Value 또는 유형이 지정된 객체를 저장할 수 있는 Data 저장 방법이다. DataStore는 Preferences DataStore, Proto DataStore가 있다.
Preferences DataStore
키를 사용하여 데이터를 저장하고 데이터에 액세스함, 이 구현은 유형 안정성을 제공하지 않으며 사전 정의된 스키마가 필요하지 않다.
Proto DataStore
맞춤 데이터 유형의 인스턴스로 데이터를 저장함, 이 구현은 유형 안정성을 제공하며 프로토콜 버퍼를 사용하여 스키마를 정의해야 한다.
기존에 사용했던 SharedPreference처럼 Key/Value 형태로 데이터를 저장할 수도 있지만 객체도 저장할 수 있다.
위에 언급했던 프로토콜 버퍼란 구조화된 데이터를 직혈화하기 위한 구글의 언어 중립적, 플랫품 중립적, 확장 가능한 메커니즘이다. XML보다 작고 간단하며 데이터 구조화 방법을 한번 정의한 후 특수 생성 코드를 써서 다양한 데이터 스트림, 언어를 사용해 구조화된 데이터를 쉽게 읽고 쓸 수 있다.
프로토콜 버퍼를 활용하면 JSON 보다 빠르게 대용량 데이터를 처리할 수 있다.

DataStore는 Corutine과 Flow를 기반으로 하고, 재현하기 어려운 SharedPreference의 문제를 해결하는 것을 목표로 한다.
기존에 앱에서 SharedPreference를 사용하면서 포착되지 않은 예외가 발생하거나 분석에서 이상한 충돌이 발생하거나 UI 스레드를 차단하는 등 여러 가지 문제를 해결하기 위해 구축되었다.
DataStore 사용 규칙
- 같은 프로세스에서 특정 파일의 DataStore 인스턴스를 두 개 이상 만들지 않는다.
- DataStore의 일반 유형은 변경 불가능해야 함.
- 일반 파일에 SingleProcessDataStroe와 MultiProcessDataStore를 함께 사용하지 않는다.
Reference
앱 아키텍처: 데이터 영역 - Datastore - Android 개발자 | Android Developers
데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.
developer.android.com
[Android] DataStore란? DataStore 예제
간단한 데이터를 저장하는 방법으로 지금도 자주 사용되는 건 쉐어드 프리퍼런스일 것이다. 그런데 이것을 대신해서 사용할 수 있는 것을 안드로이드에서 만든 모양이다. 그게 이 포스팅의 제
onlyfor-me-blog.tistory.com
Protocol Buffers
Protocol Buffers are language-neutral, platform-neutral extensible mechanisms for serializing structured data.
protobuf.dev