VesselWheel

UserDefaults를 이용한 데이터 관리와 ToDo 앱 만들기 본문

Xcode Study

UserDefaults를 이용한 데이터 관리와 ToDo 앱 만들기

JasonYang 2024. 1. 11. 14:34

공식문서

https://developer.apple.com/documentation/foundation/userdefaults

 

UserDefaults란?

  • UserDefaults는 간단한 Key-Value 데이터를 저장하는데 사용됩니다.
  • 주로 설정 값이나 사용자 기본 설정과 같은 작은 데이터를 저장할 때 사용됩니다.
  • 여기서 key값은 꼭 String 타입이여야 합니다.
// 데이터 추가 및 업데이트
UserDefaults.standard.set(value, forKey: key)

// 데이터 조회 | Any? 타입이여서 as를 사용한 타입 변환 후 사용
UserDefaults.standard.value(forKey: key)

// 데이터 조회 | 특정 타입으로 반환할 경우 (String)
UserDefaults.standard.string(forKey: key)

// 데이터 삭제
UserDefaults.standard.removeObject(forKey: key)

standard란?

standard은 UserDefaults 클래스의 정적 속성입니다.

UserDefaults 클래스는 iOS 앱에서 사용자 설정과 같은 간단한 데이터를 영구적으로 저장하고 검색하는 데 사용됩니다. standard는 기본 UserDefaults 객체에 대한 접근을 제공합니다.

앱의 다른 부분에서 UserDefaults에 접근하려면 standard를 사용하여 기본 객체에 접근하고, 해당 객체를 통해 데이터를 저장하고 검색합니다.

DataManager 클래스에서 싱글톤 패턴을 적용한 코드 

더보기
//
//  DataManager.swift
//  ToDowithData
//
//  Created by Jason Yang on 1/9/24.
//
import UIKit

struct UserDefaultsKeys {
    static let todoList = "todoList"
}

class DataManager: NSObject {
    static let shared = DataManager()
    
    private override init() {
        super.init()
    }
    
    func setData() {
        // 프로퍼티 배열 생성
        let todos : [RemoteTodo] = [
            RemoteTodo(id: 0, title: "title1", isCompleted: false, category: "운동"),
            RemoteTodo(id: 1, title: "title2", isCompleted: false, category: "운동"),
            RemoteTodo(id: 2, title: "title3", isCompleted: false, category: "생활"),
            RemoteTodo(id: 3, title: "title4", isCompleted: false, category: "생활")
        ]
        saveData(todos)
    }
    
    func saveData(_ todos: [RemoteTodo]) {
        // JASON형식으로 인코딩된 데이터를 UserDefaults에 저장, 이렇게 하면 ToDo 목록이 앱이 종료되어도 유지됨.
        let encoder = JSONEncoder()
        do {
            let encodedData = try encoder.encode(todos)
            UserDefaults.standard.set(encodedData, forKey: UserDefaultsKeys.todoList)
        } catch {
            print("Failed to save todos: \(error.localizedDescription)")
        }
    }
    
    // 디코딩된 데이터를 ToDo 객체 배열로 반환
    // UserDefaults에서 저장된 데이터를 가져와서 디코딩하여 RemoteTodo 객체의 배열로 반환
    func getData() -> [RemoteTodo] {
        if let encodedData = UserDefaults.standard.data(forKey: UserDefaultsKeys.todoList) {
            let decoder = JSONDecoder()
            do {
                let decodedData = try decoder.decode([RemoteTodo].self, from: encodedData)
                return decodedData
            } catch {
                print("Failed to load todos: \(error.localizedDescription)")
            }
        }
        // 데이터 불러오기 실패 시 빈 배열 반환
        return []
    }
    
    // 업데이트된 ToDo 목록을 인코딩하여 UserDefaults에 저장, 기존 데이터를 덮어쓰는 역할
    func updateData(with updatedList: [RemoteTodo]) {
        let encoder = JSONEncoder()
        do {
            let encodedData = try encoder.encode(updatedList)
            UserDefaults.standard.set(encodedData, forKey: UserDefaultsKeys.todoList)
        } catch {
            print("Failed to update todos: \(error.localizedDescription)")
        }
    }
    
    // "todoList" 키에 해당하는 데이터 삭제, removeOject 매소드 사용
    func deleteData() {
        UserDefaults.standard.removeObject(forKey: "todoList")
    }
}

해석

DataManager 클래스는 UserDefaults를 사용하여 데이터를 저장, 로드, 업데이트 및 삭제하는 기능을 제공합니다.

UserDefaults는 앱에서 간단한 데이터를 영구적으로 저장하는 데 사용되는 인터페이스입니다.

이 클래스에서는 다음과 같은 메서드들이 제공됩니다:

1. `setData()`: 프로퍼티 배열을 생성하고, 해당 데이터를 saveData 메서드를 통해 UserDefaults에 저장합니다. 이 메서드는 초기 데이터를 설정하는 데 사용될 수 있습니다.

2. `saveData(_ todos: [RemoteTodo])`: 주어진 RemoteTodo 배열을 JSON 형식으로 인코딩하고, UserDefaults에 저장합니다. 이를 통해 앱이 종료되어도 ToDo 목록이 유지될 수 있습니다.

3. `getData() -> [RemoteTodo]`: UserDefaults에서 저장된 데이터를 가져와서 디코딩하여 RemoteTodo 객체의 배열로 반환합니다. 이를 통해 이전에 저장된 ToDo 목록을 로드할 수 있습니다.

4. `updateData(with updatedList: [RemoteTodo])`: 주어진 업데이트된 ToDo 목록을 인코딩하여 UserDefaults에 저장합니다.

이를 통해 기존 데이터를 덮어쓸 수 있습니다.

5. `deleteData()`: "todoList" 키에 해당하는 데이터를 UserDefaults에서 삭제합니다. UserDefaults는 간단한 데이터를 저장하기에 적합한 방법이지만, 대량의 데이터나 복잡한 데이터 구조를 저장하기에는 적합하지 않습니다. 이 경우에는 CoreData, SQLite 또는 서버 기반의 데이터베이스와 같은 다른 데이터 저장 방법을 고려해야 합니다.

또한, 이 코드에서는 UserDefaultsKeys 구조체를 사용하여 "todoList" 키를 정의하고 있습니다. 이를 통해 오타나 중복을 방지하고, 키를 일관성 있게 사용할 수 있습니다.