deleteAll()보다 deleteAllInBatch()가 더 권장되는 이유가 뭐야?
2024. 1. 15. 10:43ㆍspring/TDD
deleteAll vs deleteAllInBatch
- deleteAll() : SimpleJpaRepository()에 오버라이딩되어 있으며, MyBatis, JdbcTemplate 등 기술에 상관없이 사용가능하다. 또, deleteAll()이 실행되면, findAll()의 결과로 얻은 리스트를 순회하며, 데이터를 한개씩 삭제함. 즉, N개의 데이터가 존재하면 N개릐 DELETE쿼리가 실행된다. -> 테스트 실행시간이 오래 걸림.
- deleteAllInBatch() : 테이블에 있는 데이터를 전부 지우는 DELETE쿼리가 실행된다. 즉, 데이터 크기와 관계없이 한번의 쿼리로 clear가 가능함.
package org.springframework.data.jpa.repository.support;
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
/*
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#findAll()
*/
@Override
public List<T> findAll() {
return getQuery(null, Sort.unsorted()).getResultList();
}
...
/*
* (non-Javadoc)
* @see org.springframework.data.repository.Repository#deleteAll()
*/
@Override
@Transactional
public void deleteAll() {
for (T element : findAll()) {
delete(element);
}
}
...
}
package org.springframework.data.jpa.repository.support;
import static org.springframework.data.jpa.repository.query.QueryUtils.*;
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
private String getDeleteAllQueryString() {
return getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName());
}
...
/*
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#deleteAllInBatch()
*/
@Override
@Transactional
public void deleteAllInBatch() {
em.createQuery(getDeleteAllQueryString()).executeUpdate();
}
...
}
package org.springframework.data.jpa.repository.query;
public abstract class QueryUtils {
...
public static final String DELETE_ALL_QUERY_STRING = "delete from %s x";
...
}
'spring > TDD' 카테고리의 다른 글
MockMvc, @Transactional(readOnly = true)와 @Transactional을 분리하라고? (0) | 2024.01.23 |
---|---|
What's BDD? (0) | 2024.01.12 |
어떤 상황이 주어질때의 테스트코드는 어떻게 작성하는게 좋을까? (0) | 2024.01.12 |