[개념] SharedPreference 알아보기

쓰리원·2022년 5월 7일
0
post-thumbnail

1. Shared Preference 란?

안드로이드 애플리케이션에서 로그인 정보 저장, 알림 수신 동의, 초기 설정값 같은 DB를 사용하기는 부담스러운 간단한 정보를 저장해야 되는 상황이 발생합니다. 이러한 상황에 안드로이드에서는 애플리케이션 저장하기 위해 사용 할 수 있는 내부DB로 Shared Preference를 제공합니다.

2. SharedPreferences의 특징

  • 간단한 값을 저장하기 위해 사용.
  • Application에 xml 파일 형태로 데이터를 저장.
  • Application이 삭제되기 전까지 저장한 데이터가 보존.
  • key와 value을 담을 수 있는 Map 형태로 저장.

3. SharedPreferences 사용 방법

1. getSharedPreference()

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

위의 공식문서 캡쳐 설명에 의하면 이름으로 식별되는 공유 환경설정 파일이 여러 개 필요한 경우 이 메서드를 사용합니다. 라고 합니다. 파일명으로 XML파일을 만들어 저장합니다. 다른 액티비티나 컴포넌트들이 데이터를 공유할 수 있습니다.

2. getPreference()

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

위의 공식문서 캡쳐 설명에 의하면 이 메서드는 Activity에 속한 기본 공유 환경설정 파일을 검색하기 때문에 이름을 제공할 필요가 없습니다. 라고 합니다. 즉, 자동으로 Activity 이름의 xml 파일로 저장이 됩니다. 예를 들어 MainActivity에서 getPreferences() 함수로 SharedPreferences를 얻으면 MainActivity.xml에 저장됩니다. 해당 액티비티만의 저장 공간이므로 다른 액티비티에서는 데이터를 이용할 수 없습니다.

MODE_PRIVATE : 자기 앱 내에서 사용. 외부 앱에서 접근 불가
MODE_WORLD_READABLE : 외부 앱에서 읽기 가능 : API17부터 지원 중단
MODE_WORLD_WRITEABLE : 외부 앱에서 쓰기 가능 : API17부터 지원 중단

3. PreferenceManager.getDefaultSharedPreference()

PreferenceManager를 통해서 앱의 환경설정 객체를 반환해오는 메서드입니다. 이 함수가 실행된 '패키지 명'으로 xml 파일을 저장합니다. 예를 들어 패키지 명이 "com.example.test"라면 파일명은 "com.example.test_preferences"가 됩니다. 다른 컴포넌트에서 접근 및 활용이 가능합니다.

PreferenceManager가 androidx 라이브러리 출시 이후 deprecated 되었습니다. 그래서 androidx 패키지로 가서 사용해야 합니다.

androidx.preference.PreferenceManager

4. SharedPreference.Editor

SharedPreferences로 데이터를 저장하려면 Editor 클래스의 함수를 이용합니다.

Editor를 이용하여 xml파일에 쓰기 위해서는 commit, apply 메서드를 이용할 수 있습니다. 두 메서드 간의 차이가 존재해서 구별하여 사용해야 합니다.

class MainActivity : AppCompatActivity() {

    val context_preference by lazy {getSharedPreferences("ows", Context.MODE_PRIVATE)}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        context_preference.edit().putString("hello","world").apply()
    }
}

1. public abstract boolean commit () -- API 1
2. public abstract void apply () -- API 9

1. commit

commit 함수는 메모리에 저장된 SharedPreference 객체에 데이터를 즉시 변경하고 파일도 동기적으로 변경하는 API 입니다. 동기적으로 파일을 쓰기 때문에 메인 스레드에서 commit을 수행하게 되면 UI 업데이트를 차단할 수도 있습니다. 따라서 메인 스레드에서 호출하는 것을 피하고 새로운 스레드를 생성하여 호출하는게 좋습니다.

두 명의 편집자가 동시에 환경 설정을 수정하는 경우 커밋을 호출한 마지막 편집자가 우선합니다. 반환 값에 신경 쓰지 않고 애플리케이션의 기본 스레드에서 이를 사용하는 경우 대신 apply()를 사용하는 것이 좋습니다.

2. apply

apply 함수는 메모리에 저장된 SharedPreference 객체에 데이터를 즉시 변경하지만 파일은 비동기적으로 변경하는 API 입니다. 비동기적으로 호출하여 commit에 비해 실행속도 측면에서 훨씬 빠릅니다. 하지만 commit은 작업이 완료되면 boolean 을 리턴하여 완료 여부를 알 수 있지만, apply는 리턴 값이 없기 때문에 확인할 수 없다는 단점이 있습니다.

5. reference

https://developer.android.com/reference/android/content/SharedPreferences.Editor
https://developer.android.com/reference/android/content/SharedPreferences
https://developer.android.com/training/data-storage/shared-preferences?hl=ko
https://developer.android.com/reference/androidx/preference/package-summary

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글