스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
SwiftData로 마이그레이션하기
앱에서 SwiftData를 사용하는 방법을 알아보세요. Xcode를 사용하여 기존 Core Data 객체 모델에서 모델 클래스를 생성하는 방법, 이전의 구현과 함께 SwiftData를 사용하는 방법, 기존 솔루션을 완전히 대체하는 방법을 알아 보세요. 이 세션을 시청하기 전에 'SwiftData 알아보기'를 시청하세요.
챕터
- 0:00 - Intro
- 1:06 - Generate model classes
- 3:05 - Complete adoption
- 6:43 - Coexists with Core Data
- 10:47 - Wrap-up
리소스
관련 비디오
WWDC23
-
다운로드
♪ ♪
안녕하세요 저는 루비나입니다 오늘 알려 드릴 내용은 Core Data 앱을 SwiftData로 마이그레이션하는 방법입니다 Core Data와 병행할 수 있는 Swift 네이티브 영구 프레임워크죠 Core Data 앱에 SwiftData를 도입하는 일반적인 사례를 살펴보겠습니다 SwiftData로 완전히 전환하는 경우와 병행해서 사용하며 점차 바꿔나가는 경우 모두에 유용하죠 우선 Managed Object Model Editor 지원을 사용해 SwiftData 모델 클래스를 생성하는 방법을 알아볼게요 다음으로 기존 Core Data 앱에 SwiftData를 완전히 도입하는 절차를 보여 드리죠 마지막은 Core Data와 SwiftData를 병행하는 방법인데요 SwiftData로 완전히 전환하는 게 어려운 경우를 위한 방법입니다 먼저 모델 클래스 생성의 절차부터 설명할게요 SwiftData에서는 코드 기반의 모델을 사용하여 스키마를 설정하는 방식으로 전환하는데요 이러한 작업은 Core Data의 관리 객체 모델을 이용해 SwiftData 모델을 생성하면 쉽게 할 수 있습니다 이러한 전환을 어떻게 하는지 보여 드리죠 SampleTrips라는 Core Data 앱을 만들었습니다 다가올 여행의 일정 계획을 도와주는 앱인데요 이 모델 파일에 들어 있는 것은 제 데이터와 조직화된 정보입니다 포함된 엔티티는 Trip과 LivingAccommodation BucketListItem이죠 각 여행에 해당하는 숙박 시설 한 곳과 버킷 리스트 항목이 원하는 여행 활동에 맞게 조직되어 있습니다 이제부터 SwiftData 클래스를 생성하여 동일한 정보를 캡처하겠습니다 Core Data 관리 객체 모델은 이러한 SwiftData 클래스 생성에 필요하지 않습니다 기존의 Core Data 모델이 있다면 해당 모델을 사용하여 쉽게 SwiftData를 생성할 수 있습니다 기존 모델에 있는 조직을 기반으로 말이죠 사용 예를 보여 드릴게요 Managed Object Model Editor 지원을 통해 진행합니다 모델 파일을 선택하고 메뉴 막대를 탐색합니다 Editor를 선택하고 Create SwiftData Code를 누릅니다 그러면 기존 엔티티 세 개의 파일을 생성할 수 있습니다 SwiftData 모델을 새로 만들어 새 Swift 앱 만들기도 가능하며 이 경우 지원은 필요하지 않습니다 방금 생성한 파일들입니다 Swift 유형은 Model을 따라야 하며 각 유형은 엔티티 정보를 변수로 캡처합니다 속성도 포함되죠 Trip의 이름과 목적지 시작 및 종료 날짜와 다른 엔티티인 LivingAccommodation BucketListItem과의 관계입니다 다음은 SwiftData를 완전히 도입하는 프로세스입니다 SwiftData로 앱을 완전히 마이그레이션하면 Core Data 스택이 SwiftData 스택으로 대체되어 SwiftData로 Swift 네이티브 언어를 활용합니다 더 읽기 쉬운 코드를 사용하여 데이터를 지속할 수 있고 일부 기능을 암시적으로 관리할 수 있죠 하지만 전환하기 전에 기존 Core Data 모델 디자인이 어떤 구조인지 고려하세요 Core Data 모델 디자인은 스키마를 참조하는데 이는 엔티티와 프로퍼티 관계성을 아우릅니다 Core Data 모델 설계가 SwiftData에서도 지원되는지 확인해야 합니다 Core Data에 정의된 각 엔티티에 대해 엔티티 이름과 프로퍼티가 정확히 일치하는 모델 유형이 SwiftData에도 있어야 하죠 여러분의 모델을 철저히 테스트하여 SwiftData에서 모든 기능이 지원되는지 확인하세요 Core Data 앱에 SwiftData를 완전히 도입하는 프로세스의 주요 내용을 자세히 살펴보겠습니다 제 모델을 캡처하기 위해 Swift 유형을 생성해 두었습니다 파일이 준비되면 이전에 사용하던 Core Data 관리 객체 모델 파일은 삭제해도 됩니다 대신 Swift 파일로 모델을 관리할 수 있죠 또한 Core Data 스택 설정에 쓰였던 Persistence 파일도 삭제해도 됩니다 이제 SwiftData 스택을 위한 modelContainer를 설정할 수 있습니다 modelContainer는 그룹의 모든 윈도우가 영구 컨테이너에 액세스하도록 설정하는 수정자입니다 이 컨테이너를 TipsApp에 추가해 컨테이너와 컨텍스트를 둘 다 설정합니다 modelContainer도 환경에 기본 ModelContext를 생성하고 설정하니까요 ModelContext는 앱 유형 인스턴스의 변화 추적에 쓰입니다 이 환경 프로퍼티를 사용하여 모든 씬과 뷰에서 읽을 수 있죠 이제 SampleTrips를 위한 SwiftData 영구 스택이 설정됐지만 변경할 사항이 몇 가지 남았습니다 우선 객체를 생성하는 방법부터 보여 드릴게요 기존 Core Data에서는 이렇게 새 Trip을 만들었습니다 Trip의 인스턴스를 생성하고 속성을 설정하기 전에 관리 객체 컨텍스트를 전달하죠 SwiftData에서는 Trip의 새 인스턴스를 코드 한 줄로 만들 수 있어요 비교적 읽기가 쉽죠 새 여행을 만들었으면 모델 컨텍스트에 삽입하여 지속시킵니다 Trip을 지속시켰으니 이제 저장하는 법을 알아보죠 이후에 발생할 변경 사항을 저장하는 법도요 SwiftData의 암시적 저장 기능은 가능하면 컨텍스트가 변경된 후 UI 수명 주기 이벤트와 타이머에 저장을 트리거합니다 따라서 컨텍스트에 호출되는 Core Data의 명시적 저장을 지우고 컨텍스트가 변경될 때 암시적 저장에 의존해 데이터를 지속할 수 있죠 이제 데이터를 가져오는 법을 보여 드릴게요 Core Data에서처럼 가져오기 요청을 하는 대신 쿼리를 사용해 예정된 여행의 전체 목록을 가져올 수 있습니다 여행 어레이를 쿼리로 래핑해서요 SwiftData 컨테이너에서 Trip 객체를 가져오는 거죠 또한 쿼리의 정렬 순서를 정의했습니다 여행 시작 날짜에 따라 순차적으로 정렬하여 가장 가까운 여행이 맨 위에 오도록 하고 싶거든요 쿼리는 술부를 포함해야 하는 경우에도 사용할 수 있습니다 이제 Core Data 앱을 SwiftData로 완전히 마이그레이션하는 법을 알았으니 이번에는 그 둘을 병행해 사용하는 법을 알아보겠습니다 항상 완전한 마이그레이션을 실행할 수 있는 건 아니죠 이런 경우에는 SwiftData로 부분 전환을 할 수 있습니다 병행하는 경우는 완전히 별개인 두 영구 스택이 있을 때입니다 하나의 Core Data 스택과 하나의 SwiftData 스택이 동일한 영구 스토어와 통신할 때죠 이때는 SwiftData 코드를 추가하려고 기존 Core Data 코드를 새로 쓸 필요가 없어요 이 방법을 쓰면 SwiftData를 앱에 더 유연하게 도입할 수 있습니다 Cord Data에 이미 데이터가 있든 아니면 다른 제약 때문에 SwiftData로 완전히 전환할 수 없는 경우든 상관없죠 다음은 두 스택이 동일한 스토어와 통신하도록 설정하는 방법입니다 영구 저장소를 로드하기 전에 컨테이너 설명을 위한 영구 저장소 URL을 설정해서 두 스택이 같은 URL에 작성하도록 해야 합니다 추가로 영구 기록 추적도 활성화해야 하죠 SwiftData는 자동으로 영구 기록을 추적하지만 Core Data는 아닙니다 Core Data와 SwiftData가 같은 앱에 공존하는 채로 영구 저장소를 열려고 하는데 영구 기록이 설정돼 있지 않으면 저장소는 읽기 전용 모드가 되죠 병행은 다른 경우에도 훌륭한 옵션이 될 수 있습니다 기존 고객에게 하위 호환성을 제공하는 경우도 있죠 SwiftData는 iOS17과 macOS Sonoma에서만 쓸 수 있으므로 SwiftData로 완전히 전환하면 현재의 Core Data 앱이 영향을 받을 수 있습니다 혹은 리소스 제약으로 인해 SwiftData로 완전히 전환하는 게 어려울 수도 있죠 이럴 땐 SwiftData를 부분적으로 통합하는 게 적절합니다 SwiftData로 새로운 개발을 수행하거나 앱의 일부만 SwiftData로 전환하는 것이죠 Core Data와 SwiftData를 병행할 때 지켜야 하는 필수 사항이 몇 가지 있습니다 첫째, 기존 NSManagedObject 기반 엔티티 하위 클래스나 SwiftData 클래스를 네임스페이스하여 충돌을 방지하세요 두 클래스에 같은 이름을 붙일 수 없으므로 하나는 바꿔야 한다는 뜻이죠 주의할 점은 클래스 이름을 바꿀 때 엔티티 이름은 그대로 둬야 한다는 겁니다 계속해서 SampleTrips를 예시로 보겠습니다 이번에는 Core Data와 SwiftData를 병행해서 써 보죠 클래스 이름 두 개가 충돌합니다 SwiftData와 Cord Data의 Trip을 구별하기 위해 Core Data의 Trip 클래스 이름을 CDTrip으로 변경합니다 Managed Object Model Editor로도 이렇게 할 수 있어요 또한 Core Data와 SwiftData 스키마를 동기화해야 합니다 SwiftData 스키마의 새 부분은 NSManagedObjectModel로 구현해야 하며 두 스키마는 나뉠 수 없습니다 즉 프로퍼티와 관계를 정확히 같은 방식으로 모델에 추가해야 하죠 이는 엔티티 버전 해시를 항상 일치시키기 위함입니다 일치하지 않는 해시는 잠재적으로 마이그레이션을 트리거하고 남기고 싶었던 정보를 삭제할 수도 있거든요 마지막으로 둘을 병행할 때는 스키마 버전을 계속 추적해야 합니다 SwiftData 모델의 여러 버전을 작업할 때 변경 사항이 제대로 나타나는지 확인하세요 그래야 SwiftData가 차이점을 평가할 수 있어요 이 작업에는 몇 가지 방법이 있습니다 'SwiftData로 스키마 모델링하기' 세션에서 스키마 버전 사용법을 알아보세요 UIKit나 AppKit에 의존하는 Swift 앱의 경우 SwiftData를 사용하는 옵션도 있습니다 첫 번째 접근 방식은 병행 솔루션입니다 UIKit 코드를 Core Data에 바인딩하면 SwiftData와 평행하게 작업할 수 있어요 또는 SwiftData 클래스를 Swift 클래스로 취급해 Swift 코드를 UIKit 코드로 래핑해도 되죠 여기까지입니다 이제 Core Data 앱을 SwiftData로 완전히 혹은 점진적으로 유연하게 마이그레이션해 보세요 또한 다른 세션을 통해 SwiftData에 대해 더 자세히 알아보시기 바랍니다 함께해 주셔서 감사합니다 여러분의 작업을 기대할게요 ♪ ♪
-
-
4:37 - Creating a ModelContainer in SwiftUI
@main struct TripsApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer( for: [Trip.self, BucketListItem.self, LivingAccommodation.self] ) } }
-
4:57 - Object creation in Core Data
@Environment(\.managedObjectContext) private var viewContext let newTrip = Trip(context: viewContext) newTrip.name = name newTrip.destination = destination newTrip.startDate = startDate newTrip.endDate = endDate
-
5:30 - Object creation in SwiftData
@Environment(\.modelContext) private var modelContext let trip = Trip( name: name, destination: destination, startDate: startDate, endDate: endDate ) modelContext.insert(object: trip)
-
6:16 - Fetch with Query in SwiftData
@Query(sort: \.startDate, order: .forward) var trips: [Trip]
-
7:30 - Setting store path and enabling persistent history tracking in Core Data
let url = URL(fileURLWithPath: "/path/to/Trips.store") if let description = container.persistentStoreDescriptions.first { description.url = url description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey) }
-
9:11 - Ensuring Core Data and SwiftData class names are unique
class CDTrip: NSManagedObject { // ... } @Model final class Trip { // ... }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.