Android/Util

[Android] SharedPreferences 쉽게 사용하기

고기가좋아 2022. 11. 10. 02:47
반응형

오늘은 Android에서 SharedPreferences를 비교적 쉽게 사용하는 방법을 공유하려고 한다.

 

SharedPreferences란?

데이터를 영속적으로 저장해야 할 때 비교적 데이터 양이 작은 경우 간단한 방식으로 Key-Value 형태로 데이터를

저장할 수 있는 안드로이드 API이다.

실제 데이터들은 앱 내의 data/data/(package_name)/shared_prefs/SharedPreference

위치에 파일로 저장된다.


 

SharedPreferences 사용하기

SharedPreferences를 사용하여 데이터를 읽고 쓰는 방법은 다음과 같다.

 

SharedPreferences 객체 생성

SharedPreferences 객체를 생성하기 위해서는 getSharedPreferences() 함수를 이용한다.

앱의 Context에서 이 함수를 호출할 수 있으며,

함수의 매개변수로 첫 번째는 저장될 파일의 이름, 두 번째는 모드를 지정한다.

val sharedPref: SharedPreferences = context.getSharedPreferences("file_name", MODE_PRIVATE)

SharedPreferences 객체를 가져왔다면, 데이터를 읽고 쓸 수 있다.

 

SharedPreferences 읽기

데이터를 읽기 위해서는 getString() 또는 getInt() 함수 등을 이용할 수 있다.

이때 함수의 매개변수로 첫 번째는 데이터를 저장했던 Key (String 타입), 두 번째는 Default Value이다.

val value_string = sharedPref.getString("value_string_key", "default_string")
val value_int = sharedPref.getInt("value_int_key", 0)

 

SharedPreferences 쓰기

데이터를 쓰기 위해서는 edit() 함수를 호출하여 SharedPreferences.Editor을 생성 후

putInt() 또는 putString() 함수 등을 이용하여 KeyValue를 전달한다.

이때 함수의 매개변수로 첫 번째는 Key (String 타입), 두 번째는 Value이다.

 

원하는 데이터를 전달했으면 apply() 또는 commit()을 호출하여 변경사항을 저장한다.

이때 apply() 함수는 메모리 내의 SharedPreferences 객체를 즉시 변경하지만 실제 파일에는 비동기적으로 데이터를 업데이트한다. 

반면 commit() 함수는 동기적으로 파일에 데이터를 업데이트하지만, 기본 스레드에서 호출할 시 UI 렌더링이 일시 중지될 수 있기 때문에 기본 스레드에서의 호출은 피해야 한다.

with(sharedPref.edit()) {
    putString("value_string_key", "value_string")
    putInt("value_int_key", 100)
    apply()
}

 

SharedPreferences 쉽게 사용하기

위에서 SharedPreferences를 사용하는 방법에 대해 알아보았다.

그런데 매번 SharedPreferences를 사용할 때마다 context로 객체를 얻고 putString(), getString()

함수 등을 사용하여 데이터를 읽고 쓰면 코드도 길어지고 무엇보다 번거롭다.

 

따라서 싱글톤으로 SharedPreferences 객체를 한번 생성하고 함수 없이 직접 변수에 접근하는 것처럼 사용하려 한다.

 

예시로 User의 email과 age를 SharedPreferences에 데이터로 저장하려 한다.

 

먼저 패키지 구조는 다음과 같다.

 

Key 선언

SharedPreferences를 생성하고 데이터를 읽고 쓸 때 사용할 Key 들을 미리

util 패키지 밑에 Const.kt 파일 내에 const val로 선언한다.

const val USER_PREF = "user_pref"
const val EMAIL = "email"
const val AGE = "age"

 

싱글톤 SharedPreferences 정의

코틀린에서는 object 키워드로 클래스를 생성하면 싱글톤으로 생성할 수 있다.

getter, setter 부분에서 getString(), putString(), edit(), apply() 함수를 사용하여 값을 설정한다.

이렇게 하면 실제 데이터를 읽고 쓸 때는 UserPref.email = "email"과 같이 사용이 가능하다.

age 프로퍼티에서 ?: 는 엘비스 연산자로 여기에서 자세한 사용법을 확인할 수 있다.

object UserPref {
    var prefs: SharedPreferences? = null

    var email: String?
        get() = prefs?.getString(EMAIL, null)
        set(value) {
            prefs?.edit()?.putString(EMAIL, value)?.apply()
        }

    var age: Int
        get() = prefs?.getInt(AGE, 0) ?: 0
        set(value) {
            prefs?.edit()?.putInt(AGE, value)?.apply()
        }
}

prefs를 초기에 null로 설정하고, 실제로 Application 클래스 onCreate() 부분에서 SharedPreferences 객체를 생성해 줄 것이다.

 

SharedPreferences 객체 생성

App 클래스를 생성 후 Application 클래스를 상속받는다.

onCreate() 함수를 Override 후 UserPrefe class의 prefs에 SharedPreferences 객체를 할당한다.

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        UserPref.prefs = applicationContext.getSharedPreferences(USER_PREF, MODE_PRIVATE)
    }
}

 

App 클래스를 생성했으면 프로젝트의 AndroidManifest.xml 파일에서 application 태그에 등록해준다.

 

실제 사용

SharedPreferences 사용을 위한 설정을 마치면 다음과 같이 사용이 가능하다.

객체의 프로퍼티에 접근하듯이 SharedPrefences를 사용할 수 있다.

반응형