AOS 에서 sqlite 로 유틸 앱을 만들어 배포 준비 단계에 있었다.
원래는 크로스 플랫폼인 React Native 로 작업할 생각이었지만 , 애초에 선보인 유틸앱은 AOS 에서만 호환되도록 작업한 거라서
IOS 만들 생각이 없다가 갑자기 필요를 느껴 작업하게 되었다.
그 중에서 Sqlite 랑 비슷한 기능을 가진 CoreData 를 적용하는 과정에서 어려움을 느껴 기록을 남기기로 했당
우선 CoreData 는
Core Model Data, CoreDataClass , CoreDataProperties 크게 3가지를 가지고 있어야 한다.
1. CoreData의 주요 구성 요소
CoreData를 사용할 때 기본적으로 3가지 주요 파일이 필요합니다.
✅ 1) CoreData Model (.xcdatamodeld)
- 데이터베이스의 스키마 역할
- Entity(테이블), Attribute(컬럼), Relationship(관계) 등을 정의
- Xcode에서 시각적으로 설정 가능
🔹 예제 (CoreData 모델 정의)
// User Entity가 있다고 가정
@objc(User)
class User: NSManagedObject {
@NSManaged var name: String
@NSManaged var age: Int16
}
📌 설명
- @objc(User) → CoreData에서 User 객체를 인식할 수 있도록 설정
- NSManagedObject를 상속받아 CoreData의 관리 객체로 사용
- @NSManaged → CoreData에서 속성을 자동으로 관리
✅ 2) CoreData Class (User+CoreDataClass.swift)
CoreData에서 NSManagedObject 클래스를 직접 생성하여 관리하는 파일입니다.
이 파일은 객체의 실제 기능을 정의합니다
import Foundation
import CoreData
@objc(User)
public class User: NSManagedObject {
}
📌 설명
- User 클래스는 CoreData에서 사용할 수 있는 관리 객체(NSManagedObject)
- 이 파일을 통해 CoreData에서 User 객체를 생성/수정/삭제할 수 있음
✅ 3) CoreData Properties (User+CoreDataProperties.swift)
CoreData에서 속성(Property)을 관리하는 파일입니다.
import Foundation
import CoreData
extension User {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User")
}
@NSManaged public var name: String?
@NSManaged public var age: Int16
}
📌 설명
- fetchRequest() → 특정 Entity 데이터를 가져오기 위한 요청을 생성
- @NSManaged → CoreData가 관리하는 속성으로 선언
2. CoreData 기본 사용법
✅ 1) CoreData 스택 구성
CoreData를 사용하려면 CoreData Stack을 구성해야 합니다.
이 작업은 일반적으로 AppDelegate.swift 또는 CoreDataManager.swift에서 설정합니다.
import CoreData
class CoreDataManager {
static let shared = CoreDataManager()
// Persistent Container 설정
let persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MyCoreDataModel") // 모델 이름
container.loadPersistentStores { storeDescription, error in
if let error = error {
fatalError("Unresolved error \(error)")
}
}
return container
}()
var context: NSManagedObjectContext {
return persistentContainer.viewContext
}
// 데이터 저장 함수
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)")
}
}
}
}
📌 설명
- NSPersistentContainer → CoreData의 기본 데이터 관리 컨테이너
- context → 데이터를 저장/검색/삭제하는 핵심 객체
- saveContext() → 변경 사항 저장
✅ 2) 데이터 추가 (Create)
데이터를 추가하려면 새로운 엔티티 객체를 생성한 후 저장해야 합니다.
func addUser(name: String, age: Int16) {
let user = User(context: CoreDataManager.shared.context)
user.name = name
user.age = age
CoreDataManager.shared.saveContext()
}
📌 설명
- User(context:) → 새 User 객체 생성
- saveContext() → CoreData에 데이터 저장
✅ 3) 데이터 가져오기 (Read)
저장된 데이터를 가져오려면 fetchRequest()를 사용합니다.
func fetchUsers() -> [User] {
let fetchRequest: NSFetchRequest<User> = User.fetchRequest()
do {
let users = try CoreDataManager.shared.context.fetch(fetchRequest)
return users
} catch {
print("Error fetching users: \(error)")
return []
}
}
📌 설명
- NSFetchRequest<User> → User 데이터를 가져오는 요청 생성
- context.fetch(fetchRequest) → 요청을 실행하여 데이터를 가져옴
✅ 4) 데이터 수정 (Update)
저장된 데이터를 수정하려면 데이터를 검색한 후 값을 변경하고 저장합니다.
func updateUser(user: User, newName: String, newAge: Int16) {
user.name = newName
user.age = newAge
CoreDataManager.shared.saveContext()
}
📌 설명
- user.name, user.age 값 변경 후 saveContext() 호출
✅ 5) 데이터 삭제 (Delete)
데이터를 삭제하려면 삭제할 객체를 가져와서 context에서 제거하면 됩니다.
func deleteUser(user: User) {
CoreDataManager.shared.context.delete(user)
CoreDataManager.shared.saveContext()
}
📌 설명
- context.delete(user) → CoreData에서 해당 객체 제거
- saveContext() → 변경 사항을 저장
3. CoreData의 장점과 단점
✅ 장점
✅ 객체 지향적인 데이터 관리 → SQL을 직접 다룰 필요 없이 데이터 관리 가능
✅ 자동 저장 및 관리 → 데이터를 영구적으로 저장 가능
✅ 관계형 데이터 모델 지원 → 여러 엔티티 간의 관계 설정 가능
❌ 단점
❌ 메모리 사용량 증가 → 메모리 관리 최적화 필요
❌ 단순한 데이터에는 오버헤드가 큼 → 작은 데이터는 UserDefaults나 SQLite가 더 적합
4. 정리
✅ CoreData는 Swift에서 데이터 저장/관리할 수 있는 강력한 프레임워크
✅ 주요 파일: CoreData Model (.xcdatamodeld), CoreDataClass, CoreDataProperties
✅ CRUD(Create, Read, Update, Delete) 기본 동작을 CoreDataManager로 관리 가능
✅ CoreData는 객체 지향 방식으로 SQL을 사용하지 않고 데이터를 다룰 수 있음
🚀 즉, CoreData를 사용하면 데이터 관리를 효율적으로 할 수 있으며, CoreData Stack을 올바르게 구성하는 것이 중요합니다!
이렇게 요약 및 정리를 해보았으니 이제 내가 직접 해본 부분을 설명해보겠다.
밑의 사진처럼
CoreData 를 세팅해놓으면
Editor -> Create NSManagedObject Subclass...
를 클릭하면
이렇게 생성이 된다.
그릭 밑에를 쉽게 변환할 수 있도록 세팅을 해준다.
디버깅 용을 위한 메소드도 설정해준다.
그리고 위의 코드처럼 불러오면
잘 불러와진다 !!
후...
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif)
참고사이트
'Swift' 카테고리의 다른 글
Swift_ 변수의 종류 (0) | 2025.02.11 |
---|---|
Swift_ intrinsicContentSize / Frame / bounds (0) | 2025.02.08 |
Swift_ CoreData Model , extension , Struct (0) | 2024.08.02 |