해당 글에서는 Swift에서 데이터를 저장하고 읽을 수 있는 공간을 위해 NotificationCenter, UserDefalts, AppGroup(FileManager)에 대해서 이해를 돕기 위한 목적으로 작성하였습니다
1) NotificationCenter
💡 NotificationCenter 이란?
- 앱 내에서 발생한 이벤트를 다른 객체에게 알리기 위해 사용됩니다. 이벤트를 post 하면 해당 이벤트를 구독하고 있는 객체들이 이벤트를 받아 처리할 수 있습니다. - NotificationCenter는 앱이 실행되는 동안 메모리에 상주하므로 앱이 종료되면 저장되지 않습니다.
// 데이터를 전송하는 측에서
let data = ["key": "value"]
NotificationCenter.default.post(name: Notification.Name("notificationName"), object: nil, userInfo: data)
// 데이터를 수신하는 측에서
NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(_:)), name: Notification.Name("notificationName"), object: nil)
@objc func handleNotification(_ notification: Notification) {
if let data = notification.userInfo as? [String: Any], let value = data["key"] as? String {
// 데이터 처리
}
}
2) UserDefaults
💡 UserDefaults란?
- 간단한 데이터를 저장하기 위해 사용되며 주로 앱의 설정 정보를 저장하는데 사용됩니다. - 앱이 실행되는 동안 메모리에 상주하며, 앱이 종료되어도 데이터는 유지됩니다. - 앱에서 사용자 정보를 저장하고 불러오는데 사용되는 객체이며 앱의 설정 값이나 사용자 정보와 같은 작은 데이터를 저장하기에 적합합니다. - 구조는 키-값 쌍으로 데이터를 저장하고 이를 식별하는 키를 사용하여 데이터를 저장 및 조회합니다. 이러한 데이터는 앱이 종료되거나 다시 시작되더라도 유지됩니다.
// 데이터 저장
UserDefaults.standard.set("value", forKey: "key")
// 데이터 불러오기
if let value = UserDefaults.standard.string(forKey: "key") {
// 데이터 처리
}
3) AppGroup(FileManager)
💡 AppGroup 이란?
- 같은 개발자 계정에 속한 앱들이 데이터를 공유할 수 있도록 해줍니다. - AppGroup으로 저장 가능한 데이터 유형은 UserDefaults와 유사하지만, 추가적으로 파일을 저장할 수 있습니다.
💡 FileManager 란?
- iOS에서 파일과 디렉토리를 관리하는 데 사용되는 클래스 중 하나이며 iOS 앱에서 파일 및 디렉터리를 생성, 복사, 이동, 삭제하는 등의 작업을 수행할 수 있습니다. 또한, 파일의 내용을 읽고 쓰는 것과 같은 파일 작업도 수행할 수 있습니다. - FileManager 클래스는 iOS에서 파일 및 디렉토리의 경로를 가져오는 데에도 사용됩니다. 이 클래스를 사용하면 iOS 앱에서 파일을 보관하고 관리하는 데 필요한 다양한 작업을 수행할 수 있습니다.
// 데이터 저장
let fm = FileManager.default
if let url = fm.containerURL(forSecurityApplicationGroupIdentifier: "groupIdentifier") {
let fileUrl = url.appendingPathComponent("fileName")
let data = "value".data(using: .utf8)
try? data?.write(to: fileUrl)
}
// 데이터 불러오기
if let url = fm.containerURL(forSecurityApplicationGroupIdentifier: "groupIdentifier") {
let fileUrl = url.appendingPathComponent("fileName")
let data = try? Data(contentsOf: fileUrl)
if let value = String(data: data ?? Data(), encoding: .utf8) {
// 데이터 처리
}
}
4) 저장소 비교
특징
NotificationCenter
UserDefaults
AppGroup (FileManager)
사용 목적
애플리케이션 내 객체 간 데이터 브로드캐스팅 목적으로 사용됨
간단한 데이터를 저장하고 관리할 때 사용됨
애플리케이션 및 해당 확장 프로그램 간 데이터 공유를 위해 사용됨
데이터 유형
모든 유형
기본 유형, 배열, 사전 및 데이터
공유 컨테이너에 저장된 파일 및 데이터
저장 위치
앱 내부 메모리에 저장이 됩니다.
데이터가 앱 내에 저장이 됩니다. ~/Library/Preferences/{Bundle Identifier}.plist
데이터가 앱 내에 저장이 됩니다. ~/Library/Group Containers/{Group Identifier}/shared/{file name}
저장 제한
데이터를 저장하는것이 아닌 메모리에 저장하기에 저장 용량 제한이 없습니다.
기본적으로 약 4KB의 용량 제한이 있으며, 이는 사용자가 iOS 기기에서 설정한 용량 제한에 따라 달라질 수 있습니다.
앱 그룹을 사용하여 공유되는 파일 시스템의 용량 제한은 기기의 용량 제한에 따라 달라집니다.
동기화
옵저버를 등록한 객체에 대해 데이터 갱신이 발생할때 동기화 수행
자동으로 동기화됨
자동으로 동기화됨
사용 예시
이벤트 발생 시 다른 객체들에게 전달할때 사용
앱의 사용자 정보 및 설정 정보를 받는데 사용
앱 그룹을 이용하여 두 개 이상의 앱에서 동일한 파일을 공유하거나, 데이터를 공유하는 경우에 사용됩니다.