적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

CloudKit 이란? (+ Core Data, SwiftData)

hongssup_ 2025. 3. 15. 19:14
반응형

CloudKit

: Store structured app and user data in iCloud containers that all users of your app can share.

https://developer.apple.com/documentation/cloudkit

 

iCloud 기반의 백엔드 서비스로, 별도의 서버 없이 데이터를 클라우드에 저장하고 동기화할 수 있도록 해준다. 

 

1. 데이터 저장 및 관리

- iCloud의 Public(공개), Private(사용자), Shared(공유) Database를 사용하여 데이터를 저장하고 관리할 수 있음

- 네트워크 요청 없이 로컬에서 동작하는 캐싱 기능도 제공

- Core Data + CloudKit 연동 가능

2. 실시간 동기화

- iCloud를 통해 여러 기기에서 자동 동기화

- 푸시 알림을 통해 데이터 변경 사항 감지 가능

3. 서버 구축 없이 클라우드 기능 사용

- 별도의 백엔드 서버 구축할 필요 없이 iCloud 서버에서 데이터 관리

- API 요청 없이 앱에서 직접 CloudKit 프레임워크를 사용해 데이터 CRUD(Create, Read, Update, Delete) 가능

4. 보안 및 접근 제어

- 사용자의 iCloud 계정을 기반으로 인증, 권한 관리가 자동 처리됨

- Public Database는 모든 사용자가 접근 가능, Private Database는 개인 데이터 관리 기능

A valid iCloud account is only necessary when you want to save data that is specific to a single user. Apps can always store data in a public area that is readable by all users.

 

제한

- Apple 에서 지원하는 OS 전용(Android, Web 지원 없음)

- 데이터 저장 제한 : 무료로 제공되는 iCloud Storage 를 사용하므로 사용자당 저장 용량 제한 있음

- 네트워크 의존 : 오프라인 캐싱이 가능하지만, 데이터 동기화에는 인터넷 연결이 필요

 

 

🤔 그렇다면 CloudKit 가 Core Data를 대체할 수 있는건가? 

CloudKit isn’t a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing the transfer of data to and from iCloud servers. Because it provides minimal offline caching support, CloudKit relies on the presence of the network and, optionally, a valid iCloud account.

 

공식문서에도 나와 있듯이, 기존 데이터를 대체하는 거라기 보다는 보완하는 서비스에 가깝다. 

 

Core Data

디스크 기반 저장소(SQLite) 를 활용하므로, 속도가 중요한 경우 빠른 검색/쿼리가 필요할 때 유리하다. 

데이터 모델이 복잡해 많은 관계형 데이터를 다뤄야 한다면 Core Data가 필요

 

 

Core Data + CloudKit

최근에는 Core Data와 CloudKit 을 함께 사용한는 것이 일반적이다. 

Core Data로 로컬 저장소를 유지하면서

CloudKit을 사용해 iCloud와 자동 동기화하면

오프라인에서도 사용 가능하고, 여러 기기에서도 동일한 데이터를 유지할 수 있다. 

즉, 로컬 데이터가 필요한 경우 Core Data를 유지하고, 클라우드 동기화가 필요하면 CloudKit를 추가하는 것이 좋은 방법

 

Core Data + CloudKit 동기화 - NSPersistentCloudKitContainer를 사용하여 쉽게 구현할 수 있다.

let container = NSPersistentCloudKitContainer(name: "MyAppModel")

 

 

SwiftData + CloudKit

SwiftData는 Core Data 의 대체 기술로, 

기본적으로 CloudKit을 지원하므로 별도의 CloudKit 설정없이 자동으로 연동 및 동기화가 되고 추가 설정이 필요없다. 

but iOS 17 이상에서만 지원하기 때문에 프로젝트에 따라 사용이 제한적..

프로젝트 최소 지원 버전이 iOS 17 이상이라면 SwiftData를 사용하는 것이 훨씬 이득!

 

다음과 같이 기본적인 모델 정의(@Model)만 해주면 별도 추가 설정없이 자동으로 동기화가 된다.

 

import SwiftData
import SwiftUI

@Model
class Task {
    var title: String
    var isCompleted: Bool
    
    init(title: String, isCompleted: Bool = false) {
        self.title = title
        self.isCompleted = isCompleted
    }
}

struct TaskListView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var tasks: [Task]

    var body: some View {
        List(tasks) { task in
            Text(task.title)
        }
        .toolbar {
            Button("추가") {
                let newTask = Task(title: "새로운 작업")
                modelContext.insert(newTask)
            }
        }
    }
}
728x90
반응형