로컬 데이터 저장 방식

JIN·2023년 2월 17일
0
post-custom-banner

로컬데이터 저장방식

앱에 데이터를 저장하는 방식

IOS에는 앱에 데이터를 저장하기 위한 여러가지 방식이 있다.

  • UserDefaults
  • Keychain
  • FileManager
  • SQLite
  • CoreData

UserDefaults

  • 사용자의 기본 설정 정보”를 저장하는 데이터베이스

  • 사용자가 라이트모드를 선호하는지, 다크모드를 선호하는지, 매일 알람을 받고 싶은 시간, 실제로 알람을 받고 싶은지 등을 저장하는데 사용

    • 예 ) 아이폰의 “사운드 및 햅틱”
  • 설정창을 만들때는 UserDefaults를 쓰는 것이 좋지만 사용자가 만들어내는 많은 양의 데이터를 저장하기에는 부적합하다.

    작동 방식

    • plist에서 유지관리 된다.(프로퍼티 리스트)
    • plist에 간단한 데이터타입(strings, numbers, dates, boolean, urls, datas 등)을 저장하고록 설계되어 plist로 디스크에 저장된다.

Keychain

  • 비밀번호, 신용카드 정보, 인증서 등 안전하게 저장하고 싶은 작은 데이터를 저장하는 암호화된 데이터베이스
  • 암호, 키, 인증서 같은 민감한 데이터를 저장하려면 키체인을 사용해야 한다.
  • 키체인에 저장된 데이터는 동일한 개발자의 다른 앱에서 액세스 할 수 있다.
    • SSO → 한 앱에 로그인 하면 다른 앱이 자동으로 로그인 하는 것과 같은 보안 로그인
  • 키체인은 디스크의 특수파일로 하드웨어로 암호화 되어 있으면 low level의 API가 많다.

File Manager

  • 파일 시스템과 상호작용 할 수 있다. 파일과 디렉토리를 찾고, 만들고 복사하고 이동하는데 사용된다.

  • 보통 컴퓨터는 하드디스크 같은 보조 기억 장치에 파일들을 저장하므로, 파일시스템이란 하드디스크에 있는 데이터를 쉽게 찾고 접근하기 위해 정리하는 체제 이다.

  • 여러 종류가 있지만 파일에 쉽게 접근해 찾을 수 있도록 하드 드라이브를 데이터를 저장하는 작은 유닛으로 나누고 각 유닛에 어떤 데이터가 있는지를 기억하는 방법을 가진다는 공통점이 있다

    • → IOS 에서는 APFS라는 파일시스템을 사용하고 있다.
  • ios의 파일 시스템은 sandbox라고 불리는 곳에 위치하고 하나의 앱은 샌드박스 내에서만 놀 수 있다.

  • 앱을 설치하면 인스톨러가 sandbox 디렉토리 안에 앱을 위한 여러 Container 디렉토리를 만든다.

    이 디렉토리와 파일들에 접근하도록 도와주는 것이 File Manager이다.

SQLite

  • 앱에서 쓰이는 가장 표준적인 데이터베이스 , 애플리케이션이 관계가 있는 많은 양의 데이터를 처리할 경우 SQLite를 사용할 수 있다.
  • 서버리스, 구성이 필요 없는 트랜잭션 SQL 데이터베이스 엔진으로 매우 빠르다.
  • 데이터의 양이 많고 구조화 되어 있는 경우에 적절하게 사용할 수 있다. 효율적인 검새이 가능하고 복잡한 쿼리를 작성할 수 있다.

Core Data —> 선택

  • Apple의 persistence 솔루션, 코어 데이터를 사용하면 앱이 모든 형식의 데이터를 저장하고 다시 가져올 수 있다. 하지만 데이터베이스가 아니다. 객체 관계를 관리하기 위한 프레임워크이다.
  • 저장할 수 있는 데이터 형식
    • SQLite 파일
    • XML 파일
    • 바이너리 파일
    • 인메모리(RAM)
  • 저장/ 로드할 데이터의 양이 많을때 유용하다.
  • 데이터에 몇가지 관계가 있는 경우, 쿼리 / 필터링이 필요한 경우, 정렬 기능이 필요한 경우 등에서 사용된다.
  • 앱의 모델 데이터, 객체관의 관계가 있는 데이터를 저장
  • 객체 그래프를 관리하는 시스템, 속성과 다른 객체에 대한 관계가 있는 객체를 생성, 저장 및 찾아올 수 있다.
  • 코어데이터가 데이터를 저장하기 위해서는 내부적으로 SQLite를 사용하기 때문에 데이터 저장 측면에서는 유사한 기능을 사용할 수 있다.

Core Data 작동 방식

1) NSPersistenceStore (영구 저장소 Next Step)

데이터를 저장하는 파일을 나타낸다. 앱에서 코어데이터를 이용하도록 설정할 때 영구 저장소의 이름, 위치, 타입을 지정해야 한다.

NSURL *storeURL = @"/Document/..../AppData";

2) NSPersistentStoreCoordinator (영구 저장소 관리자)

객체의 데이터를 실제로 저장하고 있는 실제 파일(NSPersistentStore)과 앱이 사용하는 객체 모델 사이를 중개한다. 앱은 NSPersistentStoreCoordinator에 직접 접근할 일이 거의 없다. 단지 코어 데이터 실행 환경을 구성할 때 관리자 객체를 생성만 해주면 된다. 하나 이상의 영구 저장소와의 통신을 관리하기 때문에 데이터가 어떻게 저장되는지를 앱으로 부터 감춘다.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"AppData" withExtension:@"momd"];

NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

3) NSManagedObjectContext (관리 객체 컨텍스트)

관리 객체가 존재하는 영역이다. 앱에서는 관리 객체의 생성, 삭제, 편집, 질의 등을 수행하기 위해 NSManagedObjectContext와 통신한다. 객체들의 변경사항을 관리하며 모든 변경 사항을 한꺼번에 저장하거나 경우에 따라서는 rollback 한다. 전체 데이터 작업을 분리하거나 제한하기 위해 하나 이상의 context를 동시에 사용할 수 있다.

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

[context setPersistentStoreCoordinator:psc];

4) NSManagedObjectModel ( 관리 객체 모델)

관리객체는 관리 객체 모델에서 정의한다 . 객체의 리스트, 각 개체와 연결된 속성 리스트, 각 개체 및 속성과 연결된 유효성 검증, 객체 간의 관계를 포함한다.

5) NSManagedObject (관리 객체)

코어데이터 상에서 실제 정보를 담고 있는 객체를 의미한다. 관리 객체를 키와 그 키에 대응하는 타입의 객체를 가진 Dictionary 객체 처럼 생각할 수 있다.

[MOModel setValue:@"Casablanca" forKey:@"movieName"];

[MOModel valueForKey:@"movieName"];

6) NSFetchedResultsController (추가 기능)

Fetch 요청의 결과와 테이블 뷰를 손쉽게 연결 시켜준다. 이 컨트롤러는 Fetch 결과를 섹션과 줄 단위로 리턴하도록 설정할 수 있고 인덱스를 이용해 접근할 수 있다.

테이블 뷰를 구현할 때 필요한 정보를 얻을 수 있는 메서드도 제공하며, 코어 데이터에서 변경 이벤트가 발생하면 이를 감지한 후 delegate 메소드를 이용해 테이블에 반영할 수 있다.

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] 

initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@"lent" cacheName:nil];

https://developer.apple.com/documentation/coredata

https://velog.io/@nala/iOS-앱에-데이터-저장하기

https://velog.io/@nala/iOS-Core-Data는-대체-무엇인가

https://insubkim.tistory.com/289

https://ebcban.tistory.com/395

profile
배우고 적용하고 개선하기
post-custom-banner

0개의 댓글