SharedPreference를 사용해보자

지프치프·2021년 11월 3일
0

Android

목록 보기
24/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


SharedPreference란?

SharedPreferenc는 Application의 데이터를
Android 기기 저장소에 키와 값으로 저장할 수 있는 라이브러리다.
저장하려는 데이터 크기가 작아서(ex. 설정값 등) DB를 쓰기 부담스러울 때 아주 좋은 대안이 될 수 있다.
또 위에서 언급했드이 키와 값으로 저장하기 때문에
데이터를 불러올 때도 키만 알고있으면 되기 때문에 편하게 액세스 할 수 있다.

사용해보자

우선 필자는 이 SharedPreference (이하 Preference)를
싱글톤으로 구현하여 사용하였다.

class Pref(private val context : Context) {
    private val PREF_NAME = "PrefOfLee"
    private var preference : SharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)

    companion object {
        const val PREF_DATA = "Preference Test"

        private var instance : Pref? =null
        @Synchronized
        fun getInstance(context: Context) : Pref? {
            if(instance == null)
                instance = Pref(context)

            return instance
        }
    }

    // data를 가져옴
    fun getString(id: String?) : String? {
        return preference.getString(id, "")
    }

    // data를 저장(삽입)
    fun setValue(id: String?, value: String) : Boolean {
        return preference.edit()
            .putString(id, value)
            .commit()
    }

    // data를 제거
    fun removeValue(id: String?) : Boolean {
        return preference.edit()
            .remove(id)
            .commit()
    }
}

하나하나 살펴보면

private var preference : SharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)

getSharedPreferences(name, mode)
preference를 가져오는 메소드이다.
매개변수로는 prference의 이름과 mode를 받는데
이름은 자신이 쓰고싶은 이름을 넣어주면 되며
이 이름이 저장될 파일의 이름이다.

mode는 Context.MODE_PRIVATE 말고도 몇 개 더 있는데
Deprecated 될 예정이라고 하니 이 모드만 사용하면 된다.

    fun getString(id: String?) : String? {
        return preference.getString(id, "")
    }

prference에 저장된 데이터를 id(key)를 가지고 반환한다.
key 다음에 들어가는 두번째 매개변수는
데이터를 가져오려고 하는데 저장된 데이터가 없다면
대신 반환해줄 값을 넣어준다.

getString() 외에도 데이터 타입 별로 지원을 하니
적당한 용도에 맞춰 사용하면 될 거 같다.

    fun setValue(id: String?, value: String) : Boolean {
        return preference.edit()
            .putString(id, value)
            .commit()
    }

preference.edit()
preference에 값을 삽입/삭제 하기위해 필요한 editor를 반환해주는 메소드이다.

putString(key, value)
말그대로 key와 value를 저장(삽입)한다.
위에 getString()과 마찬가지로
데이터 타입 별로 지원한다.

commit()
preference에 데이터를 변경한다고 알려주는 메소드이다.
commit()과 별개로 apply()라는 메소드도 존재하는데
둘의 차이는 변경 성공 여부를 반환하느냐 안하느냐의 차이다.
그리고 속도는 apply()가 좀 더 빠르다고 한다.

필자는 성공 여부를 가지고 실패했을 때의 예외처리를 염두에 두어
commit() 을 사용하였다.

반환형을 지우면 apply()를 사용을 고려해보라고 제안한다.

    fun removeValue(id: String?) : Boolean {
        return preference.edit()
            .remove(id)
            .commit()
    }

setValue와 구조는 유사하다.
remove(key) 메소드 하나 차이라고 볼 수 있다.

사실 대체제가 나온지 얼마 안되었다.

몇 달전 SharedPreference를 완벽히 보완하고 대체하는
DataStore의 stable 버전이 출시되었다.
위 링크를 타고 문서를 들어가보면 알겠지만 Google에서도
SharedPreference 대신 DataStore를 사용할 것을 권장하고 있다.

If you're currently using SharedPreferences to store data, consider migrating to DataStore instead.

필자도 며칠 전에 한번 공부하면서 예제를 만들어 보았다가
어딘가 말썽인지 제대로 되지 않아 잠시 손을 놓고있는 상태다.

예제를 완성해보고 이해한 후에 포스팅을 한번 해보도록 하겠다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글