강의

멘토링

커뮤니티

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

jh님의 프로필 이미지
jh

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티 클래스 개발1

일대 다 & 다대일 관계 삭제 시

해결된 질문

작성

·

858

1

안녕하세요! 더운 여름인데 건강은 잘 챙기고 계신지요? 항상 고생 많으십니다!

예제의 Order - OrderItem - Item 관계에서 삭제 시에 궁금한 점이 있어서 고민하다가 남겨봅니다..!

현재 Order에서 OrderItem을 @OneToMany(cascadeType.ALL)로 가지고 있어, Order save & 삭제시에는 OrderItem이 cascade 되어 저장, 삭제가 되고 있습니다.

하지만 Item에는 OrderItem -> Item간 단방향 mapping만 걸려있습니다. 만약 Item이 삭제될 경우에는 FK 제약조건으로 예외가 발생하게 됩니다. 

이를 위한 해결방안으로 아래 3가지를 고려해보았습니다.

  1. Item에도 OrderItem Collection을 두고, Cascade 또는 Orphanremoval을 통해 연관된 OrderItem을 삭제한다.
    -> 삭제 시에만 사용되므로 비효율적으로 생각됨.
  2. Item을 soft delete로 관리한다.
  3. OrderItem(repository)을 대상으로 삭제하려는 Item을 FK로 가진 내용을 모두 삭제한 후 마지막으로 Item을 제거한다.

 

여러 질문에서 남겨주신 Cascade 관련 답변을 읽어보았고, 해당 엔티티를 한쪽에서 life cycle을 확실히 관리할 경우에만 사용하라고 이해를 했습니다. 하지만 위의 1처럼 양쪽에서 관리를 할 경우에도 개발자가 확실하게 life cycle을 이해한다면 문제가 없을 것으로 보이는데, 잘못 생각하고 있는걸까요?

중간 테이블에 대한 추가 / 제거를 고려하기가 쉽지 않네요..! 고려한 방법에서 발생할 수 있는 문제가 어떤건지, 더 좋은 방법이 있는지 질문드립니다!

 

답변 1

2

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

안녕하세요. jh님

3가지 모두 고려 대상이 됩니다.

그런데 cascade는 강의에서 설명드린 것 처럼 개인 소유일 때만 사용해야 하는데, OrderItem은 Order와 강하게 묶여 있으므로 사용하면 위험합니다.

2,3 중에 하나를 고민하시는 것이 좋아보입니다.

또는 해당 부분의 외래키 제약조건을 걸리 않는 것도 방법입니다.

감사합니다.

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

답변 감사드립니다!!

jh님의 프로필 이미지
jh

작성한 질문수

질문하기