반응형
deleteAll을 했는데 delete가 N개 발생
JUNIT Test 진행 시, 깔끔하게 테스트하기 위해 deleteAll을 했는데 다음과 같이 deleteById가 N개가 발생하는 문제가 발생했습니다.
결과는 모두 삭제되어 결과는 동일했지만 모두 삭제되는데 엄청나게 많은 시간이 걸렸습니다.
@BeforeEach
public void setup() {
this.mvc = MockMvcBuilders.webAppContextSetup(ctx)
.addFilters(new CharacterEncodingFilter("UTF-8", true)) // 필터 추가
.alwaysDo(print())
.build();
// 데이터 초기화. 절대 Transactional을 해제하면 안됨.
userGroupMemberRepository.deleteAll();
userGroupRepository.deleteAll();
}
deleteAll을 했는데 delete가 N개 발생하는 이유
public interface UserGroupMemberRepository
extends JpaRepository<UserGroupMember, UserGroupMemberPK> {
JpaRepository를 따라가다 보면 SimpleJpaRepository를 찾을 수 있습니다. 이 클래스를 확인해 보면 delete를 for문을 돌면서 호출하는 것을 확인할 수 있습니다.
@Override
@Transactional
public void deleteAll() {
for (T element : findAll()) {
delete(element);
}
}
해결 방법
다음과 같이 Repository를 수정합니다.
public interface UserGroupMemberRepository
extends JpaRepository<UserGroupMember, UserGroupMemberPK>
{
@Modifying
@Query("delete from UserGroupMember r where r in :members")
void deleteAllInBatch(Iterable<UserGroupMember> members);
}
다음과 같이 호출 부분을 수정합니다.
//userGroupMemberRepository.deleteAll();
List<UserGroupMember> all = userGroupMemberRepository.findAll();
userGroupMemberRepository.deleteAllInBatch(all);
이를 실행하면 다음과 같이 in 절을 사용하여 한 번에 빠르게 삭제됩니다.
주의 사항
Database에 따라서 in절에 사용할 수 있는 key의 수가 정해져 있습니다.
따라서 너무 많은 데이터를 한번에 지우려고 할 경우 에러가 발생할 수 있습니다.
728x90
반응형
'back end > java' 카테고리의 다른 글
Spring Boot JPA에서 SQL 로그 출력하기 (0) | 2023.11.05 |
---|---|
apache poi - IOException: 지정된 경로를 찾을 수 없습니다 (1) | 2023.10.04 |
Java Optional에 대한 설명과 예제 코드 (0) | 2023.07.09 |
HttpClient5에서 SSL(인증서) 무시하는 방법 (0) | 2023.06.27 |
[Gradle] dependency 가 포함된 jar 만드는 방법 (0) | 2023.06.27 |