Android Jetpack/Datastore

[Android Datastore] 5. Shared Preferences를 Datastore로 Migration하기

반응형

 Shared Preferences와 Datastore

Shared Preferences를 Datastore로 Migration 하기 위해서는 Datastore가 저장되는 공간에 Shared Preferences가 저장했던 정보를 다시 저장해야 한다. 이 뜻은 Shared Preferences를 Datastore로 이전 저장하기 위해 Migration 용 스펙을 정의해놓은 객체가 필요하다는 뜻이다.

 

Shared Preferences를  Datastore로 이전하는 작업은 보통 두가지 상황의 경우에 고려된다. 첫 째, Shared Preferences가 새로 만들 Datastore과 Dependency가 있어 같이 작업하는 것이 좋은 경우. 둘 째, Datastore에서 제공하는 Coroutines, Flow를 사용해야 하는 경우. 만약 호출 후 일회성으로 값을 받아오는 작업만 하면 충분하다면 굳이 Shared Preferences를 Datastore로 이전 하는 것은 Type Safety에 대한 장점 말고는 큰 의미가 없다. 잘 판단하여 Migration을 진행하는 것이 좋다. 

 

Shared Preference에서 이전하기

이전 작업을 위해서는 SharedPreferenceMigration 객체를 만들어야 한다. 이 SharedPreferenceMigration 객체는 Datastore에 입력하는 객체로 Converting을 진행한다. 아래 //Migration 로직 작성이라는 부분에 Shared Preference의 값을 Datastore용 객체로 이전하는 로직을 작성하면 된다.

*OnBoardingState는 이전 글에서 이어지는 객체이다. 만약 이해가 안간다면 4번 글을 보고 오자

private val Context.sharedPrefsMigration: SharedPreferencesMigration<OnBoardingState>
    get() = SharedPreferencesMigration(
        this,
        "PREF"
    ) { sharedPrefs: SharedPreferencesView, currentData: OnBoardingState ->
        // Migration 로직 작성
    }

 

이후에 produceMigrations 에 우리가 위에서 만든 sharedPrefsMigration 객체를 넣어주면 된다. produceMigrations는 입력값이 Context 인 lambda 이다.

val Context.storeOnBoardingState: DataStore<OnBoardingState> by dataStore(
    fileName = "onboardingSettings.pb",
    serializer = OnBoardingStateSerializer,
    produceMigrations = {
        listOf(it.sharedPrefsMigration)
    }
)

 

여기까지 하면 Migration이 끝난다. 이 방식으로 Preference Datastore은 물론 Proto Datastore로의 Migration 또한 가능하다.

반응형
 

Kotlin 사용자 모임 오픈 카톡

오셔서 궁금한 점을 질문해보세요!

open.kakao.com

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.