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

궁금이님의 프로필 이미지

작성한 질문수

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

실전 예제 5 - 연관관계 관리

Order의 orderItems에 orphanRemoval 주지 않는 이유가 따로 있으신 가요?

해결된 질문

작성

·

288

1

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

[질문 내용]

여기 보면, 주문과 주문 상품은 완전히 종속적일 것 같은 느낌이고,

cascade도 ALL이라서 완전히 부모에서 관리할 것 같은 느낌이라..

예제에서 보통 실무에서 쓸만한거 거진 예시로써 사용해 왔는데, orphanRemoval는 사용하지 않았던 이유가 궁금합니다.

딱히 이유는 없고 충분히 고려할 수도 있는 내용인지, 아니면 뭐 orphanRemoval는 실무에서 잘 안쓴다던지 궁금합니다.

아니면 보통 인터넷 쇼핑 이용할 때 주문상품 중 하나를 빼고 싶을 때 뺄 수 있는게 아니라 주문 자체를 다시 해야 하는 경우가 많아서 그런 비즈니스 적인 이유 때문에 그런건가요?

그럴 경우는 오히려 고아객체라고 삭제하면 위험해질 수 있으니..?

답변 2

1

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

안녕하세요. 궁금이님

이 부분은 본인의 비즈니스에 상황에 따라 선택을 하면 됩니다.

이 경우에는 orphanRemoval을 적용하셔도 괜찮습니다 :)

예제의 경우 예제를 설계할 때 학습 상황에 맞추어 이야기하기 때문에 예제가 정답이라고는 생각하시지 않으셔도 됩니다^^

감사합니다.

 

 

0

안녕하세요 궁금이 님, 인프런 AI 인턴이에요.

[질문 내용]에 대한 답변을 드리겠습니다. orphanRemoval 속성은 JPA에서 부모-자식 관계에서 자식 엔티티가 부모와 분리될 때 해당 자식 엔티티를 자동으로 삭제하는 기능입니다. orphanRemoval을 사용하지 않는 이유는 다양합니다.

첫째로, cascade 속성이 ALL로 설정되어 있다면, 부모 엔티티를 삭제하면 자식 엔티티도 자동으로 삭제됩니다. 따라서 orphanRemoval을 명시적으로 사용하지 않아도 자식 엔티티는 부모의 생명주기에 종속되어 삭제될 수 있습니다.

둘째로, orphanRemoval을 사용하지 않는 이유는 비즈니스 규칙에 따라 자식 엔티티를 삭제할 때 특별한 로직이 필요한 경우입니다. 예를 들어, 인터넷 쇼핑에서 주문을 삭제할 때 주문 상품 중 하나를 제외하고 싶으면 해당 주문 상품을 다시 추가해야 할 수 있습니다. 이러한 경우에 orphanRemoval을 사용하지 않는 것이 더 유연하고 적합할 수 있습니다.

세번째로, orphanRemoval을 사용하면 실수로 필요한 자식 엔티티를 삭제하는 위험이 있습니다. 만약 고아 객체(부모를 참조하지 않는 자식 엔티티)를 삭제하면 실제로 데이터베이스에서도 해당 자식 엔티티가 삭제되기 때문입니다. 따라서 고아 객체를 신중하게 다루어야 하며, 정확한 비즈니스 규칙에 맞추어 사용해야 합니다.

이러한 이유들 때문에 orphanRemoval을 사용하지 않을 수도 있습니다. 하지만, 실제 각 프로젝트와 비즈니스 요구사항에 따라 다르므로, 해당 프로젝트에 맞는 관리 방식을 선택하는 것이 중요합니다. 고맙습니다!