코틀린 안드로이드 앱개발 강좌, 공유된 프리퍼런스에 보관하기

안녕하세요! 오늘은 안드로이드 앱 개발에 있어 중요한 주제인 “공유된 프리퍼런스(Shared Preferences)”에 대해 자세히 알아보겠습니다. 공유된 프리퍼런스는 간단한 키-값 쌍으로 데이터를 저장할 수 있도록 도와주는 안드로이드의 내장된 데이터 저장 방법 중 하나입니다. 주로 사용자 설정이나 간단한 데이터를 저장할 때 유용하게 사용됩니다.

1. 공유된 프리퍼런스란?

공유된 프리퍼런스는 안드로이드 애플리케이션 내에서 작은 데이터를 저장하기 위해 사용되는 API입니다. 주로 문자열, 정수, 불린 등의 기본 데이터를 저장하는데 적합합니다. 이 데이터는 앱을 종료하거나 다시 시작해도 유지되며, 사용자가 설정한 정보를 저장하고 복원할 수 있습니다.

2. 사용할 수 있는 경우

공유된 프리퍼런스는 다음과 같은 경우에 유용합니다:

  • 사용자 로그인 정보 저장
  • 사용자 설정 (테마, 언어, 알림 여부 등)
  • 앱의 상태 유지 (예: 마지막으로 본 페이지)

3. 공유된 프리퍼지스를 사용하기 위한 기본 설정

공유된 프리퍼런스를 사용하기 위해서는 먼저 애플리케이션의 컨텍스트를 통해 인스턴스를 생성해야 합니다. 다음은 기본적인 사용법입니다:

3.1. SharedPreferences 인스턴스 생성

val sharedPreferences = getSharedPreferences("MyPreferences", Context.MODE_PRIVATE)

여기서 “MyPreferences”는 저장할 데이터의 이름입니다.

4. 데이터 저장하기

공유된 프리퍼런스에 데이터를 저장하는 방법은 다음과 같습니다:

4.1. 문자열 저장하기

val editor = sharedPreferences.edit()
editor.putString("username", "JohnDoe")
editor.apply()

4.2. 정수 저장하기

val editor = sharedPreferences.edit()
editor.putInt("userAge", 30)
editor.apply()

4.3. 불린 값 저장하기

val editor = sharedPreferences.edit()
editor.putBoolean("notificationsEnabled", true)
editor.apply()

5. 데이터 읽어오기

저장된 데이터를 읽어오는 방법은 다음과 같습니다:

5.1. 문자열 읽어오기

val username = sharedPreferences.getString("username", "defaultUser")

5.2. 정수 읽어오기

val userAge = sharedPreferences.getInt("userAge", 0)

5.3. 불린 값 읽어오기

val notificationsEnabled = sharedPreferences.getBoolean("notificationsEnabled", false)

6. 데이터 삭제하기

특정 데이터를 삭제하고 싶다면 다음과 같이 할 수 있습니다:

val editor = sharedPreferences.edit()
editor.remove("username")
editor.apply()

7. 모든 데이터 삭제하기

모든 데이터를 삭제하려면 clear() 메서드를 사용할 수 있습니다:

val editor = sharedPreferences.edit()
editor.clear()
editor.apply()

8. 사용 예제: 사용자 설정 저장하기

이제 간단한 예제를 통해 사용자 설정을 저장하고 불러오는 방법을 진행해보겠습니다. 먼저, Android Studio에서 새로운 프로젝트를 생성하세요. 사용자의 이름과 나이를 입력받아 공유된 프리퍼런스에 저장하는 간단한 UI를 만들어보겠습니다.

8.1. 레이아웃 파일

res/layout/activity_main.xml 파일을 다음과 같이 수정합니다:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="사용자 이름"/>

    <EditText
        android:id="@+id/editTextAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="사용자 나이"
        android:inputType="number"/>

    <Button
        android:id="@+id/buttonSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="저장"/>

    <Button
        android:id="@+id/buttonLoad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="불러오기"/>

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"/>

</LinearLayout>

8.2. MainActivity.kt 파일

이제 MainActivity.kt 파일을 다음과 같이 수정하여 사용자 입력을 저장하고 불러올 수 있도록 합니다:

import android.content.Context
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var sharedPreferences: SharedPreferences
    private lateinit var usernameEditText: EditText
    private lateinit var ageEditText: EditText
    private lateinit var saveButton: Button
    private lateinit var loadButton: Button
    private lateinit var resultTextView: TextView

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

        sharedPreferences = getSharedPreferences("MyPreferences", Context.MODE_PRIVATE)
        usernameEditText = findViewById(R.id.editTextUsername)
        ageEditText = findViewById(R.id.editTextAge)
        saveButton = findViewById(R.id.buttonSave)
        loadButton = findViewById(R.id.buttonLoad)
        resultTextView = findViewById(R.id.textViewResult)

        saveButton.setOnClickListener { saveData() }
        loadButton.setOnClickListener { loadData() }
    }

    private fun saveData() {
        val editor = sharedPreferences.edit()
        val username = usernameEditText.text.toString()
        val userAge = ageEditText.text.toString().toIntOrNull() ?: 0

        editor.putString("username", username)
        editor.putInt("userAge", userAge)
        editor.apply()

        resultTextView.text = "저장 완료: $username, 나이: $userAge"
    }

    private fun loadData() {
        val username = sharedPreferences.getString("username", "defaultUser")
        val userAge = sharedPreferences.getInt("userAge", 0)

        resultTextView.text = "불러오기: $username, 나이: $userAge"
    }
}

8.3. 실행해보기

이제 앱을 실행해보세요. 사용자 이름과 나이를 입력한 후 ‘저장’ 버튼을 클릭하면 프리퍼런스에 데이터가 저장됩니다. ‘불러오기’ 버튼을 클릭하면 저장된 데이터가 표시됩니다.

9. 팁과 주의사항

  • 공유된 프리퍼런스는 비밀번호와 같은 민감한 정보를 저장하는데 사용해서는 안 됩니다. 보안이 중요한 데이터는 다른 데이터 저장소 방법을 고려해야 합니다.
  • 공유된 프리퍼런스는 작은 양의 데이터에 적합합니다. 대량의 데이터나 복잡한 구조의 데이터를 저장하려면 SQLite 데이터베이스나 Room 라이브러리를 사용하는 것이 좋습니다.
  • 데이터의 변경 내용을 즉각적으로 반영하려면 apply() 대신 commit()을 사용할 수 있지만, 이 경우 UI 스레드가 차단될 수 있으므로 지양해야 합니다.

10. 결론

이번 강좌에서는 안드로이드 앱 개발에서 공유된 프리퍼런스를 사용하는 방법에 대해 알아보았습니다. 프리퍼런스를 통해 손쉽게 사용자 설정을 저장하고 불러올 수 있게 되었습니다. 다양한 데이터 저장 방식을 알고 적절한 상황에서 사용한다면, 더욱 폭넓은 앱 개발이 가능할 것입니다.

이제 자신만의 앱에서 사용자 경험을 개선하기 위해 공유된 프리퍼런스를 활용해보세요. 다음 강좌에서는 더 고급 데이터 저장 방법에 대해 다뤄 보겠습니다. 감사합니다!