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") |
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=?
'[정리] 기능별 개념 정리 > JPA' 카테고리의 다른 글
@EntityGraph : FetchType.EAGER 일 경우 Select 쿼리 줄이기 (1) | 2019.06.15 |
---|---|
JPA fetch 맵핑별 기본값 (0) | 2019.06.14 |
Differences between @Entity(name) and @Table(name) (0) | 2019.05.20 |
영속성 컨텍스트 정리 (0) | 2019.05.20 |
Orphan removal vs Cascade.remove (0) | 2019.05.16 |