안드로이드 스튜디오 메모 앱 만들기(5)

윤재환·2024년 11월 20일

Gson을 이용한 SharedPreferences를 이용하여 로컬 데이터 저장하기

가장 먼저 gradle에 Gson의존성을 추가합니다.

//Gson 라이브러리 추가
    implementation("com.google.code.gson:gson:2.8.8")

의존성을 작성했으면 동기화(Sync)를 해야합니다.
작성후 저장하면 상단에 표시되는 Sync Now버튼을 클릭 하여 동기화를 해줍니다.

이후 MainActivity에 추가로 아래 코드를 작성하겠습니다.


package com.xml.androidlab

import android.content.Context
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

class MainActivity : AppCompatActivity() {
    private val memoList = mutableListOf<String>()
    private lateinit var adapter: MemoAdapter

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

        // EditText, Button, RecyclerView 참조
        val editTextMemo = findViewById<EditText>(R.id.editTextMemo)
        val buttonAddMemo = findViewById<Button>(R.id.buttonAddMemo)
        val recyclerViewMemos = findViewById<RecyclerView>(R.id.recyclerViewMemos)

        // RecyclerView 설정
        recyclerViewMemos.layoutManager = LinearLayoutManager(this)
        adapter = MemoAdapter(memoList)
        recyclerViewMemos.adapter = adapter

        // 저장된 메모 불러오기
        loadMemos()

        // 버튼 클릭 이벤트
        buttonAddMemo.setOnClickListener {
            val memoText = editTextMemo.text.toString()
            if (memoText.isNotEmpty()) {
                memoList.add(memoText) // 메모 리스트에 추가
                adapter.notifyDataSetChanged() // 어댑터에 변경 사항 반영
                editTextMemo.text.clear() // 입력 필드 초기화
                saveMemos() // 메모 저장
            }
        }
    }
    
	//여기서 부터 gson을 활용한 코드
    // 메모 저장 함수
    private fun saveMemos() {
        val sharedPreferences = getSharedPreferences("memo_prefs", Context.MODE_PRIVATE)
        val editor = sharedPreferences.edit()
        val gson = Gson()
        val json = gson.toJson(memoList)
        editor.putString("memo_list", json)
        editor.apply()
    }

    // 메모 불러오기 함수
    private fun loadMemos() {
        val sharedPreferences = getSharedPreferences("memo_prefs", Context.MODE_PRIVATE)
        val gson = Gson()
        val json = sharedPreferences.getString("memo_list", null)
        if (json != null) {
            val type = object : TypeToken<MutableList<String>>() {}.type
            val loadedMemos: MutableList<String> = gson.fromJson(json, type)
            memoList.addAll(loadedMemos)
            adapter.notifyDataSetChanged()
        }
    }
}

1. 메모 저장 함수(saveMemos)

  • 이 함수는 memoList를 JSON 문자열로 변환한 뒤, SharedPreferences를 사용하여 로컬에 저장합니다.

코드 동작

  1. SharedPreferences생성
val sharedPreferences = getSharedPreferences("memo_prefs", Context.MODE_PRIVATE)
  • "memo_prefs"라는 이름으로 SharedPreferences 파일을 생성 또는 가져옵니다.
  • Context.MODE_PRIVATE는 해당 데이터를 . 앱내부에서만 접근 가능하게 설정합니다.
  1. Edit 객체 생성
val editor = sharePreferences.edit()
  • SharedPreferences를 수정하기 위해 editor객체를 가져옵니다.
  1. Gson을 활용한 직렬화
val gson = Gson()
val json = gson,.toJson(memoList)
  • memoList(메모리스트)를 JSON문자열로 변환합니다. 예를 들어, 리스트가 ["Memo1", "Memo2"]가 됩니다.
  1. JSON데이터를 SharedPreferences에 저장
editor.putString("memo_list", json)
editor.apply()
  • JSON문자열을 "memo_list" 라는 키로 저장합니다.
  • apply()를 호출하여 비동기적으로 저장 작업을 완료합니다.

2. 메모 불러오기 함수(loadMemos)

SharedPreferences에 저장된 JSON 데이터를 가져와서 memoList로 역직렬화 합니다.
이후, RecyclerView를 업데이트 합니다.

코드 동작
1. SharedPreferences 가져오기

val sharedPreferences = getSharedPreferences("memo_prefs", Context.MODE_PRIVATE)
  • "memo_prefs"라는 이름의 SharedPreferences vkdlfdmf rkwudhqslek.
  1. Gson객체 생성
val gson = Gson()
  • JSON 데이터를 객체로 변환하기 위해 Gson 객체를 생성합니다.
  1. 저장된 JSON 문자열 가져오기
val json = sharedPreferences.getString("memo_list", null)
  • `"memo_list"라는 키로 저장된 JSON 문자열을 가져옵니다.
  • 저장된 데이터가 없으면 기본값 null을 반환합니다.

4.JSON 데이터를 리스트로 역직렬화

val type = object : TypeToken<MutableList<String>>() {}.type
val loadedMemos: MutableList<String> = gson.fromJson(json, type)
  • TypeToken을 사용하여 JSON 문자열을 MutableList<String>타입으로 변환합니다.
  • 예를 들어 JSON이 ["Memo1", "Memo2"]라면 리스트로 변환된 결과는
    ["Memo1", "Memo2"]가 됩니다.
  1. 메모 리스트 업데이트
memoList.addAll(loadedMemos)
adapter.notifyDataSetChanged()
  • 불러온 데이터를 memoList에 추가합니다.
  • adapter.notifyDataSetChanged()를 호출하여 RecyclerView를 업데이트 합니다.

다음 포스트 에서는 필자의 핸드폰으로 앱을 작동하는 포스트를 쓰겠습니다.

profile
백엔드 개발에 관심있는 1인

0개의 댓글