[Android] Preferece, Shared Preference란?

WonseokOh·2022년 5월 1일
1

Android

목록 보기
4/16
post-thumbnail

Shared Preference란?

  안드로이드 애플리케이션에는 대부분 설정을 할 수 있는 화면이 별도로 존재합니다. 로그인 상태를 유지한다던가, SMS 수신 등의 여부와 같은 설정을 하게 되면 애플리케이션을 다시 실행하더라도 유지됩니다. 이처럼 안드로이드에서는 애플리케이션 시스템 전체에서 유지되도록 저장할 수 있는 자료구조가 SharedPreference 입니다. Shared Preference는 key와 value를 담을 수 있는 자료구조로 Editor를 통해서 xml 파일에 기록하고 언제든 읽고 쓸 수 있습니다.


Android API

Activity.getPreference()

Shared Preference를 가져올 수 있는 API 중 하나로 Activity 클래스 내에 존재하고 Activity 별로 다른 SharedPreference 객체를 반환하게 됩니다.


Context.getSharedPreference()

Context 클래스 내에 존재하는 API로 파라미터로 전달된 name으로된 객체를 생성하고 키-값 쌍으로 이루어진 데이터들을 담을 수 있습니다. 그리고 해당 이름을 가진 xml 파일도 생성하여 Editor를 이용하여 읽고 쓰기를 수행할 수 있습니다.


Activity.getPreference() vs Context.getSharedPreference()

Activity.getPreference는 액티비티 별로 Preference 객체를 생성하여 모든 Activity에서 공통적으로 사용할 수 없습니다. Context.getSharedPreference는 말 그대로 앱 내의 모든 컨텍스트에서 공유하는 Preference로 기본 환경설정 할 때 주로 사용합니다.


PreferenceManager.getDefaultSharedPreference()

PreferenceManager를 통해서 앱의 기본 환경설정 객체를 반환해오는 API였지만, 현재는 deprecated된 상태입니다.


SharedPreference.Editor

  SharedPreference는 키와 값을 담는 자료구조라고 했는데 내부적으로 애플리케이션이 종료되더라도 유지하기 위해 파일에 기록하여 데이터를 저장하고 있습니다. 해당 파일을 읽고 쓰기 위해서는 Editor 객체를 사용해야 합니다. SharedPreference의 edit() 메소드를 이용하면 새로운 Editor 객체를 생성해 주게 되고 String, Float, Int, Long 등 여러 타입의 변수를 담을 수 있습니다.

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()
    }
}

  Editor를 이용하여 xml 파일에 쓰기 위해서는 commit, apply 메소드를 이용할 수 있습니다. 두 메소드 간의 차이가 명백히 존재하고 구별하여 사용해야 원하는 결과를 얻을 수 있습니다.

commit

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

apply

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

  Device File Explorer 탐색창에서 패키지 폴더의 shared_prefs에 들어가면 만들었던 xml의 이름으로 데이터들이 쓰이는 모습을 확인할 수 있습니다. 이렇게 SharedPreference는 작은 데이터를 앱 내에 기록하여 유지하며 사용할 수 있지만 보안성이 좋지 않기 때문에 중요한 정보는 여기에 기록하는 것이 좋지는 않습니다. 보안성을 높이기 위해서 EncryptedSharedPrefernce를 사용하는 것이 권장되고 앱 내에서 코루틴을 사용하고 있다면 SharedPreference의 단점을 보완한 DataStore API를 이용하는게 좋습니다 :)


참고

profile
"Effort never betrays"

0개의 댓글