-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
삭제 쿼리 질문입니다...
22.04.18 16:12 작성 조회수 379
0
안녕하세요, 삭제가 궁금해서 글을 작성하게 되었습니다.
엔티티는 총 두 개로 n:1의 연관관계로 설정했습니다. n 부분에 해당하는 엔티티에 매 정해진 시간마다 오픈 api에서 데이터를 받고디비에 넣고 있습니다. 하지만 n에서 기존에 받은 데이터들은 새롭게 데이터 받게 되면 필요가 없어서 삭제를 해야 합니다. 그리고 n 부분을 삭제하게 될 경우, 1에 해당하는 엔티티는 삭제가 되면 안되는 상황입니다. 혹시 deleteAllBatch를 사용해도 괜찮은 지 궁금해서 질문을 남기게 되었습니다. 아니면 @Query를 사용해서 삭제를 해야한다는 글을 찾긴 찾았으나 커스텀을 어떤 식의 방향으로 하는 것이 좋을지 조언 부탁드리겠습니다.
마지막으로 항상 강의에 대해 감사한 마음으로 보고 있습니다. 좋은 강의를 만들어주셔서 정말 감사합니다.
답변을 작성해보세요.
1
y2gcoder
2022.04.19
안녕하세요. 김어진님, 공식 서포터즈 y2gcoder입니다.
두 엔티티가 n:1 관계라면 entity 설정시 부모객체에서 @OneToMany()의 옵션 중 cascade와 orphanRemoval 속성에 대해서 알아보시면 도움이 되실 것 같습니다. 해당 부분에 대해서는 영한님의 강의 중 Java ORM 표준 JPA 프로그래밍 - 기본편 중 영속성 전이(CASCADE)와 고아객체 에서 달린 질문을 공유드리겠습니다.
제가 김어진님의 프로젝트 엔티티 구조를 잘 모르지만, 해당 자식 엔티티들이 단일 소유자를 갖고 있다는 전제 하에 부모엔티티에서 자식 엔티티에 접근해 삭제할 때 부모 엔티티의 @OneToMany()에만 속성을 cascade=CascadeType.ALL, orphanRemoval=true 로 주면 혹시라도 부모 엔티티 삭제 시 자식 엔티티는 모두 삭제되고, 반대로 자식 엔티티만 삭제할 때는 부모 엔티티가 삭제되지 않을 것 같습니다.
삭제의 경우에는 주의만 하신다면 deleteAllInBatch를 쓰셔도 되고, Spring Data JPA를 사용하고 계신다면 @Modifying과 @Query를 사용해서 말씀하신 것처럼 JPQL 쿼리를 짜서 수행해주셔도 됩니다.
이 때는 두 경우 모두 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 수행하는 것이기 때문에, 서비스 로직에서 벌크 연산을 수행 후, 영속성 컨텍스트를 초기화 하는 과정을 거쳐주시기 바랍니다!
감사합니다.
0
답변 2