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

문 현필님의 프로필 이미지
문 현필

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 전이(CASCADE)와 고아 객체

cascade 부모, 자식 동시 적용

작성

·

540

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요,

cascade 설정과정에서 궁굼증이 생겨 문의드립니다.

부모 객체와 자식객체 양쪽다 CascadeType.ALL 옵션을 주고, 부모쪽에 orphanRemoval = true 옵션을 준 상태에서

Parent parent = new Parent();
Child child = new Child();
Child child2 = new Child();
parent.addChild(child);
parent.addChild(child2);

Team findParent = em.find(Parent.class, 1L);
findParent.getChild().remove(0);

와 같이 진행 했을때,

  1. child가 삭제됨

  2. child가 삭제되며 cascade 옵션에 의해 부모인 team을 삭제함

  3. team을 삭제하기 전 cascade 옵션에 의해 자식에 포함된 child를 모두 삭제함

  4. team이 삭제됨

이렇게 이해했고 실제로 parent, child, child2 모두 삭제 되었습니다. 그런데

Parent parent = new Parent();
Child child = new Child();
Child child2 = new Child();
Child child3 = new Child();
...
Child childN = new Child();

parent.addChild(child);
parent.addChild(child2);
parent.addChild(child3);
...
parent.addChild(childN);

Team findParent = em.find(Parent.class, 1L);
findParent.getChild().remove(0);

이렇게 자식을 3개 이상 넣어줬을경우 자식객체 2개만 삭제(remove에 넣어주는 index에 따라 2개 삭제될 자식이 결정됨)되고 나머지 자식과 부모는 남아있는걸로 확인되는데... 어떤 매커니즘때문에 이런 현상이 나오는걸까요?..

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 현필님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

감사합니다.


문 현필님의 프로필 이미지
문 현필
질문자

안녕하세요!

프로젝트 공유드립니다!

https://drive.google.com/file/d/1f5ErU44DOLbuq43tJosTANIAaIw9mFBt/view

JpaMain 실행하면 되구,

예상으로는 Parent와 Child 모두가 삭제될 거라고 생각되는데,

Child 2개만 삭제되는 현상이 있어서 어떤 매커니즘에 의한 것인지가 궁굼합니다!

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 현필님

JPA에서 cascade는 강의에서 설명드린 것 처럼 개인 소유일 때만 사용하는 것이 좋습니다.

특히 이렇게 양방향으로 설명하면 예상하지 못하는 문제가 발생할 수 있습니다.

코드는 저도 실행을 해보았는데요. 왜 2개일 때는 성공하고 3개 이상일 때는 문제가 되는지는 저도 정확히 잘 모르겠습니다.

감사합니다.

문 현필님의 프로필 이미지
문 현필
질문자

답변 감사합니다!

양방향은 정말 꼭 필요할 때 사용하고 검증도 많이 필요하겠네요

0

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

cascade 설정과 관련된 질문에 대해 답변드리겠습니다.

정확한 cascade 동작을 이해하기 위해서는 JPA(Java Persistence API)의 cascade 설정과 관련된 개념을 이해해야 합니다.

cascade는 부모 엔티티의 특정 동작(예를 들어, 삭제)을 자식 엔티티에도 전파하는 기능입니다.

첫 번째 예시에서 parent 객체에 대해 CascadeType.ALL 옵션을 설정하고, orphanRemoval=true 옵션을 준 상태이고, parent에 child와 child2를 추가한 후, parent를 찾아서 child를 삭제하였을 때, cascade 옵션에 의해 child도 함께 삭제되는 동작을 확인하셨습니다.

두 번째 예시에서도 마찬가지로 parent 객체에 child, child2, … , childN까지 여러 개의 자식을 추가한 후, parent를 찾아서 child를 삭제하는 경우, cascade 옵션에 의해서 child도 함께 삭제되는 동작을 예상하실 수 있습니다.

이러한 cascade 옵션은 부모-자식 관계에서 일괄적인 동작을 수행할 때 유용하게 사용될 수 있습니다.

더 자세한 내용은 JPA 관련 문서나 강의를 참고하시면 도움이 되실 것입니다.

해당 내용으로 답변이 되었는지 확인 부탁드리며, 추가로 궁금한 사항이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!

문 현필님의 프로필 이미지
문 현필
질문자

답변 감사합니다!

근데 그럼 두번째 예시에서도 parent 하위의 child 모두가 삭제되고 parent도 삭제가 되야하는게 아닌가요?.. 실제 코드를 돌려보면 2개의 child객체만 삭제되는데 어떠한 이유때문일까요?ㅠㅠ

문 현필님의 프로필 이미지
문 현필

작성한 질문수

질문하기