UserDefaults
이번에는 UserDefaults 와 KeyChain에 대해서 알아보겠습니다.
저는 개인적으로 처음 swift를 입문할때 유투브 하울님의 코딩 강의에서 swift,ios 1도 모르는 상태로 무작정 메모장 만들기를 따라했었어요.
이때 하울님이 데이터를 저장할때 UserDefault를 쓰는 거 보고 아 그냥 데이터 저장할 때 쓰는 거구나 생각하고 이게 persistant data인지도 몰랐습니다 ㅋㅋ. 그리고 이 글을 쓰게 된 경위가 창피하지만 여태까지 KeyChain을 안쓰고 모르고 있었습니다.
그래서 이참에 2 가지 다 소개하는 시간을 가지려고 합니다.
그래서 UserDefaults가 무엇이냐?
간단하게 말해서 앱 '안'에 있는 비휘발성 데이터 저장소라고 생각하시면 됩니다.
서버에 일일히 들고 있기 뭐한 데이터나, 계정 관련 데이터, 아니면 앱 고유설정 데이터 등등 같은 것들을 저장하기 좋은 수단입니다.
UserDefault에 저장 할 수 있는 값의 타입들은 다음과 같습니다.
Float, Double, Integer, Boolean, NSData, NSString, NSDate, NSArray, NSDictionary 이 정도가 있습니다.
왠만하면 다 가능한거죠.
대량의 데이터 같은 경우는 UserDefault보다 realm,sqlLite,coreData같은 프레임워크를 추천합니다.
그럼 본격적으로 UserDefaults에 대해서 하나씩 보도록 하겠습니다.
1.저장 위치
저장 위치는 앱 SandBox 내의 Bundle Container의 .plist 파일에 저장됩니다.
앱에서 권한을 주거나 할때 들어가는 Info.plist에 저장됩니다.
근데 . plist의 파일의 특징이 뭐죠? 바로 key-value의 형태로 저장된다는 것입니다.
저장 위치가 SandBox인 만큼 OS를 탈옥하면 접근이 가능합니다. 보안성이 좋지는 않은거죠.
2.사용법 - UserDefaults 선언하기
일단 UserDefaults를 선언하는데는 2가지 방법이 있어요
- standard를 통해서 선언하는 것
- customSuite를 통해서 선언하는 것
2개의 차이점은 standard 즉 원래 있는 파일을 가져다가 쓸것이냐? 아니면 customSuite 내가 개인적으로 만들어서 쓸거냐? 입니다.
3.사용법 - 데이터 저장하기 혹은 Register하기
이제 선언을 하였으니 데이터를 저장하거나 Register를 해봐야 겠죠?
여기서 Register는 미리 key-value값을 미리 디폴트로 선언해 놓는 것입니다.
사진과 같이 UserDefaults에 key-value를 할당하지 않아놓고 부르면 nil이 뜹니다. 물론 많은 경우 optional check를 진행하여 이후의 로직을 수행 하면 되는데 만약 초기값이 꼭 설정 되어 있어야 한다면 어떻게 할까요?
이럴때 .register(defaults : [String : Any]) 함수를 쓰는 것입니다.
요런식으로 하면 "okay"라는 key에 "im not okay" 라는 값이 디폴트 값으로 박혀서 실행되게 됩니다.
앱 실행 최초 한번만 설정해주기 때문에 값을 변경하고 앱을 다시 실행 시켜도 "im not okay"라는 값으로 덮어 씌워질 일이 없습니다.
데이터를 저장할 때 .setValue( value : Any?, forKey : String)으로 하시면 됩니다.
참고로 UserDefaults 같은 경우 앱을 실행하자마자 데이터를 캐시화 합니다. 따라서 매번 접근할 때마다 .plist에 접근할 필요가 없는 거죠.
그리고 지금처럼 꺼내고 저장하고 바로다시 꺼내고 하는 행위를 할때에도 동기성이 보장됩니다.
정확히는 현재 process에서는 동기적으로 진행되고 .plist에 다시 수정하고 쓰는 행위는 비동기적으로 동작합니다.
3.사용법 - 데이터 가져오기
데이터를 가져오는 건 이미 위쪽에서 보셨습니다.
UserDefaults.standard.원하는타입(forKey : String)의 형태로 가져오면 됩니다. 주의할점은 return 값이 optional이라는 것만 알고 있으시면 됩니다.
4.사용법 - userDefaults key-value 초기화 하기
썻다가 이제 필요가 없거나 아니면 보안문제 때문에 지우고 싶다고 할때는 어떻게 할까요?
단순하게 UserDefault.standard.setValue(nil, forKey: "key")이런식으로 해도 상관은 없습니다. 이렇게 진행해도 key값 또한 없어집니다.
하지만 .removeObject(forKey : "okay") 라는 함수가 따로 있습니다.
보시면 아예 Key값이 사라진 것을 확인할 수 있습니다.
5.사용법 - 편하게 사용하기
데이터를 가져오고 저장할때마다 UserDefaults.standard.setxxxxx 아니면 UserDefaults.standard.xxxx(forKey:) 이러고 있으면 불편하잖아요. 그래서 보통은 PropertyWrapper를 사용해서 간편하게 사용합니다. 저는 여기에 enum 까지 더해서 사용합니다.
userdefault를 제너릭으로 선언하여 defaultValue에 따라 타입이 자동적으로 정해지게 해놓고, 키값은 enum을 활용하여 혹시나 오타가 생기지 않게끔 설정하고 사용하고 있습니다.
여기서 설명드린거 말고도 커스텀 객체를 NSData로 변환하여 저장하는법도 있지만
UserDefaults는 이정도만 알고 있으면 된다고 생각합니다.
간단하지만 매우 유용한 기능이에요.
다음은 keyChain에 대해서 알아보겠습니다.
'iOS' 카테고리의 다른 글
MVVM (1) - 바인딩 방법들 (1) | 2022.12.09 |
---|---|
KeyChain vs UserDefaults(2) (0) | 2022.11.22 |
some 과 any 그리고 Any?(2) (0) | 2022.10.26 |
some 과 any 그리고 Any?(1) (0) | 2022.10.12 |
ARC란 무엇인가?(3) (0) | 2022.05.21 |