CRUD 개념

CRUD 는 Create, Read, Update, Delete 를 나타낸다. Create 는 데이터 생성(추가), Read 는 데이터 읽기, Update 는 데이터 업데이트(쓰기), Delete 는 데이터 삭제 를 뜻한다.
데이터 CRUD 는 네이티브(앱) 내부에서도 일어날 수 있고, 서버에서도 일어날 수 있다.
CoreData

CoreData 는 앱에서 기기의 디스크에 데이터를 읽고 쓸 수 있게 돕는 프레임워크로, Swift 로 기기 내 디스크에 데이터를 저장할 수 있는 대표적인 방법으로는 CoreData 와 UserDefaults 가 있다.
아래는 CoreData 로 디스크 공간에 전화번호를 저장하는 방법이다.
1) CoreData 프로젝트 생성

프로젝트를 생성할 때 Storage -> CoreData 로 선택한다.
2) Entity 생성

아래의 Add Entity 버튼을 클릭한 후 Entity 를 만든다. Entity 는 저장될 데이터들의 집합이다.

PhoneBook 이라는 이름으로 Entity 를 생성하고, Attribute 로는 name, phoneNumber 를 추가한다.
이 뜻은 전화번호부 라는 데이터 집합 안에 이름과 전화번호 라는 속성이 부여된 것이다.

오른쪽 인스펙터 영역 중 Codegen 에 대한 개념 설명
- Code Generator 의 줄임말. Entity 를 어떤 형식의 코드로 생성할 것인지 선택하는 속성.
- Manual/None = Entity 의 서브 클래스를 자동으로 생성하지 않고 개발자가 클래스 작성.
- Class Definition = Entity 의 서브 클래스를 자동으로 생성.
- Category/Extension = Entity 클래스와 함께 extension 을 위한 파일까지 생성.
여기서는 Menual/None 으로 설정
3) Code Generate

Editor 에서 Create NSManagedObject Subclass 를 클릭해서 코드를 자동으로 생성한다.

그럼 위 사진처럼 2가지의 파일이 생성된다.
PhoneBook+CoreDataClass.swift 간단 설명
import Foundation
import CoreData
@objc(PhoneBook)
public class PhoneBook: NSManagedObject {
}
NSManagedObject 는 Core Data 프레임워크에서 관리되는 객체를 나타내는 기본 클래스로, 이 클래스는 Core Data 엔티티와 상호작용을 관리하며, 속성 값의 저장 및 검색을 처리한다.
PhoneBook+CoreDataProperties.swift 간단 설명
import Foundation
import CoreData
extension PhoneBook {
@nonobjc public class func fetchRequest() -> NSFetchRequest<PhoneBook> {
return NSFetchRequest<PhoneBook>(entityName: "PhoneBook")
}
@NSManaged public var name: String?
@NSManaged public var phoneNumber: String?
}
extension PhoneBook : Identifiable {
}
- @nonobjc = Objective-C 에서는 동작하지 않고 Swift 에서만 동작하는 메서드임을 명시.
- fetchRequest() = PhoneBook 에 대한 여러가지 데이터 검색을 도움.
- @NSManaged = CoreData 에 의해 관리되는 객체를 의미.
- Identifiable = PhoneBook 타입이 고유하게 식별될 수 있음을 의미.
4) NSPersistentContainer 생성

NSPersistentContainer 는 Core Data 에서 데이터를 저장하고 관리하는 데 필요한 핵심 객체로 직역하자면 영구적인 저장 장소를 뜻한다.
먼저 NSPErsistentContainer 를 생성해줘야 하는데, 프로젝트 생성할 때 CoreData 를 사용한다고 체크해줬으므로, AppDelegate.swift 파일에 기본적으로 NSPersistentContainer 를 세팅하는 코드가 존재한다.

AppDelegate.swift 파일 아래쪽에보면 saveContext() 라는 메서드도 자동으로 생성되어 있는데, 직역하면 문맥을 저장한다는 뜻으로 데이터의 업데이트(추가, 업데이트, 삭제) 가 일어났으면 saveContext() 를 호출해서 그 문맥을 저장해야 한다.
4) CoreData 를 활용한 CRUD
코드가 너무 길어 따로 작성하지 않고 GitHub 에서 CoreData 부분을 확인하면 된다.
iOS-Proficiency-Week/CoreDataProject at main · sh990920/iOS-Proficiency-Week
iOS 앱개발 숙련주차 블로그 정리 자료. Contribute to sh990920/iOS-Proficiency-Week development by creating an account on GitHub.
github.com
UserDefaults
UserDefaults 또한 디스크에 데이터를 저장할 수 있게 돕는 도구로 CoreData 보다 사용법이 간단하다. key 와 value 를 이용해서 값을 저장한다. 대량의 데이터를 담는데에는 CoreData가, 비교적 단순한 데이터를 담는 데에는 UserDefaults 가 적절하다.
UserDefaults 의 CRUD
- UserDefaults.standard.set() 메서드를 통해서 Create 와 Update 작업을 수행한다.
- UserDefaults.standard.string(forKey: "") 메서드를 통해서 Read 작업을 수행한다. (각 타입에 맞는 메서드를 사용한다.)
- bool 타입 Read: UserDefaults.standard.bool(forKey: "")
- Int 타입 Read: UserDefaults.standard.integer(forKey: "")
- UserDefaults.standard.remoteObject(forKey: "") 메서드를 통해서 Delete 작업을 수행한다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Create
UserDefaults.standard.set("010-1111-2222", forKey: "phoneNumber")
// Read
let phoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
print("저장된 전화번호: \(phoneNumber)")
// Update
// 같은 키에다가 set 을 하면 됨.
UserDefaults.standard.set("010-6666-7777", forKey: "phoneNumber")
let newPhoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
print("바뀐 전화번호: \(newPhoneNumber)")
// Delete
UserDefaults.standard.removeObject(forKey: "phoneNumber")
print("전화번호가 남아있는가: \(UserDefaults.standard.string(forKey: "phoneNumber"))")
}
}
만약 Int, String 과 같은 원시타입이 아닌 Struct 나 Class 타입을 저장하기 위해서는 json 인코딩 과정이 필요하다.
UserDefaults 를 활용한 간단한 포스트잇 앱 만들기

코드는 너무 길어서 GitHub 를 통해 확인하면 된다.
iOS-Proficiency-Week/Post_itProject at main · sh990920/iOS-Proficiency-Week
iOS 앱개발 숙련주차 블로그 정리 자료. Contribute to sh990920/iOS-Proficiency-Week development by creating an account on GitHub.
github.com
'swift' 카테고리의 다른 글
| 네트워크 통신 (2) | 2024.07.10 |
|---|---|
| Swift Delegate 패턴 (0) | 2024.07.09 |
| 메모리 관리 이해 (0) | 2024.07.09 |
| UIViewController 생명주기 (3) | 2024.07.09 |
| UISegmentedControl (0) | 2024.07.03 |