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

김어진님의 프로필 이미지
김어진

작성한 질문수

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

삭제 쿼리 질문입니다...

해결된 질문

작성

·

444

0

안녕하세요, 삭제가 궁금해서 글을 작성하게 되었습니다.

엔티티는 총 두 개로 n:1의 연관관계로 설정했습니다. n 부분에 해당하는 엔티티에 매 정해진 시간마다 오픈 api에서 데이터를 받고디비에 넣고 있습니다. 하지만 n에서 기존에 받은 데이터들은 새롭게 데이터 받게 되면 필요가 없어서 삭제를 해야 합니다. 그리고 n 부분을 삭제하게 될 경우, 1에 해당하는 엔티티는 삭제가 되면 안되는 상황입니다. 혹시 deleteAllBatch를 사용해도 괜찮은 지 궁금해서 질문을 남기게 되었습니다. 아니면 @Query를 사용해서 삭제를 해야한다는 글을 찾긴 찾았으나 커스텀을 어떤 식의 방향으로 하는 것이 좋을지 조언 부탁드리겠습니다. 

마지막으로 항상 강의에 대해 감사한 마음으로 보고 있습니다. 좋은 강의를 만들어주셔서 정말 감사합니다.

답변 2

1

안녕하세요. 김어진님, 공식 서포터즈 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

김어진님의 프로필 이미지
김어진
질문자

답변해주셔서 정말 감사합니다.!!!!!!!!

김어진님의 프로필 이미지
김어진

작성한 질문수

질문하기