[JPA] 벌크성 수정 쿼리와 주의사항

EB·2024년 1월 19일
post-thumbnail

벌크성 수정 쿼리

벌크성 수정 쿼리란, 모든 데이터에 일괄적으로 업데이트를 해야하는 경우에 사용한다.
ex) 모든 직원 연봉 10% 인상

📌 순수 JPA 쿼리

 public int bulkAgePlus(int age) {
        return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age")
                .setParameter("age",age)
                .executeUpdate();
    }

📌Spring Data JPA 쿼리

    @Modifying
    @Query(value = "update Member m set m.age = m.age + 1 where m.age >= :age")
    int bulkAgePlus(@Param("age") int age);

@Modifying은 순수 JPA에서 executeUpdate와 같은 기능으로, 무조건 추가해야한다.

👩‍💻 벌크성 수정쿼리 주의점

Spring Data JPA를 통한 벌크성 수정 쿼리를 작성 후 테스트 코드를 작성했다.
만약에 member5를 조회하면 member5의 나이는 40일까? 41일까?

정답은 40으로 조회된다!

JPA는 데이터가 변경 된 경우 자동으로 업데이트 해주는 기능이 있는데, 벌크성 수정 쿼리를 사용하면 영속성컨텍스트를 무시하고 바로 DB에 업데이트 하게 된다.

🧐 해결 방법업로드중..

em.flush : 남아있는 변경되지 않은 내용이 DB에 변경되게 해준다.
em.clear : 영속성 컨텍스트에 있는 데이터를 모두 날리고 새로 DB에서 조회해온다.

📌Spring Data JPA 초기화 옵션

Spring Data JPA에서는 em.flush 대신 사용하는 옵션이 존재한다.
@Modifying(clearAutomatically = true) 를 선언

    @Modifying(clearAutomatically = true)
    @Query(value = "update Member m set m.age = m.age + 1 where m.age >= :age")
    int bulkAgePlus(@Param("age") int age);

벌크 연산 이후에는 무조건 영속성 컨텍스트를 날려야한다

profile
👩‍💻✨junior developer

0개의 댓글