본문 바로가기
Mobile App

[안드로이드] - Android SharedPreferences

by Jman 2022. 7. 21.

데이터를 저장하기 위해선 3가지 방법이 있다.

  • SharedPreferences
  • File
  • 로컬 DB Library (Room, SQLite)

개발을 하다보면 계속적으로 필요한 값을 DB로부터 받아 와야할 때가 있다.

이러한 값들을 매번 DB를 통해 호출하다보면, 애플리케이션 성능이 떨어진다. 

속도 측면에서는 SharedPreferences 가 가장 빠르기 때문에 작업할 때 빈번하게 사용된다.

 

주로, 자동 로그인 여부 판별하기 위한 체크용도, 토큰 값 저장 등에 쓰며, 애플리케이션 내에서 간단한 데이터를 저장하는 경우에 DB를 통하기보단 이 방법을 많이 사용하다.

 

 

SharedPreferences

애플리케이션 내에 개별 데이터 저장소에 xml 파일을 만든 뒤, 그 파일에 Integer, String 등의 데이터를 읽고 쓰게 됩니다.

SharedPreferences 객체를 생성할 때, 파일 이름을 인자로 전달하여, 그 이름으로 xml 파일이 생성 됩니다.

그 후, 해당 xml 파일에 key / value 형태로 데이터를 저장합니다.

// xml 파일이 저장되는 경로
data/data/패키지명/shared_prefs/SharedPreference

 

* 프레임워크 별 SharedPreferences 저장 경로가 다르고, xml 데이터 형식 또한 다르다.

 

 

두 가지 종류의 환경설정 파일(xml)을 생성하거나 기존 파일(xml)에 엑세스할 수 있는 방법

  • getSharedPreferences() : 이름으로 식별하는 공유 환경설정 파일이 여러 개 필요한 경우 이 메서드를 사용. 애플리케이션 내에서 Context 를 통하여 이 메서드를 호출할 수 있다.
    • getSharedPreferences(String name, int mode)
  • getPreferences() : Acitivity 에 공유 환경설정 파일을 하나만 사용해야하는 경우 Activity 에서 이 메서드를 사용.
    • getPreferences(int mode)

 

 

Mode 종류

 - MODE_PRIVATE: 생성한 앱에서만 사용 가능
 - MODE_WORLD_READABLE: 다른 앱과 데이터 읽기 공유
 - MODE_WORLD_WRITABLE: 다른 앱과 데이터 쓰기 공유
 - MODE_APPEND: 기존 Preference에서 신규로 추가
 - MODE_MULTI_PROCESS: 해당 Preference가 사용 중인지 확인

 

 

사용하는 방법 [Kotlin]

MainActivity.kt

package com.example.db

import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import org.w3c.dom.Text

class MainActivity : AppCompatActivity() {

    private lateinit var editText : EditText
    private lateinit var textView : TextView

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

        editText = findViewById(R.id.editText)
        textView = findViewById(R.id.textView)
    }

    fun clickSetButton(view : View) {
        if (editText.text.toString().isEmpty()) {
            Toast.makeText(this, "값을 입력해주세요.", Toast.LENGTH_SHORT).show()
        }else {
            // 'mSharedPref' 이름으로 xml 환경설정 파일 생성성
            val sharedPreferences : SharedPreferences = getSharedPreferences("됨", MODE_PRIVATE)

            // sharedPreferences 를 제어할 editor 선언
            val editor : SharedPreferences.Editor = sharedPreferences.edit()

            // 값 저장
            editor.putString("randomData", "hi") // 별도로 그냥 저장.
            editor.putString("inputText", editText.text.toString()).commit() // 무조건 commit 은 필수. 그래야 저장
            Toast.makeText(this, "저장이 됐습니다.", Toast.LENGTH_SHORT).show()
        }
    }

    fun clickGetButton(view : View) {

        // 'mSharedPref' 이름으로 xml 환경설정 파일 생, 만약 'mSharedPref' 로 된 xml 파일이 존재하다면? 해당 기존 파일 불러옵니다.
        val sharedPreferences : SharedPreferences = getSharedPreferences("mSharedPref", MODE_PRIVATE)

        // 'mSharedPref' 파일 내에서 해당 Key 값을 가져오기
        val randData = sharedPreferences.getString("randomData", "default Data")
        val inputText = sharedPreferences.getString("inputText", "")
        textView.text = inputText
        Toast.makeText(this, "$randData 값을 불러옵니다.", Toast.LENGTH_SHORT).show()
    }
}

 

activitiy_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:text="Set SharedPreferences"
        android:onClick="clickSetButton"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.715" />

    <Button
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:onClick="clickGetButton"
        android:text="Get SharedPreferences"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.495"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.821" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

참고

https://developer.android.com/training/data-storage/shared-preferences?hl=ko 

 

키-값 데이터 저장  |  Android 개발자  |  Android Developers

키-값 데이터 저장 저장하려는 키-값 컬렉션이 비교적 작은 경우 SharedPreferences API를 사용해야 합니다. SharedPreferences 객체는 키-값 쌍이 포함된 파일을 가리키며 키-값 쌍을 읽고 쓸 수 있는 간단

developer.android.com