UserDefaults와 Core Data 공통적으로 데이터를 저장 / 보관하는 객체이다.
UserDefaults

- UserDefaults는 앱 시작시 key-value 쌍을 영구적으로 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스이다.
- 런타임에 UserDefaults Object를 사용하여 default DB로부터 앱의 default value를 읽는다. UserDefaults는 default value가 필요할 때마다 사용자의 default DB를 열 필요가 없도록 정보를 캐시한다. default value를 설정하면 현재 프로세스 내에서 동기적으로 변경되고 영구 저장소 및 기타 프로세스에선 비동기적으로 변경된다.
- UserDefaults는 사용자 기본 설정과 같은 단일 데이터 값에 적합합니다.
장점
- 사용하기 쉽다.
- Thread safe하다. (동기화 적정 없이 어떤 쓰레드에서든 읽고 쓸 수 있다.)
- UserDefault는 앱과 앱 extensions에서 공유된다.
단점
- 동일한 키의 값을 쉽게 재정의 할 수 있다. (키 충돌 가능성)
- 암호화되지 않는다.
- Unit Test 시 UserDefault는 잘못된 값을 일으킬 수 있다.
- UserDefaults는 앱의 어느 곳에서나 전역적으로 변경 될 수 있으므로 inconsistent한 상태에서 쉽게 실행할 수 있다.
Core Data

- Core Data는 데이터를 저장하고 관리하기 위한 프레임워크이다. (Core Data는 DataBase가 아님 ORM(Object Relational Mapping) 프레임워크)
- Core Data의 경우 해당 기기에 데이터를 저장하므로 오프라인에서도 동작 가능하며, 클라우드를 제외하고는 데이터를 공유할 수 없다.
- In-Memory 방식이 존재 : 읽고 쓰는 모든 데이터는 원칙적으로 메모리에 로드된 다음에 처리 (영구 저장소를 아예 사용하지 않고 순수하게 인메모리 방식으로만 사용하는 것이 가능)
장점
- 설정 및 사용이 간단
- In Memory 로 성능이 빠르다.
- 모든 버전이 관리되며, 한 버전에서 다른 버전으로 쉽게 마이그레이션 가능하다. (디바이스에 이미 있는 콘텐츠를 유지하면서)
단점
- Threading 정책이 어렵다.
- 데이터베이스의 모든 새 object에 대해 NSManagedObject의 subclass를 사용하도록 강요된다.
- 때때로 NSManagedObjectContext는 데이터베이스 변경 동기화에 문제가 있다.
User Default vs Core Data
UserDefaults는 key-value값으로 빠르게 저장할 수 있는 장점이 있고 CoreData에 비해서 쉽게 사용할 수 있기 때문에 되도록이면 간단한 저장 데이터, 예를 들자면 스위치의 ON/OFF 여부 처럼 간단한 부분을 저장하고 로드하는 곳에서 사용하면 좋다.
Core Data는 모델을 이용하여 사용자의 데이터를 대용량으로 받아야하는 경우에 사용하면 좋다. 예를 들자면, 리마인더에 사용하는 메모 String, Image Data, 평점 등등 데이터를 한번에 받기 위해서는 CoreData를 사용하는 것이 좋다.