CoreData로 오프라인에서도 이용 가능한 앱 만들기 - boostcamp-2020/Project01-A-User-Event-Collector GitHub Wiki
왜 CoreData인가
Object-Oriented Database
Map
하나의 모델이 다른 모델을 포함하는 복합적인 모델이 많아서, 관계를 표현할 수 있는 CoreData를 사용하였습니다.
CoreData에서 가장 중요한 부분이라고 할 수 있습니다. CoreData의 기능은 관계를 형성하는 것 말고도 다양하지만 이번 프로젝트에서 가장 핵심적인 역할은 데이터 모델간의 Mapping이었습니다. 관계형 데이터베이스에서 처럼 객체나 변수를 사상하여 저장할 수 있어 데이터 모델간의 복합적인 관계를 표현할 수 있었습니다. 또한 Xcode에 있는 내장 에디터를 통해 간편하게 Graphical Relationship을 만들 수 있었습니다.
SQL vs. OOP
Xcode 및 swift에서 이용하기 편리함
객체나 변수를 사상하여 저장할 수 있는 관계형 데이터베이스는 코어데이터 외에도 많이 있습니다. 그럼에도 코어데이터를 사용한 이유는 Xcode에서 이용하기 적합하기 때문입니다.
코어데이터도 내부적으로는 SQL을 이용해 데이터를 저장합니다. 그렇지만 직접 SQL을 사용할 필요 없이 객체지향적인 방식으로만 데이터를 다룰 수 있습니다.
Persistence
PersistenceController
PersistenceController라는 싱글톤 객체를 만들어 Data Persistence를 관리하였습니다.
현재 프로젝트는 모든 `Context가 하나의 영구 저장소에 있으므로 싱글톤으로 생성하였습니다.
- Context
context의 경우 현재 프로젝트에서는 뷰모델을 통해 간접적으로 데이터를 전달받으므로viewContext대신newBackgroundContext를 사용하였습니다.
- 공통 메소드
- 메소드의 경우 여러 객체에서 공통적으로 사용할 수 있는
fetch/delete/save메소드를Generic type으로 구현하였습니다.
- 메소드의 경우 여러 객체에서 공통적으로 사용할 수 있는
- CoreDataResult
- 코어데이터를 저장이나 삭제한 후 결과에 대한 반환값을 정의한 객체를 구현하였습니다.
CoreDataAPIManager
현 프로젝트에서 코어데이터를 이용하기에 더 적합한 형태의 메소드를 구현한 객체 입니다.
PersistenceController를 통해 코어데이터를 이용하고 이를 프라이빗 프로퍼티로 가져 외부에서는 직접적으로 접근하는 것을 막았습니다.
CoreTrackAPI / CoreEventAPI
본 프로젝트는 코어데이터를 트랙과 이벤트에 활용하고 있습니다.
각각의 객체는 CoreDataAPIManager을 프로퍼티로 가지며 각 데이터 모델을 코어데이터에 저장 및 불러오기에 적합하도록 특화된 객체를 개별적으로 구현했습니다.

활용
코어데이터를 통해 네트워크 연결이 끊긴 상태에서도 보관함은 작동하며 이미지도 저장됩니다.