티스토리 뷰
안녕하세요 :) Zedd입니다.
Core Data를 사용할 일이 생겼는데...제가 옜날에 해봤단 말이죠..!?!?!?
근데 다시 하려니까 생각이 하나도 안나는거에요
그때는 문서 볼 생각도 안했었는데..ㅎㅎㅎㅎ
이러면 할때마다 계속 찾아보고..그럴 것 같아서 이왕 찾아볼거 내가 정리한걸..찾아보게따...
이 Core Data공부가 처음 시도된 것은 아니었다고 하는데....
2017년부터 시작된 그의 노력..
이번엔 진짜 제대로 공부할거야...
엄청 쉽게쉽게 설명..하려고 노력해볼게요!!!
문서에 나와있는 어려운 말들을 최대한 풀어서 적어볼건데,
그래도 꼭 문서를 다시 읽는거 잊지마세요!!!!
Core Data
- Core Data는 Framework에요!
Q : 아 디바이스에 뭔가 저장해야되는데....오잉 Core Data를 사용하면 된다네?
A : 네 맞습니다! Core Data로 할 수 있어요.
- Core Data를 사용하면, 디바이스에 permanent data(영구적인 데이터)를 저장할 수 있습니다.
UserDefaults랑은 조금 다른친구인데요,
UserDefaults가 app setting같은 간단한 정보를 저장하기에 적합하다면,
Core Data는 복잡하고 큰 user data를 저장하기에 적합해요.
제가 지금 "저장"만 언급했죠? 오늘 할 것도 데이터를 저장하고 저장한 데이터를 불러오고..
이런 작업을 할거에요.
그럼 이런 생각을 할 수 있죠
Core Data는 Database인가?
아닙니다!
Core Data는 Framework고,
Core Data가 할 수 있는 일은,
- Change tracking (undo/redo)
....
여기에서 볼 수 있음
...
- Persistence
네 Core Data의 기능 중 하나 인 Persistence는
관계형 데이터베이스인 SQLite에 의해 지원됩니다.
그러니까 제가 하고 싶은 말은,
(제 경험상) 대부분 Persistence를 위해, 그러니까 뭔가를 영구적으로 저장하기 위해
Core Data를 사용하는 것을 많이 봤는데요.
Persistence는 Core Data의 기능 중 하나 일 뿐,
Core Data == Database가 아닙니다.
Persistence기능을 사용하지 않고도 Core Data를 사용할 수 있어요.
그래서 우리가 기억해야 할 것은
Core Data는 Database가 아니며, 데이터를 유지하기 위한 API도 아닙니다.
Core Data는 넓은 의미로 앱의 모델 계층이며, 객체 그래프를 관리하는 Framework입니다.
이 객체 그래프를 디스크에 저장하여 Persistence기능을 이용할 수 있게 되는것이죠.
암튼 구구절절 말이 길었는데,
Core Data는 Database다! 라고만 생각 안하시면 됩니다.
그래서 오늘 해볼건 Core Data의 Persistence기능을 이용해볼거에요.
그럼 시작해봅시다!
아주 친절한 문서가...
프로젝트를 새로 만드시는 거라면,
Use Core Data를 체크해주시고,
이미 있는 프로젝트에 추가하는거라면
Command + N을 눌러 파일 추가 윈도우를 띄우신 다음,
Data Model을 추가해주세요.
저는 프로젝트를 새로 만들었어요!
이름이 맘에 안드니 바꿔줍시다.
자 그럼 이제 Entity라는 것을 만들어야 합니다.
Entity는 "저장되고, 관리되어야 하는 데이터의 집합"을 의미합니다.
하단의 Add Entity를 이용해서 Entity를 추가해줍시다.
Entity가 만들어졌네요.
이 Entity의 이름은 굉장히 중요합니다. 일단 그걸 알고계셔야 해요.
저는 뭐..연락처를 저장한다고 생각해볼게요.
이제 Attribute를 추가해줄게요.
역시나 하단의 Add Attribute를 눌러줍니다.
그럼 이런게 생겼죠!@@!!
자..연락처에 저장해야 할 정보가 뭐가 있을까요?
이름이랑.....전화번호!!
이름은 String으로 저장할거니 String으로
전화번호..도 String이네?...
단축번호...를 저장해봅시다. 요새도 단축번호라는거 있나...!?!?!........
나때는.....1을 꾹 누르면....전화가 연결됐었느데
ㅈㅅ
Integer 16으로 타입을 줘볼게요. Integer에는
Integer 16
Integer 32
Integer 64
가 있을텐데, 자기가 저장하기 원하는 데이터가
어느 integer 범위?에 있는지 확인하시면 될 것 같아요.
참고하세요!
저는 단축번호가 그리 많이 생성되지...않을 거기 때문에.......
Integer 16으로 해줍니다..
아무튼 이렇게만 해줄게요!
Editor Style을 변경하면 이렇게 볼 수 있답니다.
저는 아직 허접하고 Relationships이 없어서 이렇게 나오는데 Relationships이 있으면
이렇게 간지나게 나옴.
자 일단 오른쪽 인스펙터를 봅시다.
Codegen이라는 영역을 보시면 Class Definition이라고 되어있죠?
이게 모냐
저는 따로 Contact라는 타입을 만들어주지 않았는데..갑자기 이 코드가 빌드 성공이 뜬다..>!?!
관련된 내용은
를 참고하시면 되는데요.
Class Definition 옵션 :
- Core Data가 생성한 managed object subclass 및 프로퍼티 또는 기능을 편집할 필요가 없는 경우
- 생성된 소스 코드가 프로젝트의 소스 목록에 나타나지 않음.
Core Data에 의해 소스코드가 생성이 된겁니다! 근데 지금 안보이는것 뿐이에요.
그래서
이 코드가 돌아갈 수 있는것이죠.
Category/Extension 옵션:
- managed object subclass내에 편리한 메소드 또는 비즈니스 로직을 추가하려는 경우.
- 이 옵션을 사용하면 클래스 파일을 완전히 제어할 수 있음. class를 수동으로 만들고 관리하는것은 전적으로 사용자의 몫.
이것도 Xcode가 코드 다 만들어주긴 함
Model파일을 클릭하고 Editor > Create NSManagedObject어쩌고~~
짠
근데 문서에서는..
CoreDataClass만 나오는데 난 왜 2개 다 생성되지...;;; 이 옵션인 상태에서
CoreDataProperties있으면 에러나니까 지워주면 됩니다.
왜 에러나냐면
Extension은 Core Data가 알아서 만들어서 관리하기로 했는데 파일이 만들어짐 -> 중복
이라서 에러나는듯
extension안에 stored 프로퍼티 못만드는데 @NSManaged붙으면 몬가 다른가..?
그냥 신기해서 ㅎ..
Manual/None 옵션 :
- access modifiers를 변경하고 추가로 편리한 메소드 또는 비즈니스 로직을 추가하기 위해 managed object subclass를 편집하기 위한 용도
- 이 옵션을 선택하면 Core Data는 class를 지원하기 위한 파일을 생성하지 않음.
역시나 위와같은 방법으로 만들 수 있음.
주의 : Class Definition으로 했는데
이 파일이 있다?
위에서도 말했듯이 Class Definition은 CoreData가 알아서 다 관리해주겠다고 해서
이미 내부적으로 파일이 만들어진 상황 => 근데 내가 또 만듬
=> 중복
전 이왕 파일 2개 만들어진거 Manual/None으로 해보겠습니다.
아까 Entity이름이 중요하다고 그랬죠?
기본적으로 Class이름은 Entity이름으로 만들어집니다.
그게 싫으시면..저기 Name부분에서 바꿀 수 있어요.
그러니까 Entity이름과 만들어질 Class이름을 다르게 가져갈 수 있습니다.
자!! 그럼 이제 반은 한거에요!!
그럼 이제 제가 뭘 할지 정리해볼게요.
1. Person타입을 만든 뒤, Person 인스턴스를 만든다.
2. 그걸 저장한다.
3. 앱 종료
4. CoreData에서 내가 저장한거 불러오기
5. 확인하기~~
UI로 예쁘게~~~하면 좋겠지만...일단은 이렇게 해볼게요.
1. Person타입을 만든 뒤 Person 인스턴스를 만든다.
2. 그걸 저장한다.
음 엄청 포괄적으로 말했네 ㅎ
이걸 좀 세분화 해볼게ㅐ요.
2-1. NSManagedObjectContext를 가져온다.
2-2. 먼저 Entity를 가져온다! 내가 어느 Entity에 저장해야하는지 알아야하니까..!!
2-3. NSManagedObject를 만든다.
2-4. NSManagedObject에 값을 세팅해준다.
2-5. NSManagedObjectContext를 저장해준다.
ㅋ...
**
네 그럼 저 NSManaged어쩌구들을 알아야합니다.
근데 진짜 알기 싫은거 앎 ㄹㅇ
여기에 정리해놓고 까먹을때마다 봐야하기 때문에..정리해보겠읍니다..
"Core Data Stack"이란 것을 먼저 알아야합니다.
Core Data Stack은 Core Data의 핵심이라고 할 수 있는데요,
Core Data Stack은 앱의 모델 layer를 관리하고 유지하는 역할을 합니다.
이 Core Data Stack은 위 그림에서 보실 수 있듯이
NSManagedObjectModel
NSManagedObjectContext
NSPersistentStoreCoordinator
그리고
NSPersistentContainer
로 이루어져 있습니다.
하나씩 볼게요.
NSManagedObjectModel
이 친구는 Entity를 설명하는 Database 스키마라고 보시면 됩니다.
managed objects의 structure를 정의해요.
NSPersistentStoreCoordinator
이 친구는 persistent storage(영구 저장소)와 managed object model을 연결합니다.
가운데 Persistent Store Coordinator가 있죠?
중간에서 연결해주고 있는게 보이죠..!!
NSManagedObjectContext
- 이 친구는 transaction이라고 보시면 됩니다.
managed objects를 생성하고, 저장하고, 가져오는(fetch) 작업같은 걸 제공해요.
그리고
NSPersistentContainer
- Core Data Stack을 나타내는 필요한 모든 객체를 포함합니다.
구구절절 정의를 쓰면 일단 너무 어렵고 미래의 저는 안읽을거니까...이정도로만 할게요.
2-1. NSManagedObjectContext를 가져온다.
2-2. 먼저 Entity를 가져온다! 내가 어느 Entity에 저장해야하는지 알아야하니까..!!
2-3. NSManagedObject를 만든다.
2-4. NSManagedObject에 값을 세팅해준다.
2-5. NSManagedObjectContext를 저장해준다.
자 그럼 이 작업을 해볼까요? 해주기 전에
를 해주세요.
2-1. NSManagedObjectContext를 가져온다.
를 하기 전에, 이 Core Data Stack을 나타내는 필요한 모든 객체를 포함하는 친구가 있다고 그랬죠?!
네 바로 NSPersistentContainer입니다.
아마 프로젝트를 만들 때 처음부터 Use Core Data를 체크하신 분이면,
App Delegate 아래쪽에
이런게 있는 것을 보실 수 있을거에요.
프로젝트 만들 때 Use Core Data선택안하시고 바로 모델부터 만드신 분들은 아마 없을거에요!
PersistentContainer가 있어야 다음 작업을 진행 할 수 있으니까 없으신 분들은 PersistentContainer를 만들어주시면 됩니다.
AppDelegate에 없어도 됩니다. 편하신 곳에 만드세요.
주석은 일부로 안지웠어요! 참고하세요.
이 부분은
얘의 이름을 써주면 됩니다. 저는 Model이니까
이렇게 되겠죠?
NSPersistentContainer에 들어가보면
NSManagedObjectModel도 있고..NSPersistentStoreCoordinator, NSManagedObjectContext가 있는 것을 볼 수 있죠.
"Core Data Stack을 나타내는 필요한 모든 객체를 포함하는 친구"라는 말이 정말 맞죠..!!
NSManagedObjectContext가 있으니..?
2-1. NSManagedObjectContext를 가져온다.
를 할 수 있겠네요.
(저는 NSPersistentContainer가 AppDelegate안에 있으니 저렇게 꺼내온거에요!!)
2-2. 먼저 Entity를 가져온다! 내가 어느 Entity에 저장해야하는지 알아야하니까..!!
저는 Entity이름이 Contact니까 저렇게 준거고 알아서들 넣어주세요.
2-3. NSManagedObject를 만든다.
2-4. NSManagedObject에 값을 세팅해준다.
2-5. NSManagedObjectContext를 저장해준다.
저는 이 작업을 viewDidLoad에 해줘서..ㅋ.....빌드만 하면됨
1. Person타입을 만든 뒤, Person 인스턴스를 만든다.
2. 그걸 저장한다.
3. 앱 종료
4. CoreData에서 내가 저장한거 불러오기
5. 확인하기~~
2번이 정말 길었는데.....3번은 다시 빌드하면 되고...이제 4번 하면 되겠죠?!
저장이 잘 되었는지 보려면..현재 저장된걸 불러오면 되겠죠?
이렇게 불러오면 됩니다.
저는 저 print문에서 Zedd가 출력되겠죠.
fetchRequest()메소드 같은것도 그냥 다 구현이 되어있어서...그냥 호출만 하면 됩니다.
cotext의 fetch메소드는 [Any]타입을 리턴하기 때문에 [Contact]타입으로 캐스팅 해주었어요.
저는 옛날에도 그랬고.. 지금도 하면서
Q : ㅈㅓ는 Person타입을 만들어줬잖아요. 그냥 [Person]으로 나올 수 있으면 좋을텐데...
라는 궁금증을 가졌는데요,
근데 Person은 NSManagedObject가 아니라서 그렇게 하면 안됩니다.
안에 저장된건 Person타입이 아니라 Contact타입이에요.
지금 Contact에 있는 프로퍼티와 Person의 프로퍼티가 동일해서 헷갈릴 수도 있는데,
이 둘을 동일시 하면 안됩니다.
그냥 Person타입은 setValue할 때 value만 set하는 용도에요. 그 이상은 아닙니다.
넌.."이용"됐을 뿐이다...
아니 이렇게 글이 길어질 줄 몰랐는데...
퇴고만 하는데도 오래걸리네
그래도 이거 읽고 나면 Core Data를 어떤 흐름으로 코드를 짜야하는지 감이 오실....전 왔는데...
왜냐면 패턴이 있거든요...!!!!
더 많은 기능은 다음 글에서 다뤄볼게요!!!!
혹시 틀린 내용을 발견하셨다면 댓글 부탁드립니다 :D
참고 :
https://www.objc.io/books/core-data/preview/
https://code.tutsplus.com/tutorials/core-data-from-scratch-core-data-stack--cms-20926
'iOS' 카테고리의 다른 글
RxTest (2) | 2020.04.09 |
---|---|
Core Data (2) (5) | 2020.04.08 |
iOS ) CATextLayer (0) | 2020.02.24 |
iOS ) CAGradientLayer (0) | 2020.02.02 |
iOS ) UIImagePickerController로 촬영한 사진/동영상 저장 (3) | 2020.01.29 |
- Accessibility
- iOS delegate
- swift sort
- IOS
- swift tutorial
- Xcode
- np-hard
- SwiftUI
- actor
- github
- 스위프트 문법
- 피아노
- swift array
- Swift
- ios 13
- FLUTTER
- 스위프트
- fastlane
- WKWebView
- 제이슨 파싱
- swift 공부
- 회고
- UIBezierPath
- WWDC
- swift3
- Git
- Combine
- np-complete
- WidgetKit
- swift delegate
- Total
- Today
- Yesterday