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)
}
}
}
}
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift] UISwipeGestureRecognizer 를 이용한 스와이프 액션을 파헤쳐보자 ! (0) | 2023.07.28 |
---|---|
[Swift iOS] 화면 스와이프 swipe to pop / swipe back (+ RxGesture) (0) | 2023.07.17 |
[Swift iOS] Lottie Animation 적용하기 (+ multiple animation) (0) | 2023.07.13 |
enum case 예외 처리 (default 값 설정) (0) | 2023.07.04 |
[Swift] Why double is preferred over float? (+ Int / Int32 / Int64) (0) | 2023.04.13 |