본문 바로가기
Swfit/Database

CoreData 사용하기

by GGShin 2023. 1. 9.

안녕하세요!

iOS에서 local database로 주로 사용하는 몇 가지 db 프레임워크나 라이브러리가 있습니다.

이번에는 Apple에서 제공하는 CoreData 프레임워크의 사용 방법에 대해서 알아보도록 하겠습니다. 

 

CoreData란?

Persist or cache data on a single device, or sync data to multiple devices with CloudKit.

Data를 하나의 기기 내부에 저장 또는 cache하거나,

CloudKit을 이용해 여러 대의 기기에 data를 sync하기 위해 사용하는 framework

 

특징

 

- 공식문서에 나온 특징들:

  1. 영속성(Persistence)
  2. 변경사항의 Undo, Redo
  3. 백그라운드 데이터 작업 기능
  4. 동기화 기능
  5. 버전 관리 및 마이그레이션(Migration)

- Database가 아니라 database 사용을 지원하는 framework이다.

- Offline 상태에서도 사용이 가능하다.

- CoreData는 객체 그래프 관리자이기 때문에 객체를 직접적으로 연결해서 관리한다. 

: Linked list처럼 객체를 연속적으로 탐색하니 탐색 성능이 비교적 좋지 않다. 

- Thread-Safe 하지 않다.

- 대규모 데이터 저장 시에도 메모리 효율이 좋다.

 

 

사용방법

1. Data model file 추가해주기

공식문서에 나온 방식대로 data model file을 추가해줍니다. Poject를 생성하는 시점에 추가할 수도 있고 이미 생성된 project에도 추가할 수 있습니다!

https://developer.apple.com/documentation/coredata/creating_a_core_data_model

 

Apple Developer Documentation

 

developer.apple.com

2. Coredata Stack 생성하기

Data model을 생성한 이후, data model과 상호작용할 class들을 정의해줍니다. 

Coredata Stack의 모습

1) Persistent container 초기화하기

App이 시작되는 시점에 CoreData를 초기화해주면 됩니다. lazy하게 선언하여 scene delegate이 처음으로 coredata를 사용하는 시점에 초기화 될 수 있도록 해줍니다. 

import UIKit
import CoreData //CoreData를 import 해주어야 NSPersistentContainer를 사용할 수 있습니다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    lazy var persistentContainer: NSPersistentContainer = {
        //Creates a container with the specified name.
         let container = NSPersistentContainer(name: "Model")
         container.loadPersistentStores { description, error in
             if let error = error {
                 fatalError("Unable to load persistent stores: \(error)")
             }
         }
         return container
     }()

    ...
}

 

이렇게 설정해 주면 이제 persistentContainer를 다른 class에서 reference할 수 있게 됩니다. 

 

2) Persistent container reference 사용하기

 

Root ViewController에서 container 변수를 생성해줍니다. 

import UIKit
import CoreData

class ViewController: UIViewController {

    var container: NSPersistentContainer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard container != nil else {
            fatalError("This view needs a persistent container.")
        }
        // The persistent container is available.
    }
}

 

 

SceneDelegate으로 돌아가서 scene(:willConnectTo:)에 window의 rootViewController를 내 애플리케이션의 root view controller type으로 downcast해줍니다. 그런 다음, root view controller의 container property를 persistent container로 설정해줍니다. 

 

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   //공식 문서에는 AppDelegate에 설정하는 방식이 나와있습니다. iOS13 이상을 지원하며
   //SceneDelegate를 사용하는 경우라면, AppDelegate의 didFinishLaunchingWithOptions 대신
   //아래와 같이 SceneDelegate의 willConnectTo 메서드에 정의해주시면 됩니다. 
   var window: UIWindow?
    ...

      func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let _ = (scene as? UIWindowScene) else { return }
        
        if let rootVC = window?.rootViewController as? ViewController {
            rootVC.container = persistentContainer
        }
        
    }

    ...
}

 

Root view controller가 아닌 다른 view controller에 container를 넘겨주고 싶다면 아래와 같이 사용하면 됩니다.

 

class ViewController: UIViewController {

    ...
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nextVC = segue.destination as? SecondViewController {
            nextVC.container = container
        }
    }
}

 

3) Data Model file에 Entity 추가하기

 

Entity는 Class에 대응되고 Table이라고 생각하면 됩니다. Data Model 파일에 Table을 정의해줍니다. 

Entity를 만들기 위해서는 좌측 하단의 Add Entity 버튼을 눌러줍니다. 

 

Add Entity를 누르면 "Entity"라는 이름의 entity가 생성이 됩니다. 눌러서 원하는 이름으로 변경해 줍니다. 

 

 

그 다음으로는 Attributes란의 "+" 버튼을 눌러서 원하는 attributes의 이름과 타입을 추가해줍니다. 

오른쪽 판넬에서 각 attribute들이 optional인지 아닌지 등 몇 가지 옵션을 설정할 수 있는데, validation도 있고 편리한 것 같습니다. (혹시 오른쪽 설정 판넬이 아래 화면처럼 나오지 않는다면 설정을 변경하기 원하는 attribute의 이름을 더블 클릭하면 됩니다.) 

 

 

여러 entity를 사용할 때 entity 간 관계를 정의해 주고 싶다면 아래 공식문서의 내용을 참고하면 됩니다.

https://developer.apple.com/documentation/coredata/modeling_data/configuring_relationships

 

Apple Developer Documentation

 

developer.apple.com

 

위에서 설명한 Data modeling(Entity, attributes 생성 등)과 관련된 자세한 내용은 공식문서 아래 페이지 참조

https://developer.apple.com/documentation/coredata/modeling_data

 

Apple Developer Documentation

 

developer.apple.com

 

또 한 가지 설정해주어야 하는 것이 있는데, 오른쪽 패널 Class section에서 Module을 Current Product Module로 바꾸어주어야 합니다. 

 

이렇게 하면 기본적인 셋업은 완료가 되었습니다.

 

다음 포스팅에서는 CRUD하는 방법을 알아보도록 하겠습니다!


참고자료

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

 

Apple Developer Documentation

 

developer.apple.com

 

https://yeonduing.tistory.com/54

 

iOS) Core Data - 다른 저장소와의 비교

Core Data Persist or cache data and support undo on a single device. 코어 데이터는 데이터를 저장하고 관리하기 위한 프레임워크이다. 코어 데이터의 경우 해당 기기에 데이터를 저장하므로 오프라인에서도 동

yeonduing.tistory.com

 

반응형