UserDefaults
사용자의 데이터를 저장할 수 있는 영구저장소의 일종이다. plist파일로 존재하여 Key-Data 방식으로 데이터를 읽고 저장한다. Float, Int, Double, Bool, String, URL 등 Swift에서 기본적으로 제공하는 자료구조 및 NSData, NSString, NSNumber 등 NS 관련 자료구조를 저장할 수 있다. 이 외의 인스턴스에 대해서는 추가적인 처리가 필요하다. 공통유형의 객체를 쉽게 읽고 저장할 수 있지만, 하나의 파일로 관리되는만큼 그 크기가 너무 방대해지면 오버헤드가 발생할 수 있다. 따라서 일반적으로 기본적인 몇가지 설정들만 저장될 것이 권장된다.
싱글톤을 기반으로 구성되어 있기 때문에 UserDefaults.standard의 형식으로 사용한다.
데이터 쓰기
- 다양한 set 메서드를 활용해 데이터 저장이 가능하다.
- 원하는 데이터를 첫번째 파라미터에 넣고, key값을 지정해주면 된다.
데이터 읽기
- 위의 메서드들을 활용해 UserDefault 내에 저장된 다양한 데이터를 받아올 수 있다.
- cf. 마지막의 dictionaryRepresentation 메서드를 활용하면 dictionary 형태로 UserDefaults의 데이터를 통채로 가져올 수 있다.
데이터 삭제
- 위의 메서드를 통해 데이터를 삭제할 수 있다.
Codable, NSCoding
앞서 언급했듯이 UserDefaults에는 Float, Int, Double, Bool, String, URL 등 Swift에서 기본적으로 제공하는 자료구조 및 NSData, NSString, NSNumber 등 NS 관련 자료구조만 저장이 가능하다. 다른 커스텀 클래스 인스턴스를 저장하기 위해서는 별도의 작업을 통해 인스턴스를 Data 타입으로 변환해야한다. 이 때 주로 활용할 수 있는 것이 Codable과 NSCoding이다.
Codable
클래스에 Codable protocol을 준수하도록 설정한 다음, JSONEncoder, JSONDecoder를 활용해 Data 타입으로 변환할 수 있다. 단, 상속구조가 존재해 다형성이 발생하는 데이터의 경우 제대로된 처리가 어려울 수 있으므로 NSCoding을 사용해야한다.
NSCoding
클래스에 NSObject를 상속받도록하고 NSCoding protocol을 준수하도록 설정한 다음, NSKeyedAchiever를 활용해 Data 타입으로 변환할 수 있다. 상속구조가 존재해도 해당 정보를 유지하기 때문에 다이나믹한 데이터 처리에 적합하다.
Custom plist
앱은 각각 자신만의 영역인 '샌드박스'를 갖게되는데, 이 곳에 저장을 해놓으면 언제든 다시 꺼내와서 활용할 수 있다. 따라서 꼭 UserDefaults의 plist를 활용하지 않아도 별도의 plist를 샌드박스 내에 생성해놓고 관리할 수 있다.
FileManager를 통해 documentDirectory 내부에 새로운 plist 파일을 생성하고
거기에 PropertyListEncoderEncoder로 처리한 data파일을 data를 저장하면 된다. (불러올 땐 PropertyListEncoderDecoder를 사용해 불러온다.)
UserDefaults가 너무 커져서 별도의 plist를 생성해놓고 관리하고 싶을 경우에 사용할 수는 있지만 사실 일반적으로 권장되는 방법은 아니다.
참고
'🍎 Apple > Swift' 카테고리의 다른 글
[Swift] 문자열 처리 (0) | 2022.01.22 |
---|---|
[Swift] NSCache와 NSDictionary의 차이점 (0) | 2022.01.22 |
[Swift] Dynamic Dispatch 줄이기 (0) | 2021.12.16 |
[Swift] Codable Protocol (2) | 2021.09.02 |
[Swift] 기초 문법 정리 (0) | 2021.07.18 |