벌크 연산
일괄 처리를 위해 대량의 데이터를 처리하는 작업입니다. 데이터베이스에서 UPDATE 또는 DELETE 쿼리를 사용하여 한 번에 여러 행을 변경하는 것이 일반적인 입니다.
JPA에서 벌크 연산은 대량의 데이터를 변경하기 위한 메커니즘을 제공합니다. 일반적으로 영속성 컨텍스트를 통해 개별 엔티티의 변경을 추적하고, 트랜잭션을 커밋할 때 변경 사항을 데이터베이스에 반영합니다. 그러나 벌크 연산은 단일 엔티티의 변경을 추적하고, 트랜잭션을 커밋할 때 변경사항을 데이터베이스에 반영합니다. 그러나 벌크 연산은 단일 엔티티의 변경이 아닌 여러 엔티티에 대한 변경을 수행할 때 사용합니다. 이러한 변경은 일반적으로 JPA의 더티 채킹 메커니즘이나 트랜잭션 커밋 시점에만 적용되는 것이 아니라, 데이터 베이스에 대량의 변경을 직접 적용한 것입니다.
예를 들어 한 기업의 직원들의 연봉을 10% 연상한다 할 때 한 번에 업데이트해야 한다면, 또는 삭제해야 한다면 벌크 연산으로 처리 가능합니다. 이는 데이터 베이스가 제공하는 성능 향상 기능을 활용하여 작업을 빠르고 효율적으로 처리할 수 있습니다.
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();
}
@Modifying
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
JPA에서 사용되는 애노테이션이며, 데이터베이스에 변경을 가하는 쿼리인 INSERT, UPDATE, DELETE를 실행할 때 사용합니다.
주로 @Query 어노테이션과 함께 사용되며, 해당 쿼리가 데이터베이스의 상태를 변경한다는 것을 명시적으로 나타냅니다. JPA에서는 영속성 컨텍스트를 통해 엔티티의 변경을 추적하고, 트랜잭션을 커밋할 때 이 변경 사항을 데이터베이스에 반영합니다. 그러나 일부 상황에서는 변경된 엔티티를 감지하여 데이터베이스에 반영하는 것이 비효율적일 수 있습니다.
예를 들어 , 벌크 연산을 실행할 때는 영속성 컨텍스트가 변경 감지를 수행하지 않아도 되므로 이러한 메커니즘을 생략할 수 있습니다. 또한 @Modifying을 사용하면 JPA에서 변경 감지와 관련된 처리를 생략하고 더 효율적인 쿼리 실행이 가능합니다.
@Modifying(clearAutomatically = true)
(이 옵션의 기본값은 `false` )
@Modifying(clearAutomatically = true)
벌크성 쿼리를 실행한 후에 영속성 컨텍스트를 자동으로 초기화하는 옵션입니다. 이 옵션을 설정하면 벌크 연산 실행 후 영속성 컨텍스트가 변경된 상태를 인식하고 업데이트된 정보를 반영하여 일관성을 유지합니다.
'Spring(Boot & FrameWork)' 카테고리의 다른 글
Entity LifeCycle (0) | 2024.10.25 |
---|---|
OSIV (0) | 2024.04.10 |
@Not Empty (0) | 2024.04.01 |