개요
SharedPreferences는 이미 무덤으로 들어간지 오래.
하지만 현재 회사는 아주 아주 오래된 프로젝트였고, 여전히 SharedPreferences를 사용하고 있었다.
데이터 무결성이 지켜지지 않아 자꾸 문제가 발생하였기에 마이그레이션을 하기로 결정 !!
이전 회사에서 사용했던 방법은 JetPack에서 나온 DataStore였다.
당연하게 써왔던 DataStore의 개념이 NowInAndroid를 보며 무너졌다.
Proto DataStore ???
그게 대체 뭔데 !!!!!!!
모르면 정리해야지...
정리
1. Preference DataStore란?
- Key-Value 형식으로 데이터를 저장하는 방법이다.
SharedPreferences의 방식과 유사하다.
단, 구조화 된 데이터는 지원하지 않으며 Boolean, Int, String 등의 기본 자료형을 주로 사용한다. - Flow를 통해 데이터에 반응형으로 접근할 수 있으며, Coroutine을 이용해 비동기 데이터 작업 처리가 가능하다.
덕분에 메인 스레드가 차단되지 않아 앱 성능 면에서 우수하다. - SharedPreferences는 XML 파일에 데이터를 저장해 데이터 손상 가능성이 있었지만,
Preference DataStore는 더 안전한 저장 방식을 사용하기 때문에 데이터 손상 위험이 줄어든다. - SharedPreferences와 비슷하게 설계되어 있어 마이그레이션이 쉽다.
2. Proto DataStore란?
- Protobuf라는 구조화 된 데이터를 바이너리 포맷으로 저장하는 방식을 사용한다.
이 방식은 복잡하고 구조화 된 데이터를 저장할 때 유용하다. - 스키마는 .proto 파일에서 정의되며, 프로토콜 버퍼 컴파일러가 이를 기반으로 코틀린 클래스를 생성한다.
- ProtoBuf는 스키마 기반이기 때문에 데이터의 무결성이 보장된다. 스키마가 변경되더라도 프로토콜 버퍼는 버전 관리와 역호환성을 제공하여 안전하게 데이터를 유지한다.
- Flow 및 Coroutine을 통해 비동기로 데이터를 처리할 수 있다.
3. Preference DataStore vs Proto DataStore vs SharedPreferences
SharedPreferences | Preference DataStore | Proto DataStore | |
구조 | Key-Value | Key-Value | 스키마 기반 구조화 데이터 |
형식 | XML | JSON 텍스트 | Protocol Buffers (바이너리 포맷) |
스레드 안전성 | UI 차단 가능성 있음 | 비동기 처리로 안전 | 비동기 처리로 안전 |
데이터 타입 지원 | 기본 데이터 타입 (String 등) | 기본 데이터 타입 | 사용자 정의 데이터 구조 |
주요 사용 사례 | 간단한 설정 값 | 설정 값, 간단한 데이터 | 복잡한 구조의 데이터 |
성능 | 작거나 간단한 데이터에 적합 | 많은 양의 데이터를 안전하게 처리 가능 | 대량 데이터도 빠르고 효율적으로 처리 가능 |
데이터 무결성 | 낮음 | 높음 (DataStore에서 오류 발생 시 복구 가능) | 매우 높음 (Protocol Buffers로 안정성 보장) |
역호환성 관리 | 기본적으로 제공하지 않음 | 기본적으로 제공하지 않음 | Schema 버전 관리로 역호환성 유지 가능 |
4. 선택 기준
현재 회사 프로젝트 마이그레이션 작업을 진행 중이다.
원래는 SharedPreferences를 사용하고 있었고, String 값만 저장이 가능하기에 Json 형태를 모두 JsonString으로 변환하여 저장했었다.
Preference DataStore를 사용하게 된다면, JsonString으로 저장하는 방법이 변하지 않기에 다시 복잡하게 데이터를 관리하게 될 것 같았다.
따라서 구조화 된 처리를 쉽게 하기 위해 Proto DataStore를 선택하기로 했다.
'Android > Jetpack' 카테고리의 다른 글
Android Studio에서 Proto DataStore 설정하는 방법 (gradle kotlin) (0) | 2024.11.07 |
---|---|
[Android/Jetpack]ViewModel + Databinding + LiveData (0) | 2023.02.24 |
[Android/Jetpack]LiveData (0) | 2023.02.24 |
[Android/Jetpack]Databinding 사용하기 (0) | 2023.02.24 |