앱 실행 시 지속적으로 Key-Value 쌍을 저장하는 사용자의 기본 데이터 베이스에 대한 인터페이스임.
UserDefaults라는 이름 그대로 '사용자의 기본 설정 정보'를 저장하는 데이터베이스라고 보면 됨.
UserDefaults에 저장되는 데이터는 사용자 기기의 저장공간 중 앱의 "문서 및 데이터"영역을 차지하므로, 대용량의 데이터를 저장하기보다 다음과 같은 가벼운 단일 데이터 값을 저장하는 게 좋음
인증 토큰 정보 (보다 안전한 KeyChain에 저장하는 게 권장되긴 함)
자동 로그인 여부
알림 수신 여부
팝업창 띄우기 여부
앱 테마 설정.. 등등
다크모드 or 라이드모드
iOS에서는 이런 사용자 설정값들을 UserDefaults에 저장함!!
기본 데이터베이스는 Property List를 기반으로. plist 확장자 파일에 xml 형식으로 저장되며, Sandbox 내부에 저장됨.
홈 디렉토리 > Library > Preferences >. plist
기본 데이터베이스 파일이 앱 샌드박스 내부에 저장되기 때문에, 앱이 종료하더라도 데이터가 영구적으로 저장되는 것임.
파일이 전체로 읽고 쓰이기 때문에 UserDefaults를 사용해 부분적으로 변경이 있는 많은 양의 데이터를 저장하면 많은 시간을 낭비하게 됨.
사용자가 만들어내는 많은 양의 데이터를 저장하기에는 부적합함!!
또한 UserDefaults는 암호화되지 않은 텍스트 형태로 데이터를 저장하기 때문에 보안이 중요한 테이터를 저장하기에도 적합하지 않음!!
UserDefaults는 설정 값이나 상태 정보 등 간단하고 보안이 중요하지 않은 데이터를 저장하는 데 사용함!!
🎯 Keychain
Keychain은 iOS에서 제공하는 보안 저장소로, 사용자의 비밀번호나 인증 토큰 같은 중요한 정보를 안전하게 저장할 수 있음.
Keychain에 저장된 데이터는 암호화되어 있으며, 앱을 삭제해도 데이터는 유지됨.
또한, Keychain은 iCloud를 통해 여러 기기 간에 데이터를 동기화할 수 있는 기능을 제공함. 이는 사용자가 여러 기기를 사용할 때 매우 유용. Keychain은 iOS의 보안 기능을 활용하여 데이터를 안전하게 보호하기 때문임.
로그인 정보나 결제 정보와 같이 보안이 중요한 데이터를 저장할 때 Keychain을 사용하는 것이 좋음 ~~
Keychine은 암호화된 컨테이너며 Keychain services API는 민감한 데이터를 암호화하고 복호화하여 재사용하는 행위를 쉽고 안전하게 할 수 있도록 함.
기본적으로 디바이스를 잠그면 키체인도 잠기고, 디바이스를 열면 키체인도 풀림. 키체인이 잠긴 상태에서는 데이터에 접근하는 것이 불가능함.
Keychain Item
저장할 데이터는 Keychain Item으로 패키징하여 저장됨.
데이터를 암호화하여 Item으로 패키징 하는데, 이때 Attributes도 함께 저장함. Attributes는 데이터에 접근하거나 검색하는 것을 가능하게 함.
Attributes는 직접적으로 접근하게 하는 것이 아니라. 해당 데이터의 속성이나 특징을 보여주는 것이지, 접근하는 것은 접근 제어에 해당하는 프로세스만 가능함. 즉 접근 가능성을 보여주는 것임.
Using the Keychain to Manage User Secrets
앱은 비밀번호와 같은 민감한 사용자 데이터에 접근해야 하는 경우가 많은데, 데이터를 암호화하지 않고 저장하면 보안 위험이 따름.
Keychain은 암호화된 저장소에 쉽게 접근할 수 있도록 하여 이러한 문제를 해결함.
암호화된 데이터가 없다면, 유저가 입력한 정보가 유효한지 인증한 후에 Keychain 아이템으로 저장함. 만약 암호화된 데이터가 있다면, 그 정보가 유효한지 검사함. 여기서 유효하다면 Keychain 로그인 과정은 끝나게 되고, 만약 유효하지 않다면 다시 유저가 정보를 입력하도록 하여 정보가 유효한지 검사한 후에 Keychain 아이템을 다시 업데이트하게 됨.
기본적으로 앱은 자기 자신의 Keychain에만 접근할 수 있음. iOS에서 Keychain의 위치는 샌드박스 외부이므로, 앱을 삭제해도 Keychain에 저장된 정보는 삭제되지 않음. keychain 그룹을 사용하면 서로 다른 앱에서도 저장된 데이터를 공유할 수 있고, 비밀번호나 개인키와 같이 보호가 필요한 항목은 암호화되어 Keychain에 저장됨.
Keychain은 여러 개의 Keychain 아이템을 가질 수 있고, 아이템 클래스를 통해 저장되는 데이터의 종류를 지정할 수 있음. 대표적으로 웹 사이트용 아이디와 비밀번호를 저장할 때는 kSecClassInternetPassword를 사용하고, 인증서를 저장할 때는 kSecClassCertificate, 일반 비밀번호를 저장할 때는 kSecClassGenericPassword를 사용함.
그리고 이런 Item Class 별로 존재하는 다양한 attribute들을 통해 속성을 지정하여 사용함. 만약 여러 개의 계정을 가질 수 있는 서비스에서 각 계정에 대한 token을 관리한다면, Item Class로 kSecClassGenericPassword를 사용하고, 필요한 attribute들을 설정하면 됨. 대표적으로 어떤 앱에서 사용되는 token인지 표시하는 kSecAttrService, 어떤 사용자의 인증토큰인지 식별하는 데에 사용되는 kdSecAttrAccount 등이 있음.
주요 Item Class 및 Attributes
Item Class
kSecClassGenericPassword
kSecAttrService: 키체인 아이템과 연관되어 있는 서비스의 이름
kSecAttrAccount: 저장할 아이템의 계정 이름 (아이디)
kSecAttrGeneric: 저장할 아이템의 데이터 (비밀번호)
kSecClassInternetPassword
kSecAttrAccount: 저장할 아이템의 계정 이름 (아이디)
kSecClassCertificate
kSecClassKey
kSecClassIdentity
Attributes
kSecMatchLimit: 키의 값을 저장할 경우, 이 값은 반환하거나 다른 조치를 취할 최대 결과 수를 지정
kSecMatchLimitOne
kSecMatchLimitAll
kSecReturnAttributes: 키의 값으로 true를 저장할 경우, CFDictionary 타입으로 반환
kSecReturnData: 키의 값으로 true를 저장할 경우, CFData 타입으로 반환
🎯 Core Data
CloudKit를 사용하여 단일 장치에서 데이터를 유지 또는 캐시 하거나 데이터를 여러 장치에 동기화하세요.라고 말함.
Core Data를 사용하면 오프라인 사용을 위해 애플리케이션의 영구 데이터를 저장하고, 임시 데이터를 캐시 하고, 단일 기기에서 앱에 실행 취소 기능을 추가함. 단일 iCloud 계정의 여러 기기에서 데이터를 동기화하기 위해 Core Data는 스키마를 CloudKit 컨테이너에 자동으로 미러링 함.
공식문서를 보면 Core Data는 '프레임워크' 라고함. Core Data는 DB도 아니고, 데이터를 유지하기 위한 API개념도 아닙니다. 앱의 모델 계층이며, 객체 그래프를 관리하는 프레임워크라고 임. 객체 그래프를 디스크에 저장해서 Persistence 가능을 이용하는 것이기 때문임.
객체 그래프 - 메모리에 있는 객체들과 그 객체들 간의 관계를 이야기함.
Person이라는 객체와 Family라는 객체가 위와 같은 관계로 메모리에 올라간다고 했을 때, 객체들이 어떤 관계를 갖고 있는지를 객체 그래프라고 하는 것임.
Persistence - 영속성?
Core Data는 객체를 저장소에 매핑하는 세부 정보를 추상화하므로 데이터베이스를 직접 관리하지 않고도 Swift 및 Objective-C에서 데이터를 쉽게 저장할 수 있음.
데이터 변화를 추적해서 되돌리기(Undo), 재실행(Redo) 등을 적용할 수 있음
Core Data는 변경사항을 추적해서 개별적으로, 그룹으로 또는 한 번에 모두 롤백할 수 있어서 얍에 실행 취소 및 다시 실행을 쉽게 구현할 수 있음.
백그라운드 데이터 작업
JSON을 개체로 구문 분석하는 등 UI를 차단할 수 있는 데이터 작업을 백그라운드에서 수행함. 그런 다음 결과를 캐시 하거나 저장하여 서버 왕복을 줄일 수 있음.
동기화 보기
Core Data는 또한 테이블 및 컬렉션 뷰에 대한 데이터 소스를 제공하여 뷰와 데이터의 동기화를 유지하는 데 도움이 됨.
버전 관리 및 마이그레이션
핵심 데이터에는 앱이 발전함에 따라 데이터 모델 버전을 관리하고 사용자 데이터를 마이그레이션 하는 메커니즘이 포함되어 있음.
Core Data Stack
앱의 모델 계층을 관리하고 유지함.
Model(NSManagedObjectModel)
Core Data에서 관리하는 객체들과 그 객체들 사이의 관계를 표현한 데이터모델 (객체 그래프) 파일을 의미.
Store Coordinator(NSPersistenceStoreCoordinator)
Model에 의해 정의된 데이터들이 실제로 저장된 Persistance store을 관리하는 객체이다. Persistence store에서 데이터를 가져오고, 저장될 때 데이터가 올바른지 검증하는 역할 또한 수행.
Context(NSManagedObjectContext)
Persistence Store뷰에 해당하는 객체.
해당 객체를 통해서 원하는 데이터를 가져오고 조작하고, 원하면 Persistence store에 반영할 수 있음.
Persistence Container(NSPersistenceContainer) - iOS 10 이상
위 3개의 요소를 간편하게 사용할 수 있도록 추상화시켜 놓은 객체.
iOS 10 이전에는 위 3개 요소를 개발자가 직접 초기화해서 사용했지만, iOS 10 이상부터는 NSPersistenceContainer를 이용해서 간단하게 3개 요소를 한꺼번에 초기화할 수 있게 됨.
Core Data는 아주 단순하면서 강력한 도구로 기본 데이터 모델부터 복잡한 형식까지 모든 형식의 데이터를 저장할 수 있음.
Core Data는 저장 기능 외에도 실행 취소 및 다시 실행 작업을 수행할 수 있음. 또한 성능이 매우 우수하며 데이터를 검색하고 찾아오는 시간이 매우 빠름.
🎯 SQLite
SQLite는 전 세계적으로 많이 사용되는 데이터 베이스 엔진이며 오픈소스임.
서버가 필요 없는 SQL 데이터 베이스 엔진을 구현함.
SQLite는 Mac OS X, iOS, Android, Linux, Window에서 접근할 수 있음.
ANSI(American National Standards Institute)-C로 작성된 것처럼 사용하기 쉬운 프로그래밍 인터페이스를 제공함.
SQLite는 매우 작고 가벼워 전체 데이터 베이스를 하나의 디스크파일에 저장할 수 있음.
SQLite는 서버로부터 독립적이고, 설정이 간편함.
또한 여러 프로세스와 스레드로부터 접근이 안전하여 많이 쓰임.
그리고 열이 있는 테이블에 데이터를 쉽게 저장함.
Sandbox부터 iOS 앱에서 데이터를 저장하는 방법에 대해서 정말 간단하게 알아봤음.
솔직히 안 사용해 보고 이론만 공부하다 보니 와닿는 것도 없고 너무 어려웠음... 적용을 해보면 이해가 되는 부분이 많다고 생각함!!