[ swift - 내부 저장소 ]

Yr Yr·2024년 1월 5일
0

TIL

목록 보기
28/39

내부 저장소

  • 앱이 종료되어도 기억하고 있어야 할 비휘발성 데이터를 저장하기 위해 사용되는 개념.

디바이스에 데이터를 저장하는 여러 방법

[ UserDefaults ]

  • 간단한 키-밸류 데이터를 저장하는 데 사용된다. 주로 설정값이나 사용자 기본 설정과 같은 작은 데이터를 저장할 때 사용된다. 키값은 꼭 String타입이어야 한다.
    // 데이터 추가 및 업데이트
    UserDefaults.standard.set(value, forKey: key)
    
    // 데이터 조회 | Any? 타입이므로 as를 사용한 타입 변환 후 사용
    UserDefaults.standard.value(forKey: key)
    
    // 데이터 조회 | 특정 타입으로 반환할 경우 (String)
    UserDefaults.standard.string(forKey: key

    [ KeyChain ]

    - iOS 앱에서 보안 정보를 안전하게 저장하고 관리하기 위한 메커니즘. 키체인은 보안 관련 정보를 저장하는 데 사용된다. 키체인은 암호화되어 있어 앱 외부에서 쉽게 접근할 수 없으며 사용자 데이터의 안전성을 보장한다.

    [ 파일 시스템 ]

    - 앱 내부 또는 외부 파일 시스템에 데이터를 저장할 수 있다. 주로 텍스트파일,이미지,동영상 등의 데이터를 저장할 때 사용된다.

    [ Core Data ]

    - iOS 앱에서 데이터를 관리하고 영구적으로 저장하는 데 사용되는 프레임워크. 데이터 모델을 정의하고 이를 기반으로 데이터를 읽고 쓸 수 있다.

Core Data 사용 설정

데이터 모델 만들기

Core Data Stack 설정

- Core Data Stack : 데이터를 관리하고 저장하기 위한 Core Data 프레임워크의 핵심 구성 요소들의 집합

* NSManagedObjectModel : 앱의 데이터 모델을 정의하는 객체. entity와 그들의 속성을 정의하고 이러한 모델은 데이터베이스 스키마에 해당한다.
* NSManagedObjectContext : 앱의 데이터를 가져오거나 수정하는 데 사용되는 객체. 주로 메모리에서 데이터를 관리하고 데이터베이스와 상호작용한다.
* NSPersistentStoreCoordinator : 영구 저장소를 관리하고 데이터베이스와의 통신을 담당하는 객체. SQLite,XML,Binary 등 다양한 데이터 저장소 유형과의 연결을 관리한다.
* NSPersistentStore : 실제로 데이터를 영구적으로 저장하는 데 사용되는 데이터베이스 파일이나 다른 형태의 저장소이다.
  • AppDelegate 파일에서 Core Data Stack을 설정할 수 있다.

    import CoreData
    
    // Core Data Stack
    lazy var persistentContainer: NSPersistentContainer = {
    	let container = NSPersistentContainer(name: "생성한 Data Model명")
       	container.loadPersistentStores(completionHandler: { (storeDescription, error) in
       		if let error = error as NSError? {
               	fatalError("Unresolved error \(error), \(error.userInfo)")
            })
            return container
    }()
    
    // Core Data Saving support
    func saveContext() {
    	let context = persistentContainer.viewContext
       	if context.hasChanges {
             do {
                 try? context.save()
             } catch {
                 let nserror = error as NSError
                 fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
             }
         }
    }

Data Model 파일 구성하기(데이터 모델링)

Entity : 데이터 모델 내에서 객체의 유형을 정의하고 해당 객체들이 갖는 속성들을 나타낸다.

  • Entity 추가하기

    Attribute : Entity가 가지는 속성들을 나타낸다.

  • Attribute 추가하기

    코드에서 Data 사용하기(CRUD하는 방식)

    import CoreData
    
    // persistentContainer에 접근
    var persistentContainer: NSPersistentContainer? {
    	(UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
    }
    
    // create
    guard let context = self.persistentContainer?.viewContext else { return }
    
    let newCar = Car(context: context)
    
    newCar.id = UUID()
    newCar.name = "benz"
    
    try? context.save()
    
    // read
    guard let context = self.persistentContainer?.viewContext else { return }
    
    let request = Car.fetchRequest()
    let cars = try? context.fetch(request)
    
    print(cars)
    
    // update
    guard let context = self.persistentContainer?.viewContext else { return }
    
    let request = Car.fetchRequest()
    
    guard let cars = try? context.fetch(request) else { return }
    
    let filteredCars = cars.filter({ $0.name == "benz" })
    
    for car in filteredCars {
    	car.name = "tesla"
    }
    
    try? context.save()
    
    // delete
    guard let context = self.persistentContainer?.viewContext else { return }
    
    let request = Car.fetchRequest()
    
    guard let cars = try? context.fetch(request) else { return }
    
    let filteredCars = cars.filter({ $0.name == "tesla" })
    
    for car in filteredCars {
    	context.delete(car)
    }
    
    try? context.save()

0개의 댓글