티스토리 뷰
안녕하세요 Pingu입니다. 🐧
오늘은 iOS에서 데이터를 저장하는 방법 중 하나인 Core Data에 대해 알아보려고 합니다. 예전에 알아본 UserDefaults도 비슷한 역할을 했었는데, 좀 더 복잡한 데이터를 저장하기 위해서는 Core Data가 적합하다고 합니다! 오늘 알아볼 Core Data를 사용하면 앱의 Permanent Data (영구 데이터)를 저장할 수 있다고 합니다.
Core Data는 앱에서 모델 계층 개체를 관리하는 데 사용하는 프레임워크입니다.
즉 DB가 아니에요!!
Core Data의 기능은 아래와 같아요.
- Persistence(영속성)
- Core Data는 객체를 저장소에 매핑하는 세부 정보를 추상화하여 DB를 직접 관리하지 않고도 Swift 데이터를 쉽게 저장할 수 있어요. 아래 그림은 앱이 영구 저장소에 데이터를 저장하고 데이터를 로드하는 과정을 보여주는 그림입니다.
- 개별, 일괄 변경 사항 Undo, Redo
- Core Data의 실행 취소 관리자는 변경 사항을 추적하고 개별적으로나 그룹적으로 한 번에 롤백할 수 있어 앱에 Undo 및 Redo를 쉽게 추가할 수 있습니다. 아이폰에서 메모나 메시지를 쓰다가 흔들면 글자가 사라지는 기능이 있는데요, 아래 그림은 그러한 제스처를 사용하여 실행 취소를 하는 것을 보여주는 그림입니다.
- 백그라운드 데이터 작업
- 백그라운드에서 JSON을 객체로 구문 분석하는 것과 같은 데이터 작업을 수행합니다. 그런 뒤 결과를 캐시 하거나 저장하여 서버에 갔다 오는 횟수를 줄일 수도 있습니다. 아래 그림은 UI를 업데이트하기 전에 백그라운드에서 개체를 채우는 End Point의 데이터를 보여주는 그림입니다.
- 동기화
- Core Data는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화 상태로 유지하는데 도움을 줍니다.
- 버전 관리 및 Migration
- Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있습니다.
그럼 이러한 Core Data를 한 번 직접 만들어볼까요?
Xcode를 켜시고 아이폰 앱 템플릿을 선택한 뒤 위와 같이 Use Core Data를 체크해주고 프로젝트를 만들면 Core Data를 사용할 수 있어요.
그럼 위와 같은 파일이 함께 생성되게 됩니다.
물론 기존에 존재하던 프로젝트에 command + n 단축키로 Core Data를 추가할 수도 있어요. 지금 만들어진 파일의 이름을 Xcode에서 Core Data를 만들 때 default 이름인 Model로 바꾼 뒤 진행해볼게요~
일단 위와 같이 Add Entity를 눌러서 Entity를 만들어야 합니다.
여기서 Entity란 저장될 데이터들의 집합이라고 보시면 됩니다.
버튼을 눌러 만들게 되면 위와 같이 Entity가 만들어지는데요, 나중에 Entity 이름으로 접근하기 때문에 이름은 기억하고 계셔야 합니다.
일단 그럼 이번에는 Attribute를 추가해볼게요.
Entity가 데이터의 집합이라고 했는데, Attribute는 그 집합의 원소라고 보시면 됩니다.
즉 제가 전화번호부 Entity를 저장한다고 했을 때 필요한 Attribute는 전화번호, 사람 이름, 사람에 대한 메모 정도가 있겠네요.
그럼 Entity 이름도 PhoneBook으로 수정하고 Attribute 들도 추가해주면 아래와 같아집니다.
지금은 간단한 데이터이기 때문에 관계를 따로 만들어주지 않았는데요, 만약 관계를 추가하고 싶다면 아래와 같이 만들어주시면 됩니다.
그런 뒤 위의 버튼을 눌러주시면 MySQL에서 본듯한 관계도가 나오게 됩니다.
이번엔 Xcode 오른쪽에 위치한 Inspector를 살펴보겠습니다.
뭐 이러저러한 것들이 있는데 Codegen 부분을 보시면 class Definition이 있는데요 이 부분에 대한 설명은 여기에 자세히 나와있어요.
간단하게 위의 3가지의 차이에 대해 살펴보겠습니다.
- Manual / None
- 관리 객체 하위 클래스의 프로퍼티, 논리를 편집
- Class Definition
- 생성된 논리나 프로퍼티를 편집할 필요가 없을 경우 선택
- Category / Extension
- 관리 객체 하위 클래스에 추가적인 메서드나 비즈니스 논리를 추가하고 싶은 경우 선택
저는 다 편집하고 싶으니 Manual / None으로 만들어보도록 하겠습니다.
Core Data에서 이러한 클래스를 만들 때 클래스 파일과 속성 파일을 선택적으로 만드는데, 이를 만드는 방법은 아래와 같아요.
이걸 누르시면 아래와 같은 2개의 파일이 생성됩니다.
그럼 이렇게 만든 Core Data로 전화번호부를 한 번 만들어보며 사용법을 익혀볼게요~
일단 해야 될 일은 어떤 데이터를 저장하고 앱을 종료 후 다 시켰을 때 해당 데이터가 존재하는지 확인하면 되겠죠?
데이터를 저장하는 곳은 Core Data가 될 거고요.
근데 데이터를 저장하기 위해서는 여기에 나온 대로 Core Data Stack을 설정해야 합니다. 이 과정을 순서대로 나열하면 아래와 같습니다.
- Persistent Container를 생성한다.
- View Controller에 생성한 Persistent Container를 전달한다.
- Persistent Container를 서브 클래싱 한다.
직접 사용해보기 전에 Core Data Stack을 살펴보면 아래와 같습니다.
- NSManagedObjectModel의 인스턴스는 앱의 타입, 프로퍼티, 관계를 설명하는 앱의 모델 파일입니다.
- NSManagedObjectContext의 인스턴스는 앱 타입의 인스턴스에 대한 변경 사항을 추적합니다.
- NSPersistentStoreCoordinator의 인스턴스는 스토어에서 앱 타입의 인스턴스를 저장하고 가져옵니다.
- NSPersistentContainer의 인스턴스는 모델, 컨텍스트, 스토어 coordinator를 한 번에 설정합니다.
이 네 개의 개념에 대해서는 나중에 하나씩 깊이 알아봐야 할 거 같아요.
일단 오늘은 사용하는 것을 해볼 거니 일단 넘어가도록 하겠습니다.
그럼 Core Data를 사용하는 순서를 아까보다 좀 더 세분화해보겠습니다.
- NSManagerdObjectContext로 Persistent Container를 생성한다.
- View Controller에 생성한 Persistent Container를 전달한다.
- Entity를 가지고 온다.
- NSManagedObject를 만든다
- NSManagedObjectContext에 저장한다.
- 잘 저장되었는지 앱을 종료하고 확인해본다.
1. NSManagerdObjectContext로 Persistent Container를 생성한다.
AppDelegate로 가보면 처음에 Core Data를 사용하는 프로젝트를 만들었기 때문에 아래와 같은 코드들이 만들어져 있을 거예요.
이 부분이 1번에 해당하는 Persistent Container를 생성하는 부분입니다.
이 부분을 AppDelegate 부분에서 해도 되지만 어디서든 해도 된답니다.
혹시라도 위와 같이 persistentContainer 변수의 NSPersistentContainer(name:) 생성자에 올바른 NSManagedObjectModel 이름이 설정되어 있지 않다면 수정해줘야 해요!
2. View Controller에 생성한 Persistent Container를 전달한다.
그럼 이제 사용할 View Controller에 가서 지금 생성한 Persistent Container를 전달받습니다.
3. Entity를 가지고 온다.
이렇게 아까 만든 PhoneBook이라는 Entity를 가지고 옵니다.
4.NSManagedObject를 만든다
그렇게 Entity까지 가지고 왔다면 위와 같이 NSManagedObject를 만들어줍니다.
그럼 이제 이걸 저장하면 되겠죠?
5. NSManagedObjectContext에 저장한다.
이렇게 저장해주시면 됩니다.
그럼 이제 한 번 데이터가 잘 저장되었는지 가지고 와 보겠습니다.
위와 같이 fetch를 사용해서 데이터를 가지고 올 수 있는데요, 앱을 껐다가 다시 켜서 확인하면 됩니다.
이 함수를 적절한 곳에서 실행시켜주면,
이런 결과를 얻을 수 있습니다.
이렇게 하면 아주 기본적인 Core Data의 기능을 사용할 수 있습니다.
더 공부해서 Core Data에 대한 내용을 더 남겨 보도록 하겠습니다.
감사합니다!
참고자료
developer.apple.com/documentation/coredata
'iOS > iOS_Memo' 카테고리의 다른 글
[iOS 앱개발] iOS 앱의 상태변화에 따른 AppDelegate, SceneDelegate 메서드 (0) | 2021.05.20 |
---|---|
[iOS 앱개발] NotificationCenter 사용법 (0) | 2021.02.28 |
[iOS 앱개발] Swift와 Vapor로 서버 만들기 (0) | 2021.02.11 |
[iOS 앱개발] Application의 Life Cycle 알아보기 (0) | 2021.02.05 |
[iOS 앱개발] View Controller의 Life Cycle (0) | 2021.02.04 |
- Total
- Today
- Yesterday
- 프로그래밍
- 스위프트
- 문법
- IOS
- 자료구조
- 아이폰
- mac
- OS
- 백준
- OSTEP
- 알고리즘
- 코테
- Swift
- Combine
- dfs
- Publisher
- BFS
- DP
- document
- operating
- pattern
- 동시성
- operator
- design
- 코딩테스트
- Xcode
- 테이블뷰
- System
- Apple
- 앱개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |