[swift] 코어 데이터 백업

코어 데이터(Core Data)는 iOS나 macOS 애플리케이션에서 데이터를 관리하는 프레임워크입니다. 데이터를 백업하는 것은 중요한 작업 중 하나입니다. 이번 블로그 포스트에서는 코어 데이터를 백업하는 방법을 알아보겠습니다.

백업 위치 설정하기

먼저, 백업할 데이터베이스 파일의 저장 위치를 설정해야 합니다. 기본적으로 코어 데이터는 앱의 도큐멘트 디렉토리에 데이터베이스 파일을 저장합니다. 하지만 백업에 적합한 위치를 사용하고 싶을 수도 있습니다. 아래와 같이 백업 위치를 설정할 수 있습니다.

let fileManager = FileManager.default
let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
let backupDirectory = appSupportDirectory?.appendingPathComponent("Backup")

if !fileManager.fileExists(atPath: backupDirectory.path) {
    do {
        try fileManager.createDirectory(at: backupDirectory, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print("Failed to create backup directory: \(error)")
    }
}

let storeURL = backupDirectory?.appendingPathComponent("MyApp.sqlite")

위의 코드는 앱의 Application Support 디렉토리 내에 “Backup”이라는 폴더를 생성하고, “MyApp.sqlite”라는 이름의 백업 파일을 저장할 준비를 합니다. 이제 코어 데이터 스택을 초기화할 때 이 위치를 사용할 수 있습니다.

백업 수행하기

이제 코어 데이터의 백업을 수행하는 방법을 알아보겠습니다.

let sourceURL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("MyApp.sqlite")
let fileManager = FileManager.default

if fileManager.fileExists(atPath: sourceURL.path) {
    do {
        try fileManager.copyItem(at: sourceURL, to: storeURL)
        print("Successfully backed up core data store")
    } catch {
        print("Failed to backup core data store: \(error)")
    }
}

위의 코드는 기존의 데이터베이스 파일(sourceURL)을 백업 폴더(backupDirectory)로 복사하는 역할을 합니다. 이로써 코어 데이터의 백업이 완료되었습니다.

주기적인 백업 예약하기

마지막으로, 주기적인 자동 백업을 예약하는 방법을 알아보겠습니다. iOS나 macOS에서는 NSPersistentStoreCoordinator를 사용하여 주기적인 백업을 관리할 수 있습니다. 다음 코드를 참고하세요.

func scheduleBackgroundBackup() {
    let backupQueue = DispatchQueue(label: "com.example.app.backup", qos: .background, attributes: .concurrent)
    backupQueue.async {
        let persistentContainer = NSPersistentContainer(name: "MyApp")
        persistentContainer.loadPersistentStores { _, error in
            if let error = error {
                print("Failed to load persistent store: \(error)")
                return
            }
            
            let backupRequest = NSPersistentStoreRequest(backup: true)
            
            do {
                try persistentContainer.persistentStoreCoordinator.execute(backupRequest, with: persistentContainer.viewContext)
                print("Successfully performed background backup")
            } catch {
                print("Failed to perform background backup: \(error)")
            }
        }
    }
}

// 주기적인 백업 예약
let timer = Timer(fire: Date(), interval: 3600, repeats: true) { _ in
    scheduleBackgroundBackup()
}
RunLoop.current.add(timer, forMode: .common)

위의 코드는 백그라운드 스레드에서 NSPersistentContainer를 사용하여 백업 작업을 수행합니다. 또한, Timer를 사용하여 1시간마다 주기적인 백업을 예약합니다.

이제 코어 데이터를 백업하는 방법과 주기적인 백업을 예약하는 방법에 대해 알아보았습니다. 데이터의 안전한 보호를 위해 적절한 백업 정책을 구현하는 것이 중요합니다.

참고 자료