UserDefaults와 커스텀 객체를 UserDefaults에 저장하는 방법
- Swift
- Codable
UserDefaults | Apple Developer Documentation
UserDefaults란?
- UserDefaults는 iOS에서 앱의 간단한 데이터를
키-값의 형태로 영구적으로 저장하는 작은 데이터베이스 인터페이스이다. - 앱 실행 시 사용자의 설정이나 환경 값, 작은 상태 정보를 지속적으로 관리할 수 있다.
- 앱 종료 및 재시작 이후에도 값이 남아있기 때문에 영속성에 용이하다.
- 보통 문자열, 숫자, 불리언, 배열, 딕셔너리 등 Data 타입이나 기본 자료형에 적합하다.
- 대형 데이터나 복잡한 구조에는 적합하지 않다..
The
UserDefaultsclass provides convenience methods for accessing common types such as floats, doubles, integers, Boolean values, and URLs. These methods are described in Setting Default Values.
A default object must be a property list—that is, an instance of (or for collections, a combination of instances of) NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData_.
이 클래스는 부동 소숫점이나 실수, 정수, 부울 값, URL과 같은 일반적인 타입에 접근하기 위해 사용됩니다.
저장될 수 있는 객체는_ NSData__, NSString__, NSNumber__, NSDate__, NSArray 또는 임의의 인스턴스여야 합니다. (컬렉션의 경우는 인스턴스의 조합이어야 한다. NSDictionary__)
만약, 다른 유형의 객체를 저장하려면 _NSData_로 변환한 뒤 저장해야합니다.
🤔 커스텀 객체를 UserDefaults에 저장하는 과정은 어떻게 될까?
1. Codable 채택
- 우선, UserDefaults에 저장하기 위해선 기본 자료형이나 Data만 가능하기 때문에
Codable을 채택하여 JSON으로 직렬화를 수행해야한다. - 따라서 원하는 타입(구조체 혹은 클래스)에
Codable을 채택시킨다.
struct MyModel: Codable {
var title: String
var value: Int
}
2. 직렬화 후 저장
- JSON으로 변환하고자 하면
JSONEncoder를 사용해NSData로 변환한 뒤UserDefaults에 저장한다.
let model = MyModel(title: "Test", value: 100)
if let encoded = try? JSONEncoder().encode(model) {
UserDefaults.standard.set(encoded, forKey: "savedModel")
}
3. 다시 불러온 후 역직렬화
- UserDefaults에 저장된 타입은
NSData이기 때문에 다시JSONDecoder를 사용하여 객체로 복원한다.
if let savedData = UserDefaults.standard.data(forKey: "savedModel") {
if let loadedModel = try? JSONDecoder().decode(MyModel.self, from: savedData) {
print(loadedModel.title)
}
}
⭐ 중요한 정보
UserDefaults는 기본 자료형 또는NSData타입만 저장 가능하다~
- 커스텀 객체는
Codable + Encoder/Decoder로 변환한 뒤Data타입으로 저장하자.
- 대규모 데이터 저장에는 적합하지 않다.
- 간단한 설정이나 고유값을 활용할 때 사용하자.