-
안드로이드 DataStore와 SharedPreference안드로이드 학습/Android 기술면접 대비 2025. 2. 19. 10:28
안드로이드에서 User의 간단한 정보 (설정 값이나 기본 프로필 정보) 등은 SharedPreference를 사용해서 저장해왔다.
최근에 학습을 하다가 DataStore라는게 있다는 것을 새로 알게되고 SharedPreference를 DataStore로 이전하라는 내용을 보게되어 새로 학습해보기로 했다.
Developr 페이지 Developer 페이지에서 DataStore를 사용하라고 되어 있다.
SharedPreference 특징 :
- key - value의 형태로 데이터를 저장하고 불러와 데이터 양이 적고 간단한 구조일때 유용하게 사용된다.
- 어플리케이션이 삭제되기 전까지는 데이터가 유지된다.
- 이러한 데이터를 xml 파일 형태로 저장하기 때문에 너무 많은 데이터를 넣게 되면 메모리 예외 에러가 나타날 수도 있다. (사실 데이터가 많으면 Local DB에 저장하게 하기 때문에 따로 이런 오류를 만나본 적은 없다.)
- 데이터를 파일 형식으로 저장하기 때문에 보안에 취약해서 보안이 요구되는 데이터들은 SharedPreference로 저장하지 않는 것이 좋다.
SharedPreference의 문제점
- 1. UI Thread 차단 (비동기 지원 제한적).
- 데이터가 변경될 때 OnSharedPreferenceChangeListener를 사용해서 비동기로 불러오는 것만 지원된다.
- 데이터 저장할때 비동기로 한다는 apply()함수도 비동기 호출을 하는 것이 아니라 데이터를 잠시 대기 시키다가 Start/Stop 되는 시점에 백그라운드에서 동작. 이때 실행되는 fsync()라는 함수가 메인스레드를 block하기 때문에 UI가 버벅이고 ANR까지 발생 할 수도 있다.
- 2. Runtime Exception
- Exception에 대한 에러 핸들링을 제공하지 않고 있다.
- Type Safety 문제도 있다.
- 3. 제한된 데이터 저장 :
- 기본형을 제외한 데이터를 제외하기 위해서는 데이터를 변환하는 추가적인 작업이 필요하다.
Runtime Exception :
더보기1. ClassCastException 발생 예: ( Int로 저장한 값을 String으로 읽으려고 하는 상황 )
fun exampleClassCastException(context: Context) { val prefs = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) prefs.edit().putInt("counter", 10).apply() // Int 저장 // String으로 가져오려고 하면 ClassCastException 발생! val counter = prefs.getString("counter", null) }
2. NullPointerException 발생 예:
fun exampleNullPointerException(context: Context) { val prefs = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE) val value = prefs.getString("missingKey", null) // 값이 없으면 null 반환 val length = value!!.length // 여기서 NullPointerException 발생 }
DataStore 특징
- Android Jetpack의 최신 데이터 저장 라이브러리다.
- 프로토콜 버퍼를 사용하여 key-value 값 또는 유형이 지정된 객체를 저장할 수 있는 데이터 저장소 솔루션이다.
- Kotlin과 코루틴 및 Flow를 사용하여 비동기적이고 일관된 방식으로 데이터를 저장한다.
아래는 SharedPreference와 DataStore의 비교하는 표다.
DataStore는 Preference Datastore와 Proto Datastore라는 두가지 구현을 제공한다.
Preference Datastore :
- key-value 형태로 데이터를 저장한다.
- 기본 데이터 타입 저장 및 호출
Proto Datastore :
- 프로토콜 버퍼를 사용하여 사용자 정의 데이터 타입을 저장
- 맞춤 데이터 타입에 대한 스키마를 정의해야 한다.
DataStore 예제 : 링크
'안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글
안드로이드 DataStore 예제 (0) 2025.02.28 안드로이드 아키텍처 (MVC) (0) 2024.12.09 안드로이드 앱 테스트 기본 - 2 (UI Test예제 포함) (0) 2024.12.07 안드로이드 Coroutine Flow - 3 (StateFlow) 코드 (0) 2024.12.02 안드로이드 Coroutine Flow - 3 (StateFlow) (0) 2024.11.28