✅ @Modifying
영속성 컨텍스트를 무시하고 바로 db에 반영한다. 따라서 엔티티의 상태와 db에서의 엔티티 상태가 달라질 수 있다.
따라서 벌크성 쿼리를 실행한 이후 영속성 컨텍스트를 초기화해줘야 한다.@Modifying(clearAutomatically = true)
public interface MemberRepository extends JpaRepository<Member, Long> {
// 벌크성 수정 쿼리
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
}
@SpringBootTest
@Transactional
@Rollback(false) // 롤백하지 않고 커밋하여 db에 반영 (test코드-현업 에서는 사용하면 안되지만 공부하는 단계에서만 사용)
class MemberRepositoryTest {
@Test
public void bulkUpdate() throws Exception {
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 19));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 21));
memberRepository.save(new Member("member5", 40));
//when
int resultCount = memberRepository.bulkAgePlus(20);
//then
assertThat(resultCount).isEqualTo(3);
}