본문 바로가기

Android

[Android] 홍드로이드 기초 강의 - SharedPreferences로 데이터 세이브/로드

1. SharedPreferences란?

SharedPreferences는 애플리케이션 내부에 저장된 기본 설정 데이터를 액세스하고 수정하기 위한 인터페이스입니다.

 

애플리케이션을 동작함에 있어 많은 데이터들이 필요합니다.

예를 들어, 맞춤 서비스를 제공하기 위해서 데이터를 분석해야 하는 경우는 데이터를 DB에 저장해서 관리합니다.

반대로 사용자의 아이디 및 비밀번호, 환경설정 등과 같이 비교적 간단한 데이터들은 애플리케이션 내부에 저장하는 것이 수월합니다.

바꿔 말하면 자동 로그인, 광고 on/off를 SharedPrefernces로 서비스할 수 있습니다.

 

데이터를 저장하는 장소가 애플리케이션 내부라고 설명했습니다.

이는 애플리케이션이 삭제되면 데이터도 함께 삭제되므로 주의해야 합니다.

 

파일 경로  =  data/data/(package_name)/shared_prefs/SharedPreference

 

참고로 SharedPreferences 클래스는 데이터 일관성[각주:1]이 강하게 보장된다고 합니다.

일관성을 보장하기 위해서 많은 리소스를 할당받아 사용하기 때문에 애플리케이션 속도를 저하시킬 수 있다고 합니다.

따라서 속성이 자주 변경되는 데이터는 다른 메커니즘을 사용하길 권장합니다.

 

2. SharedPrefernces로 데이터 세이브/로드하기

내부 폴더에 액세스 할 때는 getSharedPreferences() 메소드를 사용합니다.

아래는 메소드의 원형입니다.

 

getSharedPreferences(String name, int mode)

 

name은 데이터를 세이브하는 파일의 이름입니다.

mode는 파일 생성 모드를 의미합니다.

MODE_PRIVATE / MODE_WORLD_READABLE / MODE_WORL_WRITEABLE / MODE_MULTI_PROCESS 등이 있습니다.

 

그러나 다음과 같은 이유로 MODE_PRIVATE 이외에는 사용을 금지하고 있습니다.

 

MODE_WORLD_READABLE

MODE_WORLD_WRITEABLE

이 상수는 API 수준 17에서 더 이상 사용되지 않습니다.
전체적으로 읽을 수 있는 / 쓸 수 있는 파일을 만드는 것은 매우 위험하며 응용 프로그램에 보안 허점이 발생할 수 있습니다. 대신 응용 프로그램은 ContentProvider, BroadcastReceiver 및 Service와 같은 상호 작용을 위해 더 공식적인 메커니즘을 사용해야 합니다. 백업 및 복원을 거치는 경우와 같이 파일에 이 액세스 모드가 유지된다는 보장은 없습니다.

 

MODE_MULTI_PROCESS

이 상수는 API 레벨 23에서 더 이상 사용되지 않습니다.
MODE_MULTY_PROCESS는 일부 버전의 안드로이드에서 안정적으로 동작하지 않으며, 프로세스 간 동시 수정을 조정하는 메커니즘을 제공하지 않는다. 응용 프로그램에서 사용하려고 하면 안 됩니다. 대신, ContentProvider와 같은 명시적인 교차 프로세스 데이터 관리 방식을 사용해야 합니다.

 

아래의 표는 모드의 설명입니다. MODE_PRIVATE 이외에는 참고만 해주시길 바랍니다.

 

MODE 내용 상수 값
MODE_PRIVATE 생성된 파일은 호출 애플리케이션(또는 동일한 사용자 ID를 공유하는 모든 애플리케이션)에서만 액세스할 수 있는 기본 모드 0
MODE_WORLD_READABLE 다른 모든 애플리케이션이 생성된 파일에 대한 읽기 액세스 권한을 갖도록 허용 1
MODE_WORLD_WRITEABLE 다른 모든 애플리케이션이 생성된 파일에 대한 쓰기 액세스 권한을 갖도록 허용 2
MODE_MULTI_PROCESS SharedPreferences 로드 플래그: 설정하면 이 프로세스에서 공유 기본 설정 인스턴스가 이미 로드된 경우에도 디스크의 파일의 수정이 확인
이 동작은 응용 프로그램에 프로세스가 여러 개 있고 모두 동일한 SharedPreferences 파일에 쓰는 경우에 가끔 바람직함
그러나 일반적으로 프로세스 간 커뮤니케이션에는 더 나은 형태
4

 

다음의 코드는 내부 파일에 액세스 해서 데이터를 세이브 및 로드를 수행하는 코드입니다.

 

// 파일명
String shared = "file";

// 객체 생성
SharedPreferences sharedPreferences = getSharedPreferences(shared, 0);

// 데이터 세이브
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("home", value);
editor.commit();

// 데이터 로드
String value = sharedPreferences.getString("home", "");

 

작성된 코드의 순서대로 설명하겠습니다.

 

// 파일명

변수 shared는 파일의 이름으로 사용할 string을 세이브하는 변수입니다.

 

// 객체 생성

모드는 MODE_PRIVATE이고, "file"이란 이름의 파일을 관리하는 SharedPreferences 객체를 생성합니다.

 

// 데이터 세이브

데이터를 세이브할 때 Editor[각주:2]가 필요해서 Editor 객체를 생성합니다.

"home"이라는 key값에 변수 value의 데이터를 세이브합니다.

commit()을 통해서 변경된 사항을 "file"에 반영합니다.

 

// 데이터 로드

"home"으로 관리되는 데이터를 불러와서 변수 value에 저장합니다.

저는 "home"을 key값으로 이해했습니다.

 

3. 예제

동작 메커니즘을 알아보기 위해서 하나의 EditText가 있는 애플리케이션을 만들어서 학습하였습니다.

예제 수행 순서는 아래와 같습니다.

 

애플리케이션 실행 - 입력이 없는 EditText란에 text 입력 - 애플리케이션 종료 및 재접속 - EditText에 text 확인

 

애플리케이션이 실행 및 종료될 때 기본 설정 데이터를 액세스 하도록 코드를 작성합니다.

실행될 때는 데이터를 불러오고, 종료할 때는 데이터를 세이브할 계획입니다.

 

즉, 애플리케이션이 설치되고 처음 실행된 것이라면 세이브된 데이터가 없으므로 EditText는 빈 공간이 됩니다.

아래는 xml 파일 코드입니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_save"
        android:layout_width="100dp"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

동작법을 익히는 것이므로 강의에서는 부가적인 요소는 제외된 듯합니다.

다음은 java 파일 코드입니다.

 

package com.example.sharedexample;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText et_save;
    String shared = "file"; // 임시로저장하는 파일의 이름

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_save = (EditText) findViewById(R.id.et_save);

        SharedPreferences sharedPreferences = getSharedPreferences(shared, 0);
        String value = sharedPreferences.getString("home", "");		// 데이터 로드
        et_save.setText(value);						// EditText에 반영

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        SharedPreferences sharedPreferences = getSharedPreferences(shared, 0);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        String value = et_save.getText().toString();				// EditText의 text 로드
        editor.putString("home", value);					// 데이터 세이브
        editor.commit();							// 변경된 내용 반영

    }
}

 

 

※ 참조

https://developer.android.com/reference/android/content/SharedPreferences

 

SharedPreferences  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

https://developer.android.com/reference/android/content/Context#getSharedPreferences(java.lang.String,%20int) 

 

Context  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

  1. 정보가 네트워크를 통해 혹은 컴퓨터의 다양한 프로그램 간에 이동이 발생할 때 정보를 균일하게 유지하는 프로세스 [본문으로]
  2. SharedPreferences 개체에서 값을 수정하는 데 사용되는 인터페이스입니다. 편집기에서 변경한 내용은 모두 일괄 처리되며 commit()을 호출하거나 적용할 때까지 원래 공유 기본 설정으로 다시 복사되지 않습니다. [본문으로]