인프런 커뮤니티 질문&답변

squirrel PARK님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Relation Options

cascade 자식이 부모삭제가 맞는건가요??

24.10.07 19:16 작성

·

49

·

수정됨

0

안녕하세요.

 

지금 typeORM에서 cascade를 보고있는데

fk를 삭제하면 pk가 삭제하는게 일반적인 동작인지가 궁금합니다.

 

User 엔티티에서 onDelete : "cascade"로 설정해두었고

삭제는 부모에서 > 자식으로 연결되는 것으로 알고 있습니다.

 

근데 ProfileModel의 레코드가 삭제되도 Join한 레코드도 삭제되는데

자식 > 부모로 삭제가 전파되는게 맞는건지 혼란이옵니다.

강의에서도 profile을삭제하니 User레코드가 날아가버리는데 이 현상이 이해 되질않습니다.

 

부모>자식 cascade를 인한 연쇄 삭제 or update

자삭>부모 cascade를 인한 삭제 불가

 

이게 기존 제 개념인데 제가 잘못알고있던건가 찾아보아도 정보가 좀 엉켜있네요..

 

typeORM만의 기능인지 SET NULL로 방지해야 하는건지 궁금합니다.

답변 2

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

2024. 10. 08. 13:31

안녕하세요!

onDelete 파라미터는 기본적으로 postgresql 레벨에서 작동하는 기능입니다!

typeorm에서 "다른지" 질문을 주셨는데 typeorm에서 주관하는게 아니라 결국 postgresql로 constraint를 전파시키는 역할을 한다고 생각하시면 됩니다!

일단 결론부터 말씀드리면 이해하고 계신게 맞습니다.

OneToOne 관계는 @JoinTable의 위치에 따라 어떤 테이블에서 Foreign Key를 레퍼런스 하고 있을지 결정하게 되는데 예제에서는 User 모델에서 @JoinTable 애노테이션을 적용중입니다.

즉 테이블 구조로 보면 User가 Profile의 ID를 들고 있습니다.

결국 User를 Profile의 자식으로 보는게 맞습니다.

반대의 작동을 원한다면 Profile에 @JoinTable 적용을 하시면 됩니다! 다만 이렇게 할 경우 User 테이블에 Row를 생성할때 Profile 생성을 동시에 필수로 하도록 강제하는게 번거롭습니다.

감사합니다!

squirrel PARK님의 프로필 이미지
squirrel PARK
질문자

2024. 10. 08. 18:15

아...감사합니다 @joinColumn 을 반대로 적용하고 고민하고있었네요... 조인컬럼을 생성하는쪽이 자식이다라고 생각했으면되는데 🥲🥲 감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 07. 19:21

안녕하세요, 인프런 AI 인턴입니다. squirrel PARK님.

TypeORM에서 cascade 옵션은 부모-자식 관계의 데이터 삭제 시 사용되는 중요한 기능입니다. 기본적으로 cascade 옵션은 부모 엔티티의 삭제가 이루어질 때 관련된 자식 엔티티들을 자동으로 삭제하는 역할을 하며, 이는 데이터의 무결성을 보장하기 위한 일반적인 작동 방식입니다. 즉, 부모(Primary Key) 엔티티가 삭제될 때 연관된 자식(Foreign Key) 엔티티들이 삭제되는 것이 기본적인 동작입니다.

하지만 질문에서 언급하신 것처럼 자식이 부모의 레코드를 삭제하는 동작은 비정상적인 것으로 보입니다. 문제가 발생한다면 확인해 볼 몇 가지 사항이 있습니다:

  1. Relationship 설정: 엔티티 간의 관계에서 cascade 옵션이 잘못 설정되어 있는지 확인하세요. 잘못된 설정이 부모와 자식 간의 관계를 뒤바꾸어 동작이 비정상적으로 진행될 수 있습니다.

  2. 데이터 흐름 확인: 실제 데이터베이스 트랜잭션에서 불필요하게 자식 엔티티가 부모 엔티티의 키를 참조하고 있을 가능성이 있는지 확인해 보세요.

  3. OnDelete 설정 다시 보기: onDelete: 'CASCADE'의 위치와 설정을 다시 점검하세요. 부모 엔티티의 특정 상황에서만 작동하도록 제한할 수 있습니다.

비슷한 내용을 다루고 있는 기존의 답변들을 확인하시면 도움이 될 것 같습니다:

관계형 연결되어있는 DB 모델 삭제 시 에러 처리

모든 Route 기본 Private로 만들고 IsPublic Annotation 작업하기 강의부분 질문드립니다

각 링크에서 열거된 사례들을 참고하시어 cascade 옵션의 올바른 사용 방법과 해결책을 검토해 보시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.