SwiftUI 프로젝트를 생성하며 Use Core Data를 체크할 경우, CoreData를 쉽게 사용할 수 있도록 default snippet이 함께 작성된다. 그 중에서 특히 PersistentContainer를 init() 하는 코드에서 나오는 inMemory
라는 개념이 무엇인지, 어떤 효과를 가지게 되는지 궁금해졌다. 아래의 코드를 보면 inMemory 인자 값이 true일 경우 container의 persistentStoreDescriptions에 접근하여 url을 수정하는 것을 확인할 수 있다. 그러니까 도대체 왜?
struct PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "MyProject")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { ( _, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
container.viewContext.automaticallyMergesChangesFromParent = true
}
PersistenceController()
를 싱글톤 property로 가지고 있기만 하면 된다. (static let shared
)container
는 <Core Data 스택>을 캡슐화한 객체로 생성/관리를 모두 매니징하는 마법사 또는 관리자🧙♂️ 정도로 이해하면 된다.// .NSSQLiteStoreType이 default
storeDescription.type = NSInMemoryStoreType // old way
// WWDC 2018 이후 제시된 방법
storeDescription.url = URL(fileURLWithPath: "/dev/null")
https://www.hackingwithswift.com/forums/swiftui/coredata-persistentstore-location-question/7980
나와 같은 의문을 가진 사람이 21년 5월에 존재했다.
위와 같은 코드로 동작했을 때 정상적으로 잘 동작하게 되지만, 나는 /dev/null
이라는 URL이 거슬리기 시작했다. 대체 저 위치가 어디인가? 딱 보았을 때 엉터리 주소로 보였기 때문에 아무리 test, preview 용이라고 하더라도 다른 위치에 저장해야 하는 것이 아닐까? 하는 의문...하지만 위 링크의 답변에도 적혀있듯이 저 URL을 사용하기 때문에 우리는 매번의 run을 할 때마다 비어있는 store에서 빠르게 시작할 수 있는 것이다. 애초에 재사용할 데이터를 저장할 때엔 inMemory는 false인 PersistentContainer를 사용한다.
맨 처음에 storyBoard에 CoreData를 적용할 때에는 러닝커브가 너무 높다고 생각했는데 SwiftUI에서는 한결 사용하기가 편해진 것 같다. 의미를 이해하는 것과는 별개로...
좋은글 감사해요~