본문 바로가기
Swift

Swift_ CoreData 적용기...

by JunsC 2024. 7. 24.
728x90

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... 

를 클릭하면

 

이렇게 생성이 된다.

 

그릭 밑에를 쉽게 변환할 수 있도록 세팅을 해준다.

 

 

디버깅 용을 위한 메소드도 설정해준다.

그리고 위의 코드처럼 불러오면 

잘 불러와진다 !!

 

후...

 

 

참고사이트

 

'Swift' 카테고리의 다른 글

Swift_ 변수의 종류  (0) 2025.02.11
Swift_ intrinsicContentSize / Frame / bounds  (0) 2025.02.08
Swift_ CoreData Model , extension , Struct  (0) 2024.08.02
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."