인프런 커뮤니티 질문&답변

jminie님의 프로필 이미지
jminie

작성한 질문수

냉동코더의 알기 쉬운 Modern Android Development 입문

Practice7-세팅화면 구현하기 (Preferences DataStore, Enum)

실습에서 사용하고 있는 Data Store는 Proto DataStore 인가요?

작성

·

639

1

이론설명에서 Type Safety를 보장하는 것은 Proto DataStore라고 하셨는데 key를 저장할 때 stringPreferencesKey를 사용해 String 타입으로 제한하므로 실습은 Proto DataStore로 진행되고 있는것인가요?

답변 6

1

jminie님의 프로필 이미지
jminie
질문자

와... 정말 감사합니다... 최고의 답변이였습니다 이해가 완벽히 됐어요!

1

냉동코더님의 프로필 이미지
냉동코더
지식공유자

All about Preferences DataStore의 Defining keys 문단을 보시면 "While this does put some constraints on data types, keep in mind that it doesn’t provide definite type safety." 라고 되어 있습니다. Preferences Datastore는 타입세이프가 아니라는 말이죠. "By specifying a preference key of a certain type, we hope for the best and rely on our assumptions that a value of a certain type would be returned." 단지 지정한 타입이 반환될 것이라고 '기대'한다는 이상한 표현을 사용하고 있습니다. 왜 그럴까요?

라이브러리 사용자의 관점에서는 PreferencesKey를 통하면 겉으로는 타입세이프처럼 동작하는 것 같지만 Get Your Hand Dirty With Jetpack Datastore 의 2. Jetpack Datastore 문단을 보면 실제로는 Preferences DataStore의 데이터는 json처럼 저장이 됩니다. 저장된 시점에서 타입 정보가 사라졌다가 읽어들일 때 다시 복원을 하는 것입니다. 그렇기에 타입이 잘 복원될 것이라고 '기대'를 하는 것이죠. 물론 대부분의 경우 잘 복원이 되기에 마치 타입 세이프처럼 느껴지는 것입니다.

하지만 Proto DataStore는 Protocol Buffers라는 것을 이용해서 저장할 데이터의 타입 정보를 스키마로 만들어 놓고 타입 정보 그 자체를 저장하는 방식을 사용합니다. 단순 원시 타입이 아닌 우리가 커스텀한 타입을 저장하고 싶으면서 높은 수준의 데이터 무결성이 요구되는 경우에 Proto DataStore를 사용한다고 생각하시면 됩니다.

0

jminie님의 프로필 이미지
jminie
질문자

제가 이해를 잘 못하고 있는 것 같습니다 

예를 들어 


val LOGIN_CHECK = booleanPreferencesKey("login_check")

에서 LOGIN_CHECK의 경우 booleanPreferencesKey로 선언하였습니다.

그리고 해당 DataStore에 Boolean 타입이 아닌 다른 타입을 넣으려고 하면 타입 오류를 뱉습니다.

이러면 Preferences DataStroe 역시 Type Safety를 보장하는 것 아닌가요?

0

냉동코더님의 프로필 이미지
냉동코더
지식공유자

https://developer.android.com/codelabs/android-preferences-datastore#3

위 표를 참고하세요. Preferences DataStore는 Type safe는 아닙니다만 SharedPreferences에 비하면 Thread safe라는 장점이 있습니다.

Preferences DataStore에서 Preferences.Key 는 키의 타입을 정의하는 것이고 데이터의 타입을 보장하는 것은 아닙니다.

0

jminie님의 프로필 이미지
jminie
질문자

그렇다면 Preferences DataStore 역시 Type Safety를 보장하는 것 아닌가요?

0

냉동코더님의 프로필 이미지
냉동코더
지식공유자

아닙니다 디펜던시에 추가되는 걸 보시면 아시겠지만 Preferences DataStore로 string을 저장하고 있는 것입니다.

implementation 'androidx.datastore:datastore-preferences:1.0.0'

 

단순한 데이터 저장에 사용하는 용도인데 Proto DataStore는 사용법이 복잡해서 주객이 전도되는 느낌이라 사용법까진 소개하지 않았습니다. 혹시 관심이 있으시다면 다음 링크를 참고해 보세요.

https://medium.com/androiddevelopers/all-about-proto-datastore-1b1af6cd2879

jminie님의 프로필 이미지
jminie

작성한 질문수

질문하기