[CoreData] inMemory store

정유진·2022년 7월 26일
0

database

목록 보기
1/1
post-thumbnail

🤔 들어가기

SwiftUI 프로젝트를 생성하며 Use Core Data를 체크할 경우, CoreData를 쉽게 사용할 수 있도록 default snippet이 함께 작성된다. 그 중에서 특히 PersistentContainer를 init() 하는 코드에서 나오는 inMemory 라는 개념이 무엇인지, 어떤 효과를 가지게 되는지 궁금해졌다. 아래의 코드를 보면 inMemory 인자 값이 true일 경우 container의 persistentStoreDescriptions에 접근하여 url을 수정하는 것을 확인할 수 있다. 그러니까 도대체 왜?

💥 PersistenceController init

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
    }
  • 당연히 Controller의 이름은 무엇이라도 상관없다.
  • 그저 이 컨트롤러가 view마다 공유 가능한 PersistenceController()를 싱글톤 property로 가지고 있기만 하면 된다. (static let shared)
  • @main에서 PersistenceController를 init하고 그렇게 생성된 static shared 객체를 view마다 들고다니며 재사용할 것이다.
  • container는 <Core Data 스택>을 캡슐화한 객체로 생성/관리를 모두 매니징하는 마법사 또는 관리자🧙‍♂️ 정도로 이해하면 된다.
  • init할 때에 내가 생성한 CoreData DataModel의 이름과 일치해야 함을 주의 ("MyProject" == DataModel 이름)

🐣 In Memory Store?

https://useyourloaf.com/blog/core-data-in-memory-store/

  • Core Data 스택은 on-disk SQLite store을 사용하는 것이 기본 값
  • 이 경우 테스트나 SwiftUI 프리뷰 속도가 느려지기 때문에
  • 프리뷰에 넣을 viewContext는 inMemory container에서 가져온다.
  • inMomory store를 생성하는 방법은 2가지
  • 반드시 loadPersistentStores 전에 이루어져야 한다.
// .NSSQLiteStoreType이 default
storeDescription.type = NSInMemoryStoreType // old way

// WWDC 2018 이후 제시된 방법
storeDescription.url = URL(fileURLWithPath: "/dev/null")
  • 이 경우 우리는 여전히 SQLite store를 사용하지만
  • disk에 쓰지 않고 메모리에 저장된다.

🤷‍♀️ /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에서는 한결 사용하기가 편해진 것 같다. 의미를 이해하는 것과는 별개로...

profile
느려도 한 걸음 씩 끝까지

1개의 댓글

comment-user-thumbnail
2024년 1월 15일

좋은글 감사해요~

답글 달기