개발을 시작하는 이야기

UserDefaults 본문

개발 이야기/Swift

UserDefaults

Teiresias 2022. 3. 27. 18:25

UserDefaylts는 앱에 사용자의 데이터를 키와 값을 쌍으로 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스 방식이다. 런타임 시 개체를 사용하여 앱이 사용자의 기본 데이터베이스에서 사용하는 기본값을 읽기 때문에 값이 필요할 때마다 데이터베이스를 열 필요가 없어진다.

 

사용자의 정보 혹은 개시물의 정보와 같은 대용량의 데이터를 저장하는 것이 아닌 최초 접속 여부, 자동 로그인 여부, 아이디 저장, 환경설정의 설정 데이터 값과 같은 단일 데이터 등을 UserDefaults로 담아서 보관하게 된다.

class UserDefaults : NSObject

기본 개체 저장

Swift안에 있는 float, Int, Double, Bool, URL 등 기본적으로 제공되는 자료구조와 NSData, NSString, NSNumber, NSDate, NSArray 등의 NS 관련 자료구조 또한 저장이 가능해서 활용성이 높다.

파일 참조 유지

파일 시스템의 위치를 지정하는 파일 URL은 메서드를 사용하여 특정 파일의 위치를 저장한다면 사용자가 해당 파일을 이동하면 앱이 다음 실행시 해당 파일을 찾지 못할 수 있지만, 파일 시스템 ID로 파일에 대한 참조를 저장하면 함수 대신 BookMaekData 매서드를 사용하여 NSURL 북마크 데이터를 생성하여 파일 URL에 대한 데이터가 손실되지 않게 도와준다.

UserDefaults 값 변경에 대한 알림

Default Notification Center의 didChangeNotificationdefault를 통해 UserDefaults 값이 변경될 때마다 알림을 받을 수 있어서 관리하기 수월하다.

사용하기

UserDefaults 클래스는 Foundation 프레임워크 안에 내장된 클래스이기 때문에 먼저 Foundation을 import 해준다.

UserDefaults.standard

공유된 기본값 객체를 반환하는 함수이다.

set(Any?,  forKey: String)

set 명령어를 통해 UserDefaults 데이터베이스에 원하는 값을 등록할 수 있다. 기본 형식이 Dictionary 구조이기 때문에 앞쪽에 Value 값을 넣고 forkey에 key값을 지정해주어야 한다. 

UserDefaults.standard.set("David Hockney", forKey: "name")
UserDefaults.standard.set(24, forKey: "age")
UserDefaults.standard.set(4.1, forKey: "grade")

value의 값이 String인경우 구조에 따라 값을 지정하기 전에 호출하게 된다면 에러가 발생할 수 있으니 주의해야 하며 ?? 나 guard let 구문을 사용하는 것이 좋다. Int, Double, Float, Bool 같은 경우는 기본값으로 0과 false를 반환한다. 기존에 있던 값을 변경할 때도 같은 key값으로 value를 설정해주면 변경이 가능하다.

removeObject(forKey: String)

해당 데이터가 더이상 필요하지 않다면 삭제해주는 메서드이다.

UserDefaults.standard.removeObject(forKey: "name")
UserDefaults.standard.removeObject(forKey: "age")
UserDefaults.standard.removeObject(forKey: "grade")

Key 관리

어느정도의 규모가 있는 프로젝트를 진행하면 여러 페이지에서 각각의 UserDefaults 값을 설정해주기 때문에 추후에 프로젝트를 관리하는 과정에서 내가 설정했던 값들을 다시 찾는데에 시간을 소모했던 경험이 있다. 그래서 UserDefaults의 Key값들을 별도로 모아서 관리를 해주면 다시 관리하기 위해 돌아왔을 때 알아보기 쉬웠다.

import Foundation

enum UserDefault: String {
    case isOnboarding = "isOnboarding"
    case idToken = "idToken"
    case FCMToken = "FCMToken"
    case myStatus = "myStatus"
}

 

SeSACFriend를 진행하며 멘토님께 두번이나 칭찬받은 몇개 안되는 자랑거리라 자랑하려고 글씀

 

참조

Apple Developer

'개발 이야기 > Swift' 카테고리의 다른 글

Get과 Post의 차이점  (0) 2022.04.01
[Error] Command Ld failed with a nonzero exit code  (0) 2022.03.28
Data Binding (Observable)  (0) 2022.03.26
MVVM(Model, View, ViewModel) 패턴  (0) 2022.03.25
MVC(Model, View, Controller) 패턴  (0) 2022.03.24