티스토리 뷰
2025.06.19 - [iOS개발/Swift 기본] - Swift iOS 저장소(?) 알아보기 Core Data 편
Swift iOS 저장소(?) 알아보기 Core Data 편
2025.06.12 - [iOS개발/Swift 기본] - Swift iOS 저장소 알아보기 FileManager 편 Swift iOS 저장소 알아보기 FileManager 편안녕하세요.요즘 여러가지를 공부하다가문뜩 iOS 저장소에는 어떤 것들이 있는지 궁금해
world-of-larooly.tistory.com
이전 편과 관련이 있기 때문에 한 번 보시는걸 추천드립니다.
저희가 저번에 알아본 CoreData 이대로(?) 보내기 아쉬워서
CoreData 설정할때 아래 보시면 있는 Relationships 이걸 어디에 쓰는 건지 알아볼까합니다.
* Relationships
-https://developer.apple.com/documentation/coredata/configuring-relationships
- 엔터티 간의 관계와 엔터티 간에 변경 사항이 전파되는 방식을 지정합니다. (번역)
- 저희가 정의한 데이터끼리 관계를 만들어 서로 영향을 줄 수 있다고 생각하시면 될 것 같습니다.
저는 강아지와 강아지 주인 데이터를 서로 연결해보는 걸로 만들어 보겠습니다.
1. 연결해줄 데이터 만들기
- 저번이랑 동일하게 'Add Entity' 눌러서 하나 더 만들어줄께요.
- 저는 예시로 강아지 주인을 하나 만들께요. (설정 조심하세요.)
2. Relationships 연결하기
- 이제 두개의 데이터를 서로 연결할께요.
- 저는 서로 찾을 수 있게 서로의 관계를 다른 이름으로 정의할께요.
- 아마 처음에는 Inverse 가 안 보이실텐데 양쪽 다 추가하시면 보이게 됩니다.
- 이때 설정시 주의하실 부분이 있습니다.
여기서 두가지만 설정해서 사용할께요.
* Delete Rule
- 설정에 따라 삭제시 연결된 데이터에 영향을 줍니다(!!!매우 중요!!!)
- 만약 내가 삭제되면 관계된 데이터를 어떻게 처리할지를 결정합니다.
- No Action(비권장) : 아무것도 하지 않습니다.
- Nullify (기본) : 관계만 끊어주세요
- Cascade : 같이 삭제해주세요.
- Deny : 관계가 하나라도 있으면 삭제 불가
저는 감이 잘 안와서 예시를 만들어 볼께요.
Ex1. 주인 -> 강아지 입장 (주인쪽 설정) 에따라 주인 삭제시
- No Action : 강아지 입장에서는 주인이 아직도 연결된 걸로 보임
- Nullify : 주인이 삭제되어 연결이 끊겨 유기견(?)이 되어버림
- Cascade : 같이 삭제됨
- Deny : 강아지가 있으면 삭제가 불가, 주인이 삭제 안됨
Ex2. 강아지 -> 주인 입장 (강아지쪽 설정) 에따라 강아지 삭제시
- No Action : 주인 입장에서는 강아지가 있는걸로 보임
- Nullify : 강아지 하나가 삭제될 뿐 그외 변화 X
- Cascade : 주인도 삭제, 같은 주인을 가진 강아지 데이터에 문제가 생김 (권장 X)
- Deny : 주인이 있으면 삭제 불가, 강아지 삭제 안됨
이제 Type 을 알아봅시다.
* Type
- 하나의 데이터가 여러 데이터와 관계가 가능한지 서로 하나씩만 가능한지 설정합니다.
- 강아지 입장에서는 주인이 한명이지만 주인 입장에서는 강아지가 여러 마리일수도 있죠?
- To Many : 난 여러 연결을 가질수있어요 (ex. 주인입장)
- To One : 난 하나만 연결이 가능해요 (ex. 강아지 입장)
각자 자신의 상황에 맞게 연결하시면 됩니다.
저는 아래처럼 설정하겠습니다.
- 주인 -> 강아지 Cascade / To Many
- 강아지 -> 주인 Nullify / To One
아니 근데 그래서 이거 언제 어떻게 쓰는 걸까요?
3. Relationships 연결
- 관계를 선언했으니 실제로 사용도 해봐야겠죠?
- 생각보다 방법은 간단합니다.
// if 강아지와 주인을 선언했다면
let choco = Dog(context: context)
choco.name = "choco"
let cookie = Dog(context: context)
cookie.name = "cookie"
let Chris = People(context: context)
Chris.name = "Chris"
// 관계 연결
choco.owner = Chris // 초코의주인은 크리스
// 혹은
Chris.myDogs = [choco, cookie]// 크리스의 강아지는 초코,쿠키
// 이 사실을 저장하고 싶으면 save 실행
do{
try context.save() // 이러면 저장이 됩니다
}catch let error as NSError{
print(error)
}
마치 어떤 속성을 정의하는 것 같죠?
4. Relationships 활용
- 연결된 데이터 가져오기
- 마찬가지로 생각보다 간단합니다.
do{
let total = Dog.fetchRequest()
total.predicate = NSPredicate(format: "owner.name == 'Chris'") // 거르기
let searchResult = try context.fetch(total)
print("크리스네 강아지는 \(searchResult.count) 마리")
}catch let error as NSError{
print(error)
}
실제로 결과는 아래처럼 보입니다.
크리스네 강아지는 2 마리
- 이 상태에서 삭제를 하시고 삭제한 그 상태를 저장하셔야 저장한 곳에서 데이터가 삭제된게 저장됩니다!!!
do{
let trash = People.fetchRequest()
trash.predicate = NSPredicate(format: "name == 'Chris'") // 거르기
let result = try context.fetch(trash)
for owner in result{
context.delete(owner) // 삭제해줘
// 이때 Cascade 라 강아지도 삭제
try context.save() // 삭제된 상태를 저장소에 저장해줘
print("삭제 성공")
}
}catch let error as NSError{
print(error)
}
**저장 안하시면 껏다켰을때 삭제가 적용 안된 모습으로 보입니다!!**
try context.save()
CoreData 내용을 두편으로 나누어 정리해보았는데
생각보다 재밌는 내용인 것 같네요.

저처럼 처음 해보신 분들에게 도움이 되었으면 좋겠습니다.
그럼 오늘도 파이팅입니다.
'iOS개발 > Swift 기본' 카테고리의 다른 글
Swift iOS 저장소(?) 알아보기 Core Data 편 (0) | 2025.06.19 |
---|---|
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 |