kok202
JPA delete

2019. 6. 12. 13:58[정리] 기능별 개념 정리/JPA

# JPA 에서 CascadeType.REMOVE 을 적어주는 것은 JPA 쪽에서 외래키를 쫓아가며 알아서 삭제해주도록 하는 옵션이다.

JPA 가 생성하는 DDL에 ON DELETE CASCADE 를 적어주거나 하는 것이 아니다.

 

# JPA 가 생성하는 DDL에 ON DELETE CASCADE 를 달아주고 싶다면 
@OnDelete(action= OnDeleteAction.CASCADE) 를 사용하면된다.

 

# 사견 : JPA 에는 CascadeType.REMOVE 가 달려있고 DDL 에는 ON DELETE CASCADE 가 달려있지 않는 경우가 관리적인 면에서 좀 더 안정적으로 보인다. DDL 에는 ON DELETE CASCADE 가 걸려있지 않으므로 DB 에 직접 접근하여 DELETE 쿼리를 사용하는 경우 의존성이 걸린 레코드 삭제가 힘들다. 따라서 운영에서 있을 실수를 줄일수 있다. 의존성이 걸린 레코드를 깔끔하게 삭제하고 싶다면 오롯이 JPA 의 delete 인터페이스에 의존해야한다. 하지만 프로그램을 재배포 하지않는 이상 프로그램을 통해 레코드를 삭제하려는 시도는 하지 못한다. 즉 이미 동작중인 서버에서 데이터를 완전히 날려버리는 대참사는 일어나기 쉽지 않다는 의미다.

 

 

 

 

 

 

# JPA 에는 CascadeType.REMOVE 가 달려있고 DDL 에는 ON DELETE CASCADE 가 달려있지 않다고 했을 때 

delete(MemberEntity memberEntity) 인터페이스

cascade 반영해줌

deleteAll(List<MemberEntity> memberEntities) 인터페이스

cascade 반영해줌

delete 쿼리가 n+1 번 발생

cascade 가 걸려있으면 cascade delete 쿼리도 n+1 번 발생

@Query("DELETE FROM MemberEntity m WHERE m IN :memberEntities")
public void deleteAll(List<MemberEntity> memberEntities);

cascade 반영 안해줌

delete 쿼리가 1 번 발생

deleteInBatch(List<MemberEntity> memberEntities) 인터페이스

cascade 반영 안해줌

delete 쿼리가 1 번 발생

 

 

 

 

 

 

1. JPA 가 자동 구현해주는 인터페이스를 사용할경우

memberRepository.deleteAll(memberEntities);

실제 쿼리 : 

delete from address where member_id = ?

delete from address where member_id = ?

delete from address where member_id = ?

delete from address where member_id = ?

delete from address where member_id = ?

delete from member where id = ?

delete from member where id = ?

delete from member where id = ?

delete from member where id = ?

delete from member where id = ?

 

 

 

2. @Query 를 사용하여 인터페이스의 쿼리를 지정할경우

@Transactional
@Query("DELETE FROM MemberEntity m WHERE m IN :memberEntities")
void deleteAll(List<MemeberEntity> memberEntities); 
memberRepository.deleteAll(memberEntities);

실제 쿼리 : delete from member where id in (? , ? , ? , ? , ?)

 

 

 

3. deleteInBatch를 사용할 경우

memberRepository.deleteInBatch(memberEntities);

실제 쿼리 : delete from member where id=? or id=? or id=? or id=? or id=?