인프런 커뮤니티 질문&답변
일대 다 & 다대일 관계 삭제 시
해결된 질문
작성
·
858
1
안녕하세요! 더운 여름인데 건강은 잘 챙기고 계신지요? 항상 고생 많으십니다!
예제의 Order - OrderItem - Item 관계에서 삭제 시에 궁금한 점이 있어서 고민하다가 남겨봅니다..!
현재 Order에서 OrderItem을 @OneToMany(cascadeType.ALL)로 가지고 있어, Order save & 삭제시에는 OrderItem이 cascade 되어 저장, 삭제가 되고 있습니다.
하지만 Item에는 OrderItem -> Item간 단방향 mapping만 걸려있습니다. 만약 Item이 삭제될 경우에는 FK 제약조건으로 예외가 발생하게 됩니다.
이를 위한 해결방안으로 아래 3가지를 고려해보았습니다.
- Item에도 OrderItem Collection을 두고, Cascade 또는 Orphanremoval을 통해 연관된 OrderItem을 삭제한다.
-> 삭제 시에만 사용되므로 비효율적으로 생각됨. - Item을 soft delete로 관리한다.
- OrderItem(repository)을 대상으로 삭제하려는 Item을 FK로 가진 내용을 모두 삭제한 후 마지막으로 Item을 제거한다.
여러 질문에서 남겨주신 Cascade 관련 답변을 읽어보았고, 해당 엔티티를 한쪽에서 life cycle을 확실히 관리할 경우에만 사용하라고 이해를 했습니다. 하지만 위의 1처럼 양쪽에서 관리를 할 경우에도 개발자가 확실하게 life cycle을 이해한다면 문제가 없을 것으로 보이는데, 잘못 생각하고 있는걸까요?
중간 테이블에 대한 추가 / 제거를 고려하기가 쉽지 않네요..! 고려한 방법에서 발생할 수 있는 문제가 어떤건지, 더 좋은 방법이 있는지 질문드립니다!
답변 1
2
안녕하세요. jh님
3가지 모두 고려 대상이 됩니다.
그런데 cascade는 강의에서 설명드린 것 처럼 개인 소유일 때만 사용해야 하는데, OrderItem은 Order와 강하게 묶여 있으므로 사용하면 위험합니다.
2,3 중에 하나를 고민하시는 것이 좋아보입니다.
또는 해당 부분의 외래키 제약조건을 걸리 않는 것도 방법입니다.
감사합니다.






답변 감사드립니다!!