Daily Develop

[JPA] deleteAll() vs deleteAllInBatch()

에디개발자 2021. 7. 28. 07:00
반응형

나를 닮았다고 한다...

이번 글은 본인이 프로젝트하던 중 크게 착각하여 데이터를 깔끔하게 지워버린 경험을 토대로 작성합니다. ( 팀원분들 다 죄송합니다.... 그나마 개발 DB여서 천만 다행이었습니다. ) 절대 저와 같은 실수를 하지 않기를 바라면서 작성합니다.

 

먼저 결론부터 작성하자면 deleteAll(), deleteAllInBatch()는 되도록이면 쓰지말자.

두 메서드 모두 Repository와 매핑되어있는 테이블의 데이터를 깔끔하게 지우는 명령입니다.

 

두 메서드가 어떻게 다른지 구현 코드를 살펴보겠습니다.


deleteAll()

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

    // 생략..


    /*
     * (non-Javadoc)
     * @see org.springframework.data.repository.Repository#deleteAll()
     */
    @Transactional
    @Override
    public void deleteAll() {
        for (T element : findAll()) {
            delete(element);
        }
    }
    
}

1. 내부에서 findAll 메서드를 호출하여 전체 데이터를 조회

2. 한 건씩 delete 처리

3. 1. 2. 행위를 하나의 트랜잭션에서 처리

 


deleteAllInBatch()

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

    // 생략....
    
    public static final String DELETE_ALL_QUERY_STRING = "delete from %s x";
    
    private String getDeleteAllQueryString() {
        return getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName());
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.data.jpa.repository.JpaRepository#deleteAllInBatch()
     */
    @Transactional
    @Override
    public void deleteAllInBatch() {
        em.createQuery(getDeleteAllQueryString()).executeUpdate();
    }
}

한 방에 delete from ${table} 처리

 


실수

저는 Spring Batch Test 코드를 작성 중 deleteAllInBatch() 메서드를 처음 접했습니다. InBatch 를 보고 배치에서 데이터 갱신이 된 경우만 삭제하는 줄로 착각했습니다. ( 지금 생각해보면 말도 안되는 생각이다.. ) 저처럼 실수하는 일이 없길 바랍니다!!

 

결론

둘 다 되도록이면 사용하지 말자! 

테스트 코드에서 사용하더라도 h2 환경, test docker container, local 환경 등에서 사용하도록 하자! 하지만 이것도 다른 개발자들이 실수로 환경을 변경하여 테스트할 수 있으므로 되도록이면 사용하지 말자!

반응형