ABOUT ME

Today
Yesterday
Total
  • [iOS] CoreData vs UserDefaults
    Apple🍎/iOS 2024. 4. 15. 13:48

    CoreData란?

    코어데이터는 SQLite를 데이터의 영구 저장소로서 사용할 뿐, 코어데이터 자체는 명백히 ‘프레임 워크’이다.
    *DataBase가 아닌 ORM(Object Relational Mapping) 프레임워크

    저장되는 곳은?

    CoreData는 데이터베이스 형태로 구조화된 데이터를 저장하고 관리하는데 사용된다.
    SQLite와 유사한 내부 구조를 가지며, "Documents" 디렉토리 내SQLite 파일 형태로 저장됩니다. 대용량의 데이터나 복잡한 데이터 모델을 다루는 데 유용합니다.

    CoreData 구조

    *관리 객체란?-> DB의 테이블 행, 1개의 레코드를 의미

    • 맨 위의 파란색인 Persistent Container(영구 컨테이너)
      • 코어 데이터 스택 자체의 생성과 관리를 담당하는 컨테이너
      • 관리 객체 context에 대한 액세스를 제공한다
    • 관리 객체 context
      • 캐시 데이터의 역할, 여기에 저장된 후 변경 사항을 저장하라는 신호를 받으면 그때 core data stack을 거쳐서 영구 저장소(SQLite)에 기록됨.
    • 관리 객체 model
      • 엔티티 개념을 정의, 스키마와 유사
      • 엔티티, 관계, 가져온 속성, 영구 저장소, 가져오기 요청이 포함된다
      • 관리 객체에 대한 모든 것을 명세하는 곳
    • 영구 저장소 코디네이터(persistent store coordinator)
      • 저장된 데이터에 직접 접근할 수 있는 것은 코디네이터
      • (이 친구가 없으면 model, context가 아무것도 못함)
      • Context, model 둘다 coordinator와 연결되어 있는데,
      • context(캐시)가 데이터 관련 요청을 store coordinator에 하면 코디네이터는 모델(명세서)를 참조해서 데이터를 반환/저장소에 저장한다

    코드로 보면

     


    “Products”의 이름을 가진 Model을 기반으로 생성된 Persistent Container을 생성하는 것


    Persistent container를 들여다보면 위처럼 코어 데이터 스택 구조를 이루는 Model(managedObjectModel), Context, Store Coordinator를 가지고 있는 것을 볼 수 있다.

    CoreData 특징

    • SQLite를 기반으로 사용되는 프레임워크이기 때문에 구조적인 데이터를 저장하는 것에 특화된다.
    • In-Memory 방식이 존재 : 읽고 쓰는 모든 데이터는 원칙적으로 메모리에 로드된 다음에 처리 (디스크 검색보다 자료 접근이 훨씬 빠른 것이 가장 큰 장점이다, 영구 저장소를 아예 사용하지 않고 순수하게 인메모리 방식으로만 사용하는 것이 가능)
    • 모든 버전이 관리되며, 한 버전에서 다른 버전으로 쉽게 마이그레이션 가능(디바이스에 이미 있는 콘텐츠를 유지하면서)
    • 데이터베이스의 기능들을 가지고 있으면서, 그 밖에 오브젝트 그래프를 관리하거나
      데이터 등의 변화를 감지하는 이벤트를 발생시켜 UI 데이터를 동기화 시키는데 유용하다.
      코어 데이터의 주로 다음과 같이 사용된다.
      • 데이터의 캐싱을 위해 디바이스 내부에 영구적으로 저장하기 위해 사용된다.
      • Undo 와 Redo 같은 기능을 수행하기 위해 사용된다. (롤백 가능)

    UserDefaults란?

    앱을 실행하는 동안 지속적으로 키-값 쌍을 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스.
    User Default는 모든 데이터가 키/밸류 형태로 짝을 이루기 때문에 코어데이터보다 빠르지만, 말 그대로 유저 정보와 같이 작은 데이터를 저장하는데 사용된다.

    저장 되는 곳은?

      • 앱이 실행되는 시점에 데이터를 저장할 기본 데이터베이스가 생성됨(앱 캐시 디렉토리 생기는 듯한 느낌)
      • 기본 데이터 베이스는 Property list를 기반으로 함(.plist) 파일에 xml형식으로 데이터가 저장됨

    홈 디렉토리 > Library > Preferences > .plist 에서 확인 가능

    •  
    • plist파일이 sandbox내의 bundle container에 저장됨
    • sandbox는 앱 실행시 생성되는 db자체에 있는 것이므로 => 앱을 삭제해야만 해당 파일에 저장한 데이터가 제거됨
    • sandbox에 대해 자세히 알고싶다면? - Sandbox란?

    저장 방식

    • 기본 데이터형을 제공하고 있다
    • UserDefaults.standard


      userdefaults는 싱클톤 패턴의 인스턴스이므로, 공유된 기본 값 객체를 반환하는 함수이다.
      *싱글톤 패턴이란?
      객체를 1개를 공유/유지하는 패턴. 여러 곳에서 선언하여도 이미 선언된 객체를 반환하여 객체를 1개로 유지하는 패턴이다.
      let defaults = UserDefaults.standard

    데이터 저장방법

    defaults.set("value", forkey: "key")

    데이터 가져오기

    let data1 = defaults.object(forkey: "key") as! String
    let data2 = defaults.string(forkey: "key")

    타입을 신경쓰지 않고 꺼낸 뒤 올바른 타입으로 타입캐스팅을 해주거나, 타입에 맞는 메서드를 사용한다.

    사용자 정의 타입 저장하려면?

    UserDefaults는 Data 형을 따르는데, 이 Data 타입은 Base64 인코딩 형식을 따른다. 즉, 저장할 객체는 모두 Base64 인코딩을 거쳐야 한다.
    기본 타입인 Int, String 등은 UserDefaults를 사용할 때 내부적으로 적용되지만, 구조체 같은 경우에는 직접 변환해야 한다.

    CoreData vs UserDefaults

    UserDefaults는 key-value형태로 CoreData보다 속도가 빠를 순 있지만,
    앱의 "Preferences" 디렉토리에 저장된다.

    Preferences 디렉토리는 앱의 설정 및 사용자 환경 설정과 관련된 정보가 저장되는 공간이므로,
    대용량의 데이터는 넣지 않고, 키-값 형태로 사용자 환경 설정을 저장하는 파일을 주로 넣는 목적이 있다.

    그러므로 UserDefaults는
    사용자의 앱 알림 수신, 자동 로그인 여부, 팝업창 띄우기 여부, 앱 테마 설정 등의
    유저의 설정 정보로 쓰인다.

    반면에 CoreData는 SQLite와 유사한 내부 구조를 가지며, "Documents" 디렉토리 내에 SQLite 파일 형태로 저장된다.

    이 Documents 디렉토리는 앱이 생성하는 데이터 파일이 저장되는 곳으로,
    사용자가 앱에서 생성하는 콘텐처, 데이터베이스 파일(CoreData), 사용자가 저장하는 파일 등이 여기에 저장된다.
    따라서 대용량의 데이터나 복잡한 데이터 모델을 다루는 데 유용합니다.


    참고
    UserDefaults 박살내기!

Designed by Tistory.