DataStore와 SharedPreferences
DataStore가 현대적인 선택인 이유를 알아보세요.
DataStore와 SharedPreferences은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
작은 설정 저장하기
거의 모든 앱은 다크 모드 전환 여부, 마지막으로 사용한 탭, 사용자 이름과 같은 작은 데이터를 기억해야 합니다. 이러한 데이터는 큰 관계형 데이터가 아니라 키-값 환경설정입니다.
Android에서는 오랫동안 이 용도로 SharedPreferences를 사용했습니다. 오늘날 권장되는 해결책은 DataStore입니다.
SharedPreferences란 무엇인가요?
SharedPreferences는 XML을 기반으로 하는 간단한 키-값 저장소입니다. 편집기를 가져와 값을 넣고 저장하면 됩니다.
- 사용하기 쉬움
- 프레임워크에 내장됨
- UI 스레드를 차단할 수 있는 동기식 API
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)SharedPreferences의 문제점
SharedPreferences에는 다음과 같은 실제 약점이 있습니다.
getX()읽기 작업이 호출한 스레드(대개 메인 스레드)를 차단할 수 있음commit()이 디스크 입출력을 동기식으로 수행함- 오류를 알리는 기본 제공 방법이 없음
- API가 타입 안전하지 않고 반응형이 아님
DataStore의 등장
DataStore는 Kotlin 코루틴과 Flow를 기반으로 만든 최신 대체 기술입니다. 모든 디스크 작업을 메인 스레드 외부에서 수행하고 데이터를 관찰 가능한 스트림으로 노출합니다.
두 가지 유형이 있습니다. Preferences DataStore(키-값)와 Proto DataStore(타입이 지정된 객체)입니다.
처음부터 비동기 방식
DataStore는 UI를 차단하지 않습니다. 읽기는 수집하는 Flow를 통해 수행되고, 쓰기는 코루틴에서 호출하는 suspend 함수입니다.
따라서 무거운 작업이 백그라운드 디스패처에서 수행되므로 메인 스레드에서도 설정을 안전하게 읽고 쓸 수 있습니다.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }반응형 업데이트
DataStore는 Flow를 노출하므로 값이 변경되면 UI가 자동으로 업데이트됩니다. SharedPreferences를 사용할 때는 번거로운 변경 리스너를 등록해야 했습니다.
Jetpack Compose에서는 플로에 간단히 collectAsState()를 적용하면 모든 업데이트마다 화면이 다시 구성됩니다.
트랜잭션과 일관성
DataStore의 쓰기 작업은 트랜잭션 방식으로 수행됩니다. 업데이트는 완전히 성공하거나 완전히 실패하므로, 반만 기록된 값을 읽는 일이 없습니다.
또한 동일한 프로세스에서 여러 읽기 및 쓰기 작업을 수행하는 동안 데이터 일관성을 보장합니다.
오류 처리
SharedPreferences는 입출력 문제를 조용히 무시합니다. DataStore는 문제를 드러냅니다. 읽기 작업에서 플로를 통해 IOException을 내보내며, 이를 catch하여 복구할 수 있습니다.
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }DataStore가 적합하지 않은 경우
DataStore는 작거나 중간 규모의 키-값 데이터 또는 타입이 지정된 데이터를 위한 것입니다. 데이터베이스가 아닙니다.
- 대규모 데이터 세트, 쿼리, 관계: Room 사용
- 파일, 이미지, 미디어: 파일 시스템 사용
- 소수의 설정: DataStore 사용
종속 항목 추가
Preferences DataStore를 사용하려면 모듈의 Gradle 파일에 아티팩트를 추가해야 합니다. Proto DataStore에는 별도의 아티팩트가 있습니다.
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}SharedPreferences에서 마이그레이션하기
모든 내용을 한 번에 다시 작성할 필요는 없습니다. DataStore는 처음 읽을 때 기존 값을 자동으로 복사해 주는 SharedPreferencesMigration을 제공합니다.
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)빠른 확인
DataStore가 선호되는 이유를 얼마나 이해했는지 확인해 보세요.
복습
키-값 설정에 DataStore가 현대적인 선택인 이유를 배웠습니다.
- SharedPreferences는 주 스레드를 차단할 수 있고 반응형이 아닙니다.
- DataStore는 안전한 비동기 접근을 위해 코루틴과
Flow를 사용합니다. - 쓰기 작업은 적절한 오류 처리를 포함한 트랜잭션으로 수행됩니다.
- Preferences와 Proto, 두 가지 방식이 있습니다.
다음에는 preferencesDataStore 위임자를 실제로 사용해 보겠습니다.
자주 묻는 질문
“DataStore와 SharedPreferences” 강의는 무료인가요?
네 — “DataStore와 SharedPreferences” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“DataStore와 SharedPreferences”에서 뭘 배우나요?
DataStore가 현대적인 선택인 이유를 알아보세요. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Android Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“DataStore와 SharedPreferences” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- DataStore와 SharedPreferences
- Preferences DataStore
- 설정 읽기와 쓰기
- Proto DataStore