SharedPreferences 사용배경
현재 안드로이드 프로젝트 진행 중 사용자의 TOKEN 등을 저장해놓을 만한 공간이 필요해졌다.
Access Token을 저장하기 위해서는 Database나 SharedPreferences을 보통 이용한다는 것을 알게 되었고 이를 공부한 것에 대하여 작성하고자 한다.
SharedPreferences에 대해서 구글링하던 도중, SharedPreferences의 보안성에 대한 의문을 가진 질문글을 발견해서
해당 질문 글도 첨부해 놓는다. [스택오버플로우 링크]
해당 링크의 답변은 간략하게 말하자면 SharedPreferences은 기본적으로 private하고 다른 Application이 access할수 없으며, 루팅된 기기에서의 접근은 가능할 수 있으나 방지할 수 있는 방법은 없으며, 암호화의 경우 매번 사용자에게 decrypt를 요구하거나 key file을 저장해야하는데 이는 캐싱의 목적을 잃거나 여전히 동일한 문제라는 것을 이야기 해주고 있다.
결론은 그냥 SharedPreferences를 사용해도 된다는 뜻으로 알아듣고 진행하였다.
SharedPreferences 개발자 문서 탐구
SHaredPreferences API의 경우 Read/Wrtie하는데 있어 단순한 key-value쌍을 이용한다.
PreferenceDataStore을 사용하면 커스텀 백엔드 storage를 사용할 수 도 있다고 한다.
사용중인 SharedPreferences 객체를 가져오기 위해서는
PreferenceManager.getDefaultSharedPreferences()를 호출하여 사용한다. 해당 메서드는 Application에서 어디에서 사용하든 작동된다.
E.g. 다음과 같은 'signature'라는 키를 사용하는 EditTextPreference의 경우
<EditTextPreference
app:key="signature"
app:title="Your signature"/>
다음과 같이 사용하면 Preference 값들을 가져올 수 있다.
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */)
val name = sharedPreferences.getString("signature", "")
Preference 값이 변경되는경우 listen하는 방법은 2가지가 있다
1. OnPreferenceChangeListener
2. OnSharedPreferenceChangeListener
상세 설명은 다음을 참고하고 사용하게 될 경우 부연설명을 하도록 하겠다.
앞에서는 Preference 객체의 경우 SharePreferences를 사용하는 예시였고,
이후에는 우리가 가장 많이 사용하게되는 Custom Data를 Store하는 경우이다.
Custom Data를 저장하기 위해서는 PreferenceDataStore를 extend하는 클래스를 만들어야 한다.
// Implement the data store
// 다음은 String 값을 저장할 때 handling하는 코드이다.
class DataStore : PreferenceDataStore() {
override fun putString(key: String, value: String?) {
// Save the value somewhere
}
override fun getString(key: String, defValue: String?): String? {
// Retrieve the value
}
}
유저에 의해서 값을 lose하지 않기 위해서는 data를 serialize 해야한다.
Implement the data store한 뒤, Enable the data store 작업을 진행해야 한다.
cusotm data를 툭정한 preference에 store하기 위해서는 Preferences상의 setPreferecneDataStore()를 호출해야 한다.
val preference: Preference? = findPreference("key")
preference?.preferenceDataStore = dataStore
계층적으로 custom data를 store하기 위해서는 PreferenceManager의 setPreferenceDataStore()를 호출해야 한다.
val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore
실제 프로젝트에 사용한 SharePreferences의 예시는 다음 포스팅에서 알아보도록 할 것이다.
'IT > Android' 카테고리의 다른 글
[Android/Retrofit] Effective Error Handling을 위한 CallAdapter의 활용 (0) | 2023.01.25 |
---|---|
[Android Dev] RecyclerView의 스크롤 상태 체크 (0) | 2023.01.22 |
[Android Env]Keystore 비밀번호를 잊어버렸을 때 (2) | 2023.01.21 |
[Android] Custom App Bar 사용 - Kotlin (0) | 2021.07.27 |
[Android] (2) SharedPreferences의 사용 - Kotlin (2) | 2021.07.26 |