Preference란?
- 프로그램의 설정 정보 (사용자의 옵션 선택 사항이나 프로그램의 구성 정보)를 영구적으로 저장하는 용도로 사용
- XML 포맷의 텍스트 파일에 키-값 세트로 정보를 저장
- 응용 프로그램 내의 액티비티 간에 공유하며, 한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있다.
사용법
1. getSharedPreferences (name, mode)
- 여러 개의 Shared Preference파일들을 사용하는 경우
- name : 프레퍼런스 데이터를 저장할 XML 파일의 이름이다.
- mode : 파일의 공유 모드
- MODE_PRIVATE: 생성된 XML 파일은 호출한 애플리케이션 내에서만 읽기 쓰기가 가능
- MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE은 보안상 이유로 API level 17에서 deprecated 됨
private fun saveData() {
val pref = getSharedPreferences("pref",0)
val edit = pref.edit() // 수정 모드
// 1번째 인자는 키, 2번째 인자는 실제 담아둘 값
edit.putString("name", binding.etHello.text.toString())
edit.apply() // 저장완료
}
private fun loadData() {
val pref = getSharedPreferences("pref",0)
// 1번째 인자는 키, 2번째 인자는 데이터가 존재하지 않을경우의 값
binding.etHello.setText(pref.getString("name",""))
}
이런 식으로 saveData함수를 호출하게되면 data> data>'패키지 명' 경로에 기존에 지정하 pref라는 이름의 xml 파일이 생성됩니다
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">etset Save data ok</string>
</map>
이런식으로 넣을 수 있는 프레퍼런스 데이터들의 타입은 Boolean / Float / Int / Long / String / StringSet이 있습니다.
그렇다면 리스트를 저장하고 싶다고 할 때 해당리스트를 JSON으로 만들면 좀 더 쉽게 저장을 할 수 있지 않을까 생각하게 됩니다.
//copied : https://ogyong.tistory.com/9
//Gson 의존성 추가
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//PrefData(data class)
data class PrefData (
val text : String,
val date :String
)
// SharedPreference 설정
private fun settingPrefs() {
mPrefs = getSharedPreferences("pref_file", MODE_PRIVATE) // SharedPreferences 불러오기
mEditPrefs = mPrefs.edit() // SharedPreferences Edit 선언
stringPrefs = mPrefs.getString("pref_data", null)
// SharedPreferences 데이터가 있으면 String을 ArrayList로 변환
// fromJson → json 형태의 문자열을 명시한 객체로 변환(두번째 인자)
if(stringPrefs != null && stringPrefs != "[]"){
arrayListPrefs = GsonBuilder().create().fromJson(
stringPrefs, object: TypeToken<ArrayList<PrefData>>(){}.type
)
}
}
// SharedPreferences 저장
private fun savePrefs(inputText: String) {
// ArrayList에 추가
arrayListPrefs.add(
0,
PrefData(
inputText,
SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(System.currentTimeMillis()) // 현재 날짜
)
)
// ArrayList를 json 형태의 String으로 변환
// toJson → json으로 변환된 문자열 리턴
stringPrefs = GsonBuilder().create().toJson(
arrayListPrefs,
object : TypeToken<ArrayList<PrefData>>() {}.type
)
mEditPrefs.putString("pref_data", stringPrefs) // SharedPreferences에 push
mEditPrefs.apply() // SharedPreferences 적용
}
위코드는 Gson라이브러리를 이용하여 ArrayList를 문자열로 변환할 수 있어 해당 내용을 저장을 할 수 있게 됩니다. 그렇다면 이제 이 값들을 암호 해야 되는 것이 아닌가 생각됩니다.
// copied https://ogyong.tistory.com/23
// EncryptedSharedPreferences 의존성 추가
implementation "androidx.security:security-crypto-ktx:1.1.0-alpha03"
// MasterkeyAlias 생성
val masterKeyAlias = MasterKey
.Builder(applicationContext, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
// 암호화된 SharedPreferences 객체 생성
val pref = EncryptedSharedPreferences.create(
this, // Context
"encrypted_pref_file", // 파일 명
masterKeyAlias,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, // AES256_SIV으로 key를 암호화
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM // AES256_GCM으로 value를 암호화
)
// 암호화 하여 저장
mBinding.etMain.setOnEditorActionListener { textView, actionId, _ ->
// 키보드에서 완료 버튼이 눌렸을 때 처리
if (actionId == EditorInfo.IME_ACTION_DONE) {
pref.edit().putString("myKey", textView.text.toString()).apply()
mBinding.etMain.clearFocus()
}
false
}
// 암호화 한 데이터 불러오기
mBinding.btnMain.setOnClickListener {
mBinding.tvMain.text = pref.getString("myKey", "")
}
이런 식으로 EncryptedSharedPreferences를 활용한다면 key와 value를 암호화시킬 수 있습니다.
2. getPreferences(mode) // 잘 사용하지 않음
- 한 개의 Shared Preference 파일을 사용하는 경우
- Activity 클래스에 정의된 메서드 이므로, Activity 인스턴스를 통해 접근 가능
- 생성한 액티비티 전용이므로 같은 패키지의 다른 액티비티는 읽을 수 없다.
- 액티비티와 동일한 이름의 XML 파일 생성
'안드로이드 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] Room 외래키 적용 (1) | 2023.10.14 |
---|---|
[Android/Kotlin] ViewModel 과 ViewPager (1) | 2023.10.10 |
[Android/Kotlin] DialogFragment 크기조절 (0) | 2023.09.13 |
[Android/Kotlin] 퍼미션(권한)허용 (0) | 2023.09.12 |
[Android/Kotlin] 리사이클러뷰(RecyclerView) 스와이프 이벤트 (0) | 2023.09.11 |