[JPA] deleteAll() vs deleteAllInBatch()

2021. 7. 28. 07:00·Daily Develop
반응형

나를 닮았다고 한다...

이번 글은 본인이 프로젝트하던 중 크게 착각하여 데이터를 깔끔하게 지워버린 경험을 토대로 작성합니다. ( 팀원분들 다 죄송합니다.... 그나마 개발 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의 처리 정책  (1) 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
'Daily Develop' 카테고리의 다른 글
  • Intellij에서 QClass 깨끗히 청소하기
  • ThreadPoolTaskExecutor Queue가 full의 처리 정책
  • [HttpStatus] API 처리 별 HttpStatus 리턴 코드 정리
  • [코틀린] 한글 깨질 때 인코딩처리
에디개발자
에디개발자
------ 한발자국씩 성장하자 ------ Github: https://github.com/yongtaelim LinkedIn: https://www.linkedin.com/in/%EC%9A%A9%ED%83%9C-%EC%9E%84-622b69218/
    250x250
  • 에디개발자
    에디블로그
    에디개발자
    • 분류 전체보기 (245) N
      • Develop (51)
        • spring-data (28)
        • spring-batch (7)
        • devops (5)
        • java (5)
        • kotlin (3)
        • database (2)
      • MindControl (12)
      • TroubleShooting (16)
      • Study (76)
        • kotlin (16)
        • java (15)
        • spring (6)
        • test (4)
        • message-queue (10)
        • object (22)
      • Develop Tool (1)
      • Daily Develop (7)
      • Book (5)
      • AI (56) N
        • Claude (23) N
        • ChatGPT (11) N
        • Cursor (10) N
        • Gemini (8) N
        • 트랜드 (4)
      • 개발 트렌드 (17) N
        • 데일리 픽 (17) N
        • 툴 리뷰 (0)
      • 개발자 도구 (0)
        • 생산성 툴 (0)
        • 노트 & 지식관리 (0)
        • 협업 & 이슈 (0)
        • 터미널 & 환경 (0)
        • API & DB (0)
        • 에디터 & IDE (0)
  • 인기 글

  • 태그

    스터디
    Ai
    코틀린
    anthropic
    ai 코딩
    queryDSL
    OpenAI
    JPA
    claude
    claude code
    객체지향
    개발자 도구
    ai 정보
    cursor
    프로그래밍
    에디
    엘레강트
    클로드
    AI 활용
    ChatGPT
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에디개발자
[JPA] deleteAll() vs deleteAllInBatch()
상단으로

티스토리툴바