SharedPreferences

Android

프로젝트를 진행하다보면, 필연적으로 데이타를 저장해야 할 경우가 생긴다.

이럴 때, 보통은 DB 에 저장하거나 파일에 직접 저장해두고 필요할 때마다 꺼내 쓰지만, 안드로이드에서는 이러한 과정을 간단하게 대신 처리해주는 SharedPreferences 라는 클래스를 제공한다.

SharedPreferences 는 간단한 (key, value) pair 데이타들을 어플리케이션 내에 파일 형태로 저장, 조회, 삭제하는 기능을 제공한다.

간단한 사용 예제를 살펴보자.

SharedPreferences 사용 예제

조회

key 에 대응하는 value 를 조회한다.

private int getPreferences(Context context, String key) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);
	return pref.getInt(key, 0);
}
  • 데이타 타입에 따라 getAll(), getString(), getStringSet(), getInt(), getLong(), getFloat(), getBoolean() 을 사용할 수 있다.
  • getInt(key, 0); 에서 두 번째 인자 0 은 해당 key 에 대한 데이타가 저장되어 있지 않을 때, 반환되는 default value 이다.

저장

key 에 대응하는 value 를 저장한다.

private void putPreferences(Context context, String key, int value) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);
	SharedPreferences.Editor editor = pref.edit();
	editor.putInt(key, value);
	editor.apply();
}
  • 데이타 타입에 따라 putString(), putStringSet(), putInt(), putLong(), putFloat(), putBoolean() 을 사용할 수 있다.
  • 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)

삭제

key 에 대응하는 (key, value) pair 를 삭제한다.

private void removePreferences(Context context, String key) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);
	SharedPreferences.Editor editor = pref.edit();
	editor.remove(key);
	editor.apply();
}
  • 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)

모든 데이타 삭제하기

preference_file_name 에 저장된 모든 데이타를 삭제한다.

private void removeAllPreferences(Context context) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);
	SharedPreferences.Editor editor = pref.edit();
	editor.clear();
	editor.apply();
}
  • 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)

apply() vs commit()

공통점

  • 둘 다 데이타를 저장한다.
  • 둘 다 2개 이상의 editor 가 동시에 수정하면 마지막에 호출된 것이 적용된다.

apply()

  • 비동기 방식
  • returns void : 이 때문에 commit() 보다 빠르다.
  • UI Thread 에서 사용할 수 있다.
  • API level 9 부터 추가되었다.

commit()

  • 동기 방식
  • returns boolean : 정상적으로 저장완료 되면 true, 그렇지 않으면 false
  • UI Thread 에서 사용할 수 없다.
  • API level 1 부터 추가되었다.

결론

  • 저장이 완료되었는지 반드시 확인 받아야 하는 상황이 아니라면 apply() 를 사용하자.

SharedPreferences 사용시 주의점

실수하기 쉬운 코드 1

아래와 같이 하면 정상적으로 저장되지 않는다.

private void putPreferences(Context context, String key, int value) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);
	pref.edit().putInt(key, value);
	pref.edit().apply();
}

edit() 메소드는 항상 새로운 인스턴스를 반환한다. 따라서, 3번째 줄 pref.edit().putInt(key, value); 에서 반환한 인스턴스와 pref.edit().apply(); 에서 반환한 인스턴스는 다른 인스턴트다.

위의 코드를 다시 풀어 쓰면, 아래와 같은 황당한 코드가 된다.

private void putPreferences(Context context, String key, int value) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_PRIVATE);

	SharedPreferences.Editor editorA = pref.edit();
	editorA.putInt(key, value);

	SharedPreferences.Editor editorB = pref.edit();
	editorB.apply();
}

이 코드를 보면 왜 틀렸는지 이해가 될 것이라 믿는다.

실수하기 쉬운 코드 2

Multi Process 환경에서 SharedPreferences 를 사용할 때 MODE_PRIVATE 으로 열면 정상적으로 작동하지 않을 수 있다. 아래와 같이 MODE_MULTI_PROCESS 를 사용하자.

private void putPreferences(Context context, String key, int value) {
	SharedPreferences pref = context.getSharedPreferences("preference_file_name", context.MODE_MULTI_PROCESS);
	SharedPreferences.Editor editor = pref.edit();
	editor.putInt(key, value);
	editor.apply();
}
  • MODE_PRIVATE 이나 MODE_MULTI_PROCESS 에 대한 이야기는 다음 기회에 ~ ^^;