티스토리 뷰

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 찾으셨나요?

* Relationships

-https://developer.apple.com/documentation/coredata/configuring-relationships

- 엔터티 간의 관계와 엔터티 간에 변경 사항이 전파되는 방식을 지정합니다. (번역)

- 저희가 정의한 데이터끼리 관계를 만들어 서로 영향을 줄 수 있다고 생각하시면 될 것 같습니다.

 

저는 강아지와 강아지 주인 데이터를 서로 연결해보는 걸로 만들어 보겠습니다. 

 

1. 연결해줄 데이터 만들기 

- 저번이랑 동일하게 'Add Entity' 눌러서 하나 더 만들어줄께요.

- 저는 예시로 강아지 주인을 하나 만들께요. (설정 조심하세요.)

간단하게만 설정해볼께요

2. Relationships 연결하기 

- 이제 두개의 데이터를 서로 연결할께요. 

- 저는 서로 찾을 수 있게 서로의 관계를 다른 이름으로 정의할께요.

People 에서 정의
Dog에서 정의

- 아마 처음에는 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 내용을 두편으로 나누어 정리해보았는데

생각보다 재밌는 내용인 것 같네요. 

저처럼 처음 해보신 분들에게 도움이 되었으면 좋겠습니다. 

 

그럼 오늘도 파이팅입니다.

댓글