UserDefaults
- UserDefaults는 앱 시작시 key-value 쌍을 영구적으로 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스 입니다.
- 런타임에 UserDefaults Object를 사용하여 default DB로부터 앱의 default value를 읽습니다. UserDefaults는 default value가 필요할 때마다 사용자의 default DB를 열 필요가 없도록 정보를 캐시합니다. default value를 설정하면 현재 프로세스 내에서 동기적으로 변경되고 영구 저장소 및 기타 프로세스에선 비동기적으로 변경됩니다
- UserDefaults는 사용자 기본 설정과 같은 단일 데이터 값에 적합합니다.
- 대량의 유사한 데이터 (테이블에 대한 레코드, 여러 사용자에 대한 데이터 등)를 저장해야하는 경우에는 SQLite 데이터베이스가 더 적합합니다.
장점
- UserDefaults는 사용하기 쉽다.
- Thread safe하다. (동기화 적정 없이 어떤 쓰레드에서든 읽고 쓸 수 있다.)
- UserDefault는 앱과 앱 extensions에서 공유된다.
단점
- 동일한 키의 값을 쉽게 재정의 할 수 있습니다 (키 충돌 가능성).
- UserDefaults는 암호화되지 않습니다.
- Unit Test 시 UserDefault는 잘못된 값을 일으킬 수 있습니다.
- UserDefaults는 앱의 어느 곳에서나 전역적으로 변경 될 수 있으므로 inconsistent한 상태에서 쉽게 실행할 수 있습니다.
FileManager
- FileManager는 iOS 내에서 파일과 디렉토리의 생성, 이동, 읽기, 쓰기 행위와 같은 기본적인 동작과 제어를 할 때 사용됩니다.
- FileManager는 파일을 단일 엔티티로 조작하는 데 사용됩니다. 파일은 구조화되지 않은 데이터에 가장 적합합니다.(이미지, 음악 등 바이너리 파일) 대부분의 구조화 된 데이터는 데이터베이스에 저장하는 것이 적합합니다.
장점
- FileManager는 iCloud 스토리지와 함께 사용할 수 있으므로 모든 iOS 및 MacOS 사용자 기기간에 앱 데이터가 동기화됩니다.
- Thread safe하다.
- FileManager는 디렉토리 내용 나열, 디렉토리 생성, 파일 이동, 복사 또는 제거와 같은 다양한 방법으로 사용할 수 있습니다.
- 장치에 충분한 로컬 저장소가 있는 한 큰 개체(ex: 사진)를 디스크에 저장할 수 있습니다.
단점
- URL Path 생성은 오류가 발생할 수 있습니다.
- 앱의 sandbox를 이동할 수 있으므로 지정된 파일의 절대 URL을 저장할 수 없습니다.
- 디스크에서 파일 읽기 / 저장 속도가 매우 느릴 수 있습니다.
Core Data
- Core Data는 데이터를 저장하고 관리하기 위한 프레임워크이다. (Core Data는 DataBase가 아님 ORM(Object Relational Mapping) 프레임워크).
- Core Data의 경우 해당 기기에 데이터를 저장하므로 오프라인에서도 동작 가능하며, 클라우드를 제외하고는 데이터를 공유할 수 없다.
- SQL을 쓸 일 없이 오롯이 Object-Oriented 방식으로만 데이터를 다룰 수 있다. 데이터는 Object로 표현되며, NSManagedObjectModel의 인스턴스로 구현된다. 이러한 Object가 관계를 형성하여 Object Graphs를 이루고 이를 관리하는 프레임워크가 바로 Core Data이다.
- 관계형 데이터베이스에서 처럼 객체나 변수를 사상(mapping)한다. 코어 데이터도 내부적으로는 SQL을 이용하여 데이터를 저장하지만, 개발자는 Xcode에 내장된 데이터 모델 에디터를 통해 데이터의 타입, 관계(Graphical Relationship)를 지정하고 코드로 관련 클래스를 수정할 수 있다. 코어데이터를 사용할 때 Swift나 Object-c를 이용하여 개발할 수 있으므로 더 익숙하게 사용할 수 있다는 장점이 있다.
- In-Memory 방식이 존재 : 읽고 쓰는 모든 데이터는 원칙적으로 메모리에 로드된 다음에 처리 (영구 저장소를 아예 사용하지 않고 순수하게 인메모리 방식으로만 사용하는 것이 가능)
장점
- CoreData는 설정 및 사용이 간단
In Memory
로 성능이 빠름
- 모든 버전이 관리되며, 한 버전에서 다른 버전으로 쉽게 마이그레이션 가능(디바이스에 이미 있는 콘텐츠를 유지하면서)
단점
- Threading 정책이 어려움
- 데이터베이스의 모든 새 object에 대해 NSManagedObject의 subclass를 사용하도록 강요됨
- 때때로 NSManagedObjectContext는 데이터베이스 변경 동기화에 문제가 있습니다.
기타 비교
SQLite VS Core Data
보통 SQLite는 lightweight solution이 필요한 경우에, 코어 데이터는 complex object graph가 필요한 경우에 사용한다. 코어데이터가 SQLite보다 더 빠르게 기록을 가져올 수 있지만 더 많은 메모리와 저장 공간을 사용한다.
- 속도: Core Data > SQLite
- 메모리 및 저장공간 사용: Core Data > SQLite
Realm vs Core Data
- 설치가 쉽고 무제한 사용이 가능하다.
- Core Data 보다 빠르다.
- 서드 파티다보니 Core Data보다 앱 volume이 더 크다.
User Default vs Core Data
- User Default는 모든 데이터가 키/밸류 형태로 짝을 이루기 때문에 코어데이터보다 빠르지만, 말 그대로 유저 정보와 같이 작은 데이터를 저장하는데 사용된다.
참조 및 출처
coredata가 database가 아닌가요..?