코어데이터
코어데이터란 넓은 의미에서 앱의 모델계층이자, 데이터베이스, ORM등의 기능을 가진 객체 그래프 관리 프레임워크이다.
CoreData는 경량의 고성능 관계형 데이터베이스 엔진인 SQLite를 기반으로 구축되었고 개발자가 복잡한 SQL문을 작성하지 않고도 데이터베이스와 상호작용 할 수 있도록 직관적이고 사용하기 쉬운 인터페이스를 제공한다.
객체 그래프 관리 프레임워크
객체 그래프란 메모리에 있는 객체들과 객체들 간의 관계를 말한다.
예를 들어
Person이라는 객체와 Family라는 객체가 이와 같은 관계로 메모리에 올라간다면 객체들이 어떤 관계를 갖고 있는지를 객체 그래프라고 하는 것이다.
예를 들어 실제 앱의 예시로 보자면 SNS앱에서 게시글이 있고, 게시글에는 댓글들이 있을텐데 두 객체의 인스턴스와 인스턴스간의 관계는 객체 그래프를 형성한다.
이외에도 수많은 객체들이 메모리에서 관계를 형성하고 있을것이고, 이것들을 그 형태 그대로 디스크에 저장할 필요가 있다면 코어데이터가 그것을 위한 것이다.
코어데이터는 이렇게 객체 그래프를 관리하는 역할을 하는 프레임워크이다.
따라서 코어데이터를 사용할 때 객체지향적인 방식으로 데이터와 상호작용 하고 코어데이터는 객체지향 관점에서 사용하는게 좋다
ORM
관계형 데이터베이스와 소통하기위해서는 SQL이라는 언어가 필요하다. ORM이란 앱을 만드는데 사용하고있는 언어를 SQL로 번역해주는도구라고한다. 관계형 데이터베이스의 데이터를 프로그래밍 언어의 개체에 매핑하거나 그 반대로 매핑한다. 이를 통해 개발자는 복잡한 SQL쿼리를 작성할 필요가 없으며 보다 자연스럽고 직관적인 데이터 작업을 수행하게 해준다. 이 ORM에는 CoreData, Realm및 FMDB가 있다. ORM은 데이터베이스 상호작용을 단순화하고 개발자 생산성을 높일 수 있는 도구이다. 일반적으로 데이터베이스를 사용할 경우 데이터의 CRUD작업을 분명하게 해야하지만 코어데이터는 내부에서 SQLite를 사용하지만 명시적으로 CRUD를 하지 않는게 그 예시이다.
결론적으로 보면 CoreData는 DataBase가 아닌것이고 DataBase 기능을 지원하는 프레임워크이다.
대규모 데이터를 저장하거나 체계적인 데이터베이스가 필요할 때 사용하는것이 적절한다.
공식문서에는 CoreData의 5가지 기능이 나와있다.
1. 영속성(Persistence)
2. 변경사항의 Undo, Redo
3. 백그라운드 데이터 작업 기능
4. 동기화 기능
5. 버전 관리 및 마이그레이션
여기서 데이터베이스는 1번 영속성의 기능이다.
이 영속성 기능은 SQLite를 기반으로 지원하는데 일반적인 데이터베이스와는 차이가 있다.
데이터 베이스는 행렬 관계를 이용해 데이터를 읽고 쓰는 반면 CoreData는 객체를 연속적으로 탐색해야 한다는 차이점이 있다.
링크드 리스트처럼 객체를 탐색하다 보니 탐색 성능은 비교적 나쁘고, Thread-Safe하지 않아 Lock으로 동기화 처리를 해줘야한다.
대신 원하는 데이터를 메모리에 올릴 수 있기 때문에 대규모 데이터를 저장해도 메모리 효율이 떨어지진 않는다. 종합하면 대규모 데이터를 저장해야하는 상황에서 영속성 기능을 포함한 다른 기능이 필요하다면 CoreData를 선택해도 좋다.