DataStore는 기본 설정이나 어떠한 상태와 같은 소량의 데이터를 저장하는 Jetpack의 데이터 저장소 라이브러리입니다.
비동기 데이터 저장을 가능하게 하기 위하여 Coroutine과 Flow를 기반으로 하고 있으며
SharedPreference와는 달리 스레드로부터 안전하고 차단되지 않으면서 대체하는것을 목표로 합니다.
많은 안드로이드 개발자들이 이전에는 앱에서 SharedPreferences를 사용했을 것입니다. 사용하면서 겪는 여러가지 문제점들이 있었는데 가장 큰 문제는 UI스레드가 차단되거나 앱전체에서 일관되지 않는 데이터가 나타나는 경우가 있습니다.
아래의 그림은 SharedPreferences와 DataStore의 비교를 위한 사진입니다.
대부분의 API를 사용하면 데이터가 수정될 때 비동기식으로 알림을 받는 경우가 많습니다.
일부 비동기 지원을 SharedPreferences에서 제공하지만 콜백은 여전히 메인쓰레드에서 호출됩니다.
이에따른 문제로 서비스가 중지되거나 버벅거림, ANR을 유발 할 수 있습니다.
이에 비해 DataStore는 완전한 비동기식 API를 제공합니다.
데이터 검색과 저장에 Coroutine과 Flow를 사용함으로써 메인쓰레드를 호출할 일이 없고 위와같은 위험을 마주할 위험을 줄일수 있습니다.
SharedPreferences는 즉시 사용 가능한 동기 작업을 지원합니다.
그러나 commit() 을 통해 지속된 데이터를 수정하기 위한 동기식 UI 스레드에서 호출하는 것이 안전해 보일 수 있지만 실제로는 더 무거운 I/O 작업을 수행합니다 .
이는 ANR 및 UI 버벅거림으로 이어질 수 있고 종종 발생하는 위험한 시나리오입니다.
이를 방지하기 위해 DataStore 는 즉시 사용 가능한 동기 지원을 제공하지 않습니다 .
DataStore는 환경 설정을 파일에 저장하고 내부적으로는 달리 지정하지 않는한 모든 데이터 작업을 수행 Dispatchers.IO에서 진행하여 UI 스레드가 차단되지 않은 상태로 유지합니다.
SharedPreferences는 런타임 예외로 구문 분석 오류가 발생하여 앱이 충돌에 취약해질 수 있습니다. 예를 들어 잘못된 데이터 유형 이 요청될 때 ClassCastException 발생합니다.
반면에 DataStore는 Flow의 catch를 통하여 데이터를 읽거나 쓸 때 발생하는 모든 예외를 포착 하는 방법을 제공합니다.
데이터를 저장하고 검색하기 위해 Map : Key-Value 쌍을 사용하는 것은 타입 안전성을 제공하지 않습니다.
하지만 Proto DataStore를 사용하면 데이터 모델에 대한 스키마를 미리 정의하고 안전성 의 추가 이점을 얻을 수 있습니다.
DataStore의 트랜잭션 API 는 데이터가 읽기-수정-쓰기 작업 으로 업데이트되기 때문에 강력한 ACID 보장을 제공합니다.
또한 완료된 모든 업데이트가 읽기 값에 반영된다는 사실을 반영하여 " 쓰기 후 읽기 " 일관성을 제공합니다.
이제 DataStore가 제공하는 이점이 무엇인지 살펴보았 으므로 두 가지 구현( Preferences 및 Proto DataStore ) 중에서 선택하는 방법에 대해 알아보겠습니다 .
Preference DataStore는 스키마를 미리 정의하지 않고 키-값 쌍 을 기반으로 데이터를 읽고 씁니다.
Proto DataStore는 유형이 지정된 객체 를 저장하고 유형 안전성을 제공하고 키의 필요성을 제거합니다. Protobuf는 XML 및 기타 유사한 데이터 형식보다 빠르고, 작고, 간단하고, 덜 모호합니다.
둘 중 하나를 선택할 때 다음 사항을 고려해야 합니다.
데이터 읽기 및 쓰기를 위한 키-값을 사용한다면 Preferences DataStore로 작업해야 합니다.
DataStore의 개선 사항을 계속 활용하면서 최소한의 변경 으로하고 유형 안전성 검사 없이 충분히 확신이 있으면 Preferences DataStore 를사용하면 됩니다.
가독성 향상의 추가 이점을 위해 프로토콜 버퍼를 배우고 싶거나 데이터가 열거형이나 목록과 같은 더 복잡한 클래스전체 유형이라면 Proto DataStore 를 사용하면 됩니다.
구글 공식문서