본문 바로가기
안드로이드/Android

[Android] SharedPreference vs Datastore

by jinwo_o 2024. 11. 5.

 

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