티스토리 뷰
2025.06.12 - [iOS개발/Swift 기본] - Swift iOS 저장소 알아보기 FileManager 편
Swift iOS 저장소 알아보기 FileManager 편
안녕하세요.요즘 여러가지를 공부하다가문뜩 iOS 저장소에는 어떤 것들이 있는지 궁금해져서 정리해봤는데UserDefaultsFileManagerCore DataSQLiteKeyChain별도의 설치 없이 사용이 가능한 저장 방법은 이렇
world-of-larooly.tistory.com
안녕하세요.
오늘은 Core Data 편입니다.
Core Data는 저장소보다는 데이터를 다루는 도구인데
저장 기능도 가지고 있다로 이해하시는게 좋을 것 같아요.
(제목에서 저장소라는 표현은 저장소 시리즈다보니....)
Core Data의 경우에는 원하는 데이터 형식을 만들어서 활용할 수 있습니다.
(단 Core Data 도 Sandbox 영역이기 때문에 앱 삭제시 같이 사라집니다.)
이게 무슨 말이냐하면
- key-Value 이런 식으로 저장하는 UesrDefaults
- .txt / .pdf 진짜 이런 파일을 저장하는 파일 매니저
애네랑 다르게 내가 원하는 데이터를 선언하고 사용하고 저장할 수 있다는 의미입니다.
다만 사용하실때 설정을 해주셔야 합니다. (이게 좀 많아요)
예시를 보시면 바로 감이 오실 겁니다.
0. 데이터 모델 만들기
- Core Data 를 사용할 프로젝트에 아래처럼 Data Model을 눌러 새로 만들어주세요.
- 참고로 저처럼 아래에 선택창이 뜨시는 분들이 계실껍니다.
- 여기서 자세히 보면 끝에 d 가 붙은 친구를 선택해주세요!!
궁금하신 분들(저포함) 을 위해 간단히 설명드리면 이렇다고 합니다.
- xcdatamodeld : 여러 데이터 모델 패키지
- xcdatamodel : 단일 데이터 모델
저희는 아예 처음이라 아무것도 없는 상태이기때문에 패키지로 선택할께요.
* 반드시 확인
- 만약 처음부터 Core Data 를 선택하신게 아니라 추후에 추가하시는 분이라면
AppDelegate.swift 에 AppDelegate 클래스 안에 아래 코드를 추가해주세요.
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: ".xcdatamodeld파일이름")
// 파일명으로 변경해야합니다.
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - 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)")
}
}
}
여러분이 만든 데이터 파일을 Xcode 가 찾게 도와주는 코드입니다.
파일 이름 넣는 부분은 반드시 수정해서 넣어주세요.
1. 데이터 뼈대 만들기
지금부터 여기가 강아지 유치원이라고 생각할께요.
아래 부분에 자세히 보시면 Add Entity 가 있는데 이 버튼 눌러서 Entity 하나 만들어줄께요.
Entity 는 저희가 사용할 데이터의 뼈대라고 생각하시면 됩니다.
그리고 Attributes 에 데이터에 필요한 뼈대 이름과 타입을 만들어 줍니다.
자 이제 관리해야할 강아지들의 프로필 뼈대를 만들었으니 데이터를 저장해봅시다.
그 전에 사용하려는 곳 코드에 아래 한줄을 추가해주세요.
import CoreData // 사용하시는곳 정의한곳 전부 필수입니다.
2. 데이터 저장
그냥 이렇게 하면 되나 했지만 당연히 안되네요. (에초에 코드도 틀렸...)
과정 하나가 빠져서 그런거니 빠르게 진행해줍니다. (또 설정...)
만들어준 파일 클릭 > 맨위 Editor > Create NSManagedObject Subclass... 클릭 > Next 클릭 > Next 클릭
참고로 아래 있는건 Swift Data 랑 관련된 기능이라고 합니다.
* Swift Data : iOS 17.0이상 부터 사용가능한 기능 swiftUI 에 좀 더 적합한 구조라고 합니다.
아마 추가하시면 아래처럼 두개의 파일이 생길텐데 지금부터는 설정에 따라 나뉩니다.
* 갑자기 무슨 설정이요?
Invalid redeclaration of '이름'
'이름' is ambiguous for type lookup in this context
각 파일에 이런 오류가 보이실 텐데 옵션에 따라 오류가 사라지게 됩니다.
저희가 Entities 만들때 설정을 자세히 보시면 Class Definition 이라고 되어 있습니다.
여기서 3가지 설정이 있는데 자신의 상황에 맞게 해주시면 되겠습니다.
- Class Definition : 모두 자동으로 알아서 해주세요. (두 파일 다 사용 불가)
- Manual/None : 저는 둘 다 제가 만들께요. (두 파일 다 사용가능)
- Category/Extension : 저는 사용할 함수 정도만 만들래요. (Properties 사용불가 /Class 수정 가능)
저는 강아지를 등록할 때 쓸 함수는 제가 만들고 싶으나 딴 건 수정하고싶지 않으니
Category/Extension 으로 옵션을 바꾸고 Properties 만 삭제할께요.
여기서 사용 불가라고 말씀드린 애들은 아예 삭제해주시면 됩니다.
빨간 줄이 계속 있으시면 Xcode를 종료 후 다시 켜주세요.
그럼 CoreDataClass.swift 에 저는 이렇게 하나 만들어 줄께요.
@objc(Dog)
public class Dog: NSManagedObject {
// MARK: 강아지 등록 만들기
public func new(context:NSManagedObjectContext,_ name:String,_ weight:Int)->Dog{
let dog = Dog(context: context)// 저장할 강아지 선언
dog.name = name
dog.weight = Int16(weight)
return dog
}
}
이건 필수는 아닌데 저는 데이터 설정 편하게 하려고 추가한 겁니다.
자 그럼 진짜 저장해봅시다.
* 저장
//Save
let cookie = Dog(context: context).new("쿠키", 5)
do{
try context.save()
print("저장하는데 성공했습니다 : \(cookie.name ?? "미정")")
}catch let error as NSError{
print(error)
}
드디어 저장했습니다.
초반 설정이 길어서 그렇지 실제 저장 코드는 간단하네요.
3. 데이터 꺼내오기
바로 넘어가 봅시다.
* 저장된 전체 데이터 들고 오기
- 타입을 보시면 아시겠지만 저희가 앞에서 만들어준 [Entity]형태로 결과가 나옵니다.
- 저의 경우에는 [Dog] 로 넘어오겠죠?
do{
let total = Dog.fetchRequest()// 전체 들고오기
var searchResult = try context.fetch(total) // [Dog]로 변환 ->중요
for dog in searchResult{
print("\(dog.name ?? "미정") : \(dog.weight)")
}
}catch let error as NSError{
print(error)
}
* 조건 걸기
- 근데 저희가 항상 모든 데이터가 필요한 건 아니죠?
- 조건을 걸어서 원하는 데이터들만 들고 오는 것도 가능합니다.
do{
let total = Dog.fetchRequest()
total.predicate = NSPredicate(format: "weight > %d", 10) // 필터 추가
let searchResult = try context.fetch(total)
for dog in searchResult{
print("\(dog.name ?? "미정") : \(dog.weight)")
}
}catch let error as NSError{
print(error)
}
- 이런 식으로 조건을 추가해 원하는 데이터만 가져오는 것도 가능합니다.
4. 데이터 삭제
- 사실 삭제도 크게 다르지 않습니다.
- 명령어만 달라집니다.
// 삭제
do{
let trash = Dog.fetchRequest()
trash.predicate = NSPredicate(format: "name == '쿠키'") // 조건 걸기 ->없으면 전체
let result = try context.fetch(trash)
for dog in result{
context.delete(dog)
print("삭제 성공")
}
}catch let error as NSError{
print(error)
}
- 만약 저 조건이 없었다면 전체 삭제가 되겠죠?
5. 번외 수정은 어떻게 하나요?
- 검색 -> 이미 있음 -> 삭제 후 새로운 데이터 저장 하는 방식을 추천 드립니다.
- 아주 특수하게 아래처럼 변수 하나 선언하고 그걸로 하실 경우에는 수정이 되긴 합니다만 추천하지 않습니다.
-> 변수의 주소값이 같기때문에 context에서 같은 값으로 인식해서 가능한 일입니다.
let cookie = Dog(context: context).new("쿠키", 5)
do{
try context.save()
print("저장하는데 성공했습니다 : \(cookie.weight)")
cookie.weight = 25
try context.save()
print("저장하는데 성공했습니다 : \(cookie.weight)")
}catch let error as NSError{
print(error)
}
-> 즉 이후 다시 불러와서 다른 변수 선언해서 사용하면 다른 값으로 인식합니다.(주소값이 바뀌기 때문, 권장 X)
후 드디어 Core Data 알아보기가 끝났네요.
간단하게 하려 했는데 어쩌다보니 엄청 길어졌네요.

설정 부분만 넘어가면 사용은 쉽기 때문에
처음 CoreData를 다루시는 분들에게 도움이 되었으면 좋겠습니다.
사실 Relation 기능에 대해서도 다루고 싶었는데
이번 글이 생각보다 길어지는 바람에 다루지 못 했네요.
기회가 된다면 다루어 보는 걸로 하겠습니다.
그럼 오늘도 파이팅입니다.
'iOS개발 > Swift 기본' 카테고리의 다른 글
Swift iOS 저장소 알아보기 FileManager 편 (0) | 2025.06.12 |
---|---|
Swift Cryptokit 으로 대칭/비대칭 키를 알아보자 (+PKI) (0) | 2025.05.27 |
Swift 암호화 소금(salt) & Hash 만들어보기 (with. CryptoKit) (0) | 2025.04.18 |
Swift public / private 외 다른 접근 제어자 (0) | 2024.08.29 |
iOS KeyChain 속성 모음 (0) | 2024.07.23 |