CoreData
Core Data 는 프레임 워크이다. 이를 사용하면 디바이스에 permanent data(영구적인 데이터)를 저장할 수 있다.
UserDefaults 랑은 조금 다른 개념인데 UserDefaults가 app setting과 같은 간단한 정보를 저장하기 적합하다면, Core Data는 복잡하고 큰 user data를 저장하기에 적합하다.
Core Data는 앱에서 모델 계층 계체를 관리하는데 사용하는 프레임워크로 DB는 아니다.
CoreData의 기능
- persistence(영속성)
Core Data는 객체를 저장소에 매핑하는 세부 정보를 추상화하여 DB를 직접 관리하지 않고도 Swift 데이터를 쉽게 저장할 수 있다.
- 개별, 일괄 변경 사항 Undo, Redo
Core Data의 실행 취소 관리자는 변경 사항을 추적하고 개별적으로나 그룹적으로 한 번에 롤백할 수 있어 앱에 Undo 및 Redo를 쉽게 추가할 수 있다.
- 백그라운드 데이터 작업
백그라운드에서 JSON을 객체로 구문 분석하는 것과 같은 데이터 작업을 수행한다. 그 이후 결과를 캐시 하거나 저장하여 서버에 갔다 오는 횟수를 줄일 수도 있다.
- 동기화
Core Data는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화 상태로 유지하는데 도움을 준다.
- 버전 관리 및 Migration
Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있다.
그럼 한번 코어데이터를 만들어보자
Cmd + n 을 통해 새로운 코어 데이터를 추가할 수 있다.
Add Entity를 눌러 새로운 Entity를 만들면 된다. 여기서 Entity는 저장될 데이터들의 집합이라고 생각하면 된다.
이번엔 Entity 안에 Attribute를 추가해보자
Entity가 데이터의 집합이라고 했는데 Attribute는 그 집합의 원소라고 보면된다.
즉 전화번호부가 Entity 라고 했을때 Attribute는 전화번호, 사람이름, 사람에 대한 메모 정도라고 보면 된다.
그 이후 오른쪽 인스펙터를 보면 Class Definition이 있는데 이렇게 3가지가 있다.
Manual / None
관리 객체 하위 클래스의 프로퍼티, 논리를 편집
Class Definition
생성된 논리나 프로퍼티를 편집할 필요가 없을 경우 선택
Category / Extension
관리 객체 하위 클래스에 추가적인 메서드나 비즈니스 논리를 추가하고 싶은 경우 선택
그 이후 코어 데이터를 저장하기 위해선 Core Data Stack을 설정해야한다.
- Persistent Container 를 생성한다.
- View Controller에 생성한 Persistent Container를 전달한다.
- Persistent Container를 서브 클래싱 한다.
아래의 그림을 참고해보면 좋을 것 같다.
NSManagedObjectModel의 인스턴스는 앱의 타입, 프로퍼티, 관계를 설명하는 앱의 모델 파일이다.
NSManagedObjectContext의 인스턴스는 앱 타입의 인스턴스에 대한 변경 사항을 추적한다.
NSPersistentStoreCoordinator의 인스턴스는 스토어에서 앱 타입의 인스턴스를 저장하고 가져온다.
NSPersistentContainer의 인스턴스는 모델, 컨텍스트, 스토어 coordinator를 한 번에 설정한다.
자 여기까지 정리해서 Core Data를 사용하는 순서를 조금 더 세분화 해보자
- NSManagerdObjectContext로 Persistent Container를 생성한다.
- View Controller에 생성한 Persistent Contrainer를 전달한다.
- Entity 를 가지고 온다.
- NSManagedObject를 만든다.
- NSManagedObjectContext에 저장한다.
- 잘 저장되었는지 앱을 종료하고 확인해본다.
이 과정을 하나하나 세분화 해서 한번 해보자
1 . NSManagerdObjectContext로 Persistent Container를 생성
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \\(error), \\(error.userInfo)")
}
})
return container
}()
생성자 이름에 코어데이터 이름이 제대로 들어가 있는지 꼭 확인하기
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \\(nserror), \\(nserror.userInfo)")
}
}
}
2. View Controller에 생성한 Persistent Contrainer를 전달한다.
이제 사용할 View Controller 에 가서 지금 생성한 Persistent Container를 전달받자
var container: NSPersistentContainer!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var priceLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.container = appDelegate.persistentContainer
}
3. Entity를 가지고 온다.
lazy var entity: NSEntityDescription? = {
return NSEntityDescription.entity(forEntityName: "title", in: self.container.viewContext)
}()
위에서 만든 Entity를 가져온다.
4. NSManagedObject를 만든다.
내가 설정한 데이터를 넣으니 잘 되지 않아 일단 예시 이미지로 대체한다.. 내가 넣었던 자료를 다시 넣어보고 시도한 후 수정할 예정
5. NSManagedObjectContext에 저장한다.
do {
try self.container.viewContext.save()
} catch {
print(error?.localizedDescription)
}
이렇게 하면 코어 데이터를 사용할 수 있다고는 하지만 아직 많이 어려운 개념인 것 같다..
반복적으로 공부하면서 코어 데이터를 꼭 마스터하자
'◽️ Programming > T I L' 카테고리의 다른 글
WishList 만들기 (2) - (CoreData 연결) (0) | 2024.04.12 |
---|---|
WishList 만들기 (1) - (URLSession 데이터 연결 완료) (0) | 2024.04.10 |
[ProJect 일지] 키오스크 (4) (1) | 2024.04.05 |
[ProJect 일지] 키오스크 (3) (Compositional Layout) (0) | 2024.04.04 |
[ProJect 일지] 키오스크 (2) (0) | 2024.04.03 |