티스토리 뷰
1. 기본 개념
코어 데이터의 뿌리는 NeXT 의 엔터프라이즈 객체 프레임워크 (EOF) 에서 찾을 수 있다.
이 프레임워크는 객체를 관계형 데이터베이스로 매핑할 수 있다.
관계형 데이터베이스를 사용하면
데이터베이스에 종속적인 로직을 구현하는 대신
비지니스 로직을 객체에 구현하게 되므로 적은 양의 코드로 같은 기능을 구현할 수 있다.
이를 통해 DB 요구사항보다 앱의 요구사항을 구현하는 데 더 집중할 수 있다.
코어데이터는 애초에 Mac OS X 상에서 단일 사용자를 지원하도록 만들어졌고,
내장 관계형 데이터베이스인 SQLite 에 데이터를 저장한다.
코어 데이터는 다음과 같은 기능을 포함한다.
- 시각적인 모델 편집기를 통해 데이터 객체를 모델링한다.
- 객체의 스키마가 변경될 경우 마이그레이션 도구를 이용해 처리한다.
- 일대일, 일대다, 다대다의 객체 간 관계를 생성할 수 있다.
- 별도의 파일이나 여러 파일 포맷으로 데이터를 저장할 수 있다.
- 객체 속성을 검증한다.
- 데이터 질의와 정렬이 가능하다.
- 데이터는 지연로딩된다.
- iOS TableView 와 연동해 동작할 수 있다. (NSFetchedResultsController)
- 저장과 되돌리기 기능으로 관계 객체 변화를 관리할 수 있다.
2. 데이터 저장 방식 비교
1) NSUserDefaults
: 앱의 Preference 를 저장할 때 주로 사용한다.
2) plist
: XML 파일 포맷으로 앱의 지속적인 정보의 요구사항을 Dictionary 나 Array 로 충족시킬 수 있다면 plist 이용하면 된다.
3) SQLite 직접 이용
: C로 작성된 libsqlite 라이브러리를 이용하면 앱에서 SQLite 데이터베이스에 직접 접근할 수 있다.
SQLite 는 내장 관계형 데이터베이스로 서버를 필요로 하지 않고 SQL 언어의 대부분의 기능을 지원한다.
단점은 앱 스스로 애플리케이션의 데이터베이스 객체와 SQL 파일 간의 관계를 직접 매핑해야한다는 점이다.
이 경우 데이터를 가져오거나 저장하는 SQL 질의문 등을 직접 작성해야하며
현재 어떤 객체들을 저장해야 하는지 추적하는 코드도 직접 만들어야한다.
4) CoreData
: SQLite 에 직접 접근하는 방식만큼 유연함을 제공하면서도
앱과 데이터베이스의 동작 방식을 분리해준다.
앱이 많은 데이터를 필요로 하고 여러 다른 객체 간의 관계를 관리해야 하며
특정 객체나 객체의 그룹에 빠르고 쉽게 접근해야한다면 CoreData 를 사용하는 것이 좋다.
3. 작동 방식
1) NSPersistentStore (영구 저장소)
데이터를 저장하는 파일을 나타낸다.
앱에서 코어데이터를 이용하도록 설정할 때 영구 저장소의 이름, 위치, 타입을 지정해야한다.
NSURL *storeURL = @"/Document/..../AppData";
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
2) NSPersistentStoreCoordinator (영구 저장소 관리자)
객체의 데이터를 실제로 저장하고 있는 실제 파일 (NSPersistentStore) 과
앱이 사용하는 객체 모델 사이를 중개한다.
앱은 NSPersistentStoreCoordinator 에 직접 접근할 일이 거의 없다.
단지 코어 데이터 실행 환경을 구성할 때 관리자 객체를 생성만 해주면 된다.
NSPersistentStoreCoordinator 는 하나 이상의 영구 저장소와의 통신을 관리하기 때문에
데이터가 어떻게 저장되는지를 앱으로부터 감춘다.
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"AppData" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
3) NSManagedObjectContext (관리 객체 컨텍스트)
관리 객체가 존재하는 영역이다.
앱에서는 관리 객체의 생성, 삭제, 편집, 질의 등을 수행하기 위해 NSManagedObjectContext 와 통신한다.
NSManagedObjectContext 는 객체들의 변경사항을 관리하며
모든 변경사항을 한꺼번에 저장하거나 경우에 따라서는 rollback 한다.
전체 데이터 작업을 분리하거나 제한하기 위해 하나 이상의 context 를 동시에 사용할 수 있다.
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setPersistentStoreCoordinator:psc];
4) NSManagedObjectModel (관리 객체 모델)
관리 객체는 관리 객체 모델 (NSManagedObjectModel) 에서 정의한다.
NSManagedObjectModel 은 개체(Entity) 의 리스트, 각 개체와 연결된 속성 리스트 (properties),
각 개체 및 속성과 연결된 유효성 검증, 개체 간의 관계를 포함한다.
관리 객체 모델은 주로 XCode 의 데이터 모델 편집기를 이용해 생성한다.
5) NSManagedObject (관리 객체)
코어 데이터 상에서 실제 정보를 담고있는 객체를 의미한다.
관리 객체를 키와 그 키에 대응하는 타입의 객체를 가진 Dictionary 객체처럼 생각할 수 있다.
[MOModel setValue:@"Casablanca" forKey:@"movieName"];
[MOModel valueForKey:@"movieName"];
6) 추가 기능 (NSFetchedResultsController)
Fetch 요청의 결과와 테이블 뷰를 손쉽게 연결시켜 준다.
이 컨트롤러는 Fetch 결과를 섹션과 줄 단위로 리턴하도록 설정할 수 있고,
인덱스를 이용해 접근할 수 있다.
테이블 뷰를 구현할 때 필요한 정보를 얻을 수 있는 메소드도 제공하며,
코어 데이터에서 변경 이벤트가 발생하면 이를 감지한 후 delegate 메소드를 이용해 테이블에 반영할 수 있다.
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@"lent" cacheName:nil];
위 내용들을 정리하면 아래와 같다.
참고자료
http://stackoverflow.com/questions/5231775/can-multiple-two-persistent-stores-be-used-with-one-object-model-while-mainta
'iOS 개발 > iOS' 카테고리의 다른 글
[iOS] Background Task 만들기 (iOS 에서 지원하는 방식, 지원하지 않는 방식) (0) | 2016.11.24 |
---|---|
[iOS] Canonical Mapping composed, decomposed (한글 분해 현상 대응) (0) | 2016.11.22 |
UIView 의 frame, bound 및 Point Contain, Point Convert (0) | 2016.11.16 |
[iOS] UIDocumentInteractionController, UIActivityViewController 의 사용 (0) | 2016.11.15 |
[MAC] SourceTree 에서 remote Commit ment 가 안보일 때 (1) | 2016.11.14 |
- Total
- Today
- Yesterday
- applicationWillResignActive
- CGImage
- Swift 3.0
- NSManagedObjectContext
- Arc
- optional
- UIView
- string
- Swift3
- HTTP
- docker
- Swfit
- 꺼내먹어요
- NSManagedObjectModel
- CIImage
- AWS
- 읽기 좋은 코드가 좋은 코드다
- Swift 3
- ios
- coredata
- EffectiveObjectiveC
- RunLoop
- delegate
- NSManagedObject
- dictionary
- thread
- Block
- Swift
- set
- workerThread
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |