CoreData

[Core Data] Delete Rule을 이해하고 적절하게 사용해보자!

JoonSwift 2023. 1. 26. 02:10

이번 포스팅에서는 제가 Core Data를 사용하여 Relationship을 만들 때, 항상 그냥 지나쳤던 Delete Rule에 대해서 이해하고, 이를 적절히 사용하는 방법에 대해 정리하려고 합니다.

 

NSDeleteRule

우선 Delete Rule! 애플 공식 문서를 먼저 확인해보면 NSDeleteRule이라는 Enumeration으로 정의되어 있는 것을 확인할 수 있습니다.

enum NSDeleteRule : UInt, @unchecked Sendable

정의되어 있는 case들을 살펴보면

  • noActionDeleteRule
  • nullifyDeleteRule
  • cascadeDeleteRule
  • denyDeleteRule

모두 Core Data의 model editor에서 Relationship을 생성하고, 오른쪽의 Inspector에 Delete Rule을 눌러보면 확인할 수 있는 케이스들입니다.

하나하나 살펴보겠습니다.

Delete Rules

No Action

첫번째로 No Action 입니다. 이름처럼 아무 행동도 하지 않는 옵션입니다. 예를들어, A라는 객체와 B라는 객체 사이에 Relationship을 생성했다고 생각해보겠습니다.

No Action으로 설정한 상태에서 여기서 A 라는 객체가 삭제된다면

이런식으로 B는 존재하지 않는 A 객체를 가리키고 있을 것입니다. 그래서 애플 공식 문서에도, 만약 No Action인 Relationship에서 객체를 삭제한다면, 이를 참조하는 객체들을 꼭 삭제 해주거나, 반대 Relationship 객체들을 모두 Nullify로 설정하라고 적혀있습니다!

Nullify

다음은 Nullify 입니다. Nullify가 default 이고, 제가 Delete rule을 모를 때 기본으로 놓고 사용했었던 옵션입니다.

아까의 이 Relationship에서 A라는 객체가 삭제되면, A라는 객체를 참조하고 있던 객체들은 이제 모두 참조하고 있던 A가 사라지게 되는것입니다.

그림으로 나타낸다면.. A는 사라지고 B만 덩그러니 남은 그림이 될 수 있을 것 같습니다. 

Cascade

다음은 Cascade입니다. 이 옵션은 Relationship의 타겟이 To One 일 때 정말 유용하게 사용될 수 있습니다. 예를들어, one-to-many Relationship이 있다고 가정해보겠습니다.

원래 one-to-many의 그림은 위와 같지 않겠지만, 이해하기 쉽게 이렇게 그려보았습니다. 만약 여기서 one에 해당하는 A객체를 삭제하면, Delete rule이 Cascade일 때, 

이렇게 A 객체를 참조하고 있던 B 객체들을 모두 제거할 수 있습니다. 만약 Nullify 옵션을 사용했다면, A가 제거되었을 때, 제거 된 A를 가리키고 있는 B가 남아있게 됩니다. 그러므로 이렇게 one-to-many와 같은 Relationship에서 유용하게 사용할 수 있는 옵션입니다!

Deny

마지막으로 Deny 입니다. Deny는 실수를 방지하기 위한 Rule입니다. 만약에 지우려고 하는 Relationship의 객체를 다른 객체가 Relationship으로 참조하고 있다면, 이를 지울 수 없게 하는 Rule입니다.

만약 A와 B라는 객체의 Relationship, B와 C의 Relationship이 있다면, A와 B에서 B를 삭제하려고 하면, B와 C사이의 Relationship에서 C라는 객체가 아직 B를 참조하고 있기 때문에, 지우는것이 불가능해져, 실수로 삭제하는 것을 방지해줍니다.

 

정리

이번 포스팅을 통해서 Delete rule 4가지에 대해서 살펴보았습니다. 디폴트인 Nullify가 어떤 의미인지도 살펴보았고, Cascade와 같이 유용한 Delete rule에 대해서도 이해하고, 다음부터 사용하면서, Core Data 숙련도를 조금 높이는 계기가 되는 포스팅이었습니다. ㅎㅎ