반응형
이번 글은 본인이 프로젝트하던 중 크게 착각하여 데이터를 깔끔하게 지워버린 경험을 토대로 작성합니다. ( 팀원분들 다 죄송합니다.... 그나마 개발 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 환경 등에서 사용하도록 하자! 하지만 이것도 다른 개발자들이 실수로 환경을 변경하여 테스트할 수 있으므로 되도록이면 사용하지 말자!
반응형
'Daily Develop' 카테고리의 다른 글
Intellij에서 QClass 깨끗히 청소하기 (2) | 2022.01.11 |
---|---|
ThreadPoolTaskExecutor Queue가 full의 처리 정책 (0) | 2021.12.21 |
[HttpStatus] API 처리 별 HttpStatus 리턴 코드 정리 (0) | 2021.07.13 |
[코틀린] 한글 깨질 때 인코딩처리 (0) | 2021.07.02 |
[Post] application/x-www-form-urlencoded 데이터 받는 방법, inputStream 주의 (3) | 2021.06.18 |