[iOS] 앱 설정 값 저장하기(feat. UserDefaults, AppStorage)

이정훈·2023년 2월 13일
1

iOS

목록 보기
2/3
post-thumbnail

이전 포스트에서는 filemanager를 이용하여 유저가 생성한 데이터를 저장하는 방법을 알아보았다.

이번 포스트에서는 앱 설정 값(로그인 정보 등)을 저장한다던가, 마지막으로 사용하던 컨텐츠를 가져 오는 등 간단한 데이터를 저장하는 방법에 대하여 알아보려고 한다.


UserDefaults

새로운 데이터가 추가된다거나, 값이 변경 되는 등의 데이터는 일단 메모리에 저장된다. 따라서 데이터를 저장하지 않고 어플리케이션을 종료한다면 데이터는 메모리에서 모두 사라지게 될것이다.

이전 포스트에서도 언급한 것과 같이 swift에서 데이터를 영구적으로 저장하기 위한 방법은 여러가지가 있는데,
그 중에서 512KB 이하의 간단한 데이터를 저장할 수 있도록 하는 것이 UserDefaults이다. 따라서 유저의 로그인 정보 혹은 앱 설정 값 등 간단한 데이터를 저장하는데 적합하다.

간단한 예시로 버튼을 눌렀을때, 카운트를 화면에 보여주고 어플리케이션을 종료 후에도 해당 카운트가 그대로 유지 되어 있는지 확인해보려고 한다.

import SwiftUI

struct ContentView: View {
    @State private var count: Int = 0
    
    var body: some View {
        VStack {
            Text("clicked count: \(count)")
            Button("click") {
                count += 1
            }
        }
    }
}

위의 코드대로 라면 버튼을 클릭하면 클릭 횟수가 화면에 표시된다.

하지만 count 변수에 대한 데이터를 기기에 직접 저장하지 않았기 때문에 어플리케이션을 종료한다면 count 변수의 값은 다시 0으로 초기화 되어 어플리케이션이 실행될 것이다.

이제 위의 코드를 UserDefaults를 사용하여 아래와 같이 바꿔준다면..?

import SwiftUI

struct ContentView: View {
    @State private var count = UserDefaults.standard.integer(forKey: "cliked")
    
    var body: some View {
        VStack {
            Text("clicked count: \(count)")
            Button("click") {
                self.count += 1
                UserDefaults.standard.set(count, forKey: "cliked")
            }
        }
    }
}

이제 UserDefaults를 통해 값을 불러오고 저장하였기 때문에 어플리케이션을 종료 하더라도 값이 사라지지 않고 저장된다.

위에 사용된 코드들을 하나씩 살펴보자

Apple 문서에 소개 되어 있는 UserDefaults에 대한 내용은 다음과 같다.

UserDefaults

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

저장되는 데이터는 key-value 쌍으로 저장이 된다.
따라서 저장된 데이터는 모두 forKey parameter에 key 값을 전달하여 구분한다.(key 값은 본인이 구분하기 쉽게 알아서 정하면 된다.)

📥 데이터를 저장하는 방법

데이터를 저장하기 위해서는 UserDefaults 인스턴스의 set 메서드를 사용하여 저장한다.

UserDefault.standard.set(0, forkey: "number")    //Integer 타입 데이터 저장
UserDefault.standard.set(true, forkey: "boolean")    //Boolean 타입 데이터 저장
UserDefault.standard.set("data", forkey: "string")    //String 타입 데이터 저장

📤 데이터를 불러오는 방법

데이터를 불러오기 위해서는 각 타입에 해당하는 메서드를 통해 데이터를 불러온다.

let string = UserDefault.standard.string(key: "string") ?? ""
let number = UserDefault.standard.integer(key: "number")
let boolean = UserDefault.standard.bool(key: "boolean")

데이터를 불러올때 처음 값이 저장되어 있지 않으면 Int와 Float, Double 타입은 0을, Bool 타입은 false를 반환한다.

String 타입의 데이터를 불러올때 주의할 점은 처음 값이 저장되어 있지 않으면 nil을 반환하기 때문에 optional binding으로 처리해야 한다.

␡ 데이터를 삭제하는 방법

데이터를 저장하기 위해서는 UserDefaults 인스턴스의 removeObject 메서드를 사용하여 저장한다.

UserDefault.standard.removeObject(forKey:"numebr")

@AppStorage

위의 프로젝트 예시에서 데이터를 가져오는 코드를 살펴보면

@State private var count = UserDefaults.standard.integer(forKey: "cliked")

뭔가 생각보다 코드가 길어지는 느낌이다..

이것을 iOS 14 버전 이상 부터 @State 속성을 포함하여 데이터 저장까지 한번에 할 수 있는 property wrapper가 바로 @AppStorage 속성이다.

@AppStorage 속성을 사용하면 위의 예시 코드를 다음과 같이 바꿀 수 있다.

import SwiftUI

struct ContentView: View {
    @AppStorage("cliked") private var count = 0
    
    var body: some View {
        VStack {
            Text("clicked count: \(count)")
            Button("click") {
                count += 1
            }
        }
    }
}

Userdefaults 처럼 값을 불러오거나 저장하는 코드를 직접 구현해야하는 번거로움 대신 @AppStorage 속성만으로 프로퍼티를 선언하고 초기 값만 대입해주면 된다.

그럼 해당 프로퍼티를 마치 @State 속성을 가진 프로퍼티처럼 사용할 수 있을뿐만 아니라 데이터도 저장이 가능하다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글