정리
- JPA의 메소드
deleteBy
는 삭제되는 엔티티 개수만큼의DELETE
문으로 실행횐다- 이는 성능 저하의 원인이 될 수 있다
SELECT
로 조건에 맞는 엔티티를 조회하고, id 조건으로 하나씩 삭제한다
해결법
@Query
로 직접 JPQL 쿼리를 생성한다- 지금 프로젝트에서는 더 편하게 QueryDsl custom repository를 사용했다
@Repository
@RequiredArgsConstructor
public class HabitAlertRepositoryCustomImpl implements HabitAlertRepositoryCustom {
private final JPAQueryFactory queryFactory;
@Override
public void deleteByRunHabitId(Integer runHabitId) {
QHabitAlert habitAlert = QHabitAlert.habitAlert;
queryFactory.delete(habitAlert)
.where(habitAlert.runHabit.runHabitId.eq(runHabitId))
.execute();
}
}
deleteInBatch
를 사용해서 해결할 수 있다고는 하나, 직접 테스트했을 때는 원하는 대로 동작하지 않아서 확실하지 않음CASCADE
조건 때문일 수도 있다
출처
https://jojoldu.tistory.com/235
JPA에서 대량의 데이터를 삭제할때 주의해야할 점
안녕하세요? 이번 시간엔 JPA에서 대량의 데이터를 삭제할때 주의해야할 점을 샘플예제로 소개드리려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (
jojoldu.tistory.com
'Spring Framework' 카테고리의 다른 글
[Spring] Spring Web이 Request Parameter를 바인딩하는 과정, 내부 구현 분석하기 - 생성자, getter, setter (0) | 2024.08.19 |
---|---|
[Spring][스크랩] Request Param의 타입으로 enum을 지정하는 법 (0) | 2024.08.18 |
[MapStruct] 필드 매핑할 때 다른 Mapper 클래스의 메소드 사용하는 법 - uses, @Named (0) | 2024.08.07 |
[Spring][스크랩] nested transaction의 동작 방식 (0) | 2024.08.02 |
[Spring] FK(id)만 이용해서 관계 있는 엔티티를 생성하는 법 - 프록시 객체 (0) | 2024.07.12 |