반응형
1. Bulk Update는 어떻게?
- Spring JPA에서는 변경감지(Dirty Checking)에 의해 엔티티가 변하게 되는 경우 영속성 컨텍스트에 의해 자동으로 Update문이 수행된다.
- 그런데.. 만약 30개.. 40개.. 100개 .. 벌크성 데이터를 Update해야하는 경우가 발생할 경우 어떻게 해야할까?
Spring JPA에서 제공하는 변경감지에 의존하여 벌크성 데이터를 Update 하게 되면 성능에 영향을 줄수밖에 없다. - 그렇기에 Spring JPA에서는 JPQL을 통한 Bulk Update를 지원하고 있다.
2. Spring JPA에서 Bulk Update 사용법
- 사용법은 간단하다.
@Query로 Update 쿼리를 작성후 @Modifying 어노테이션을 추가해주면 된다. - @Modifying 어노테이션은 @Query로 작성한 DML(Insert, Update, Delete) 구문을 사용할 때 사용해줘야합니다.
보통 벌크 연산(다중 Update, Insert, Delete)을 하나의 쿼리로 수행할 때 사용됩니다.
@Modifying 어노테이션 없이 사용 시에는 오류가 발생한다.org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
3. @Modifying 사용 시 주의사항
- 반환타입을 반드시 void, int, Integer로 지정을 해야한다. 그 외의 타입으로 지정 시 오류가 발생
- @Modifying을 통해 벌크 Update를 하게 되면 영속성 컨텍스트를 거치지 않고 바로 DB에 접근하여 쿼리를 수행하기 때문에 영속성 컨텍스트와 DB간의 차이가 발생하게 된다. 이를 위해 반드시 영속성 컨텍스트 매너지를 통해 flush() 처리나 clear()처리를 해줘야 한다.
- Spring JPA에서는 @Modifying 어노테이션에 이러한 처리를 할 수 있도록 속성값을 지원해주고 있는데 있다.
이 속성은 clearAutomatically 속성이다. 이 속성을 true로 설정 시에 영속성 컨텍스트를 clear하게되어 위에서 발생한 영속성 컨텍스트와 DB 데이터와의 동기화 문제를 해결할 수 있다.
반응형
'Backend > Spring' 카테고리의 다른 글
Spring JPA mappedBy? 연관관계의 주인? (0) | 2022.03.04 |
---|---|
Spring Data JPA -Cascade와 orphanRemoval? (0) | 2022.03.03 |
Spring OSIV? (0) | 2022.03.02 |
[JPA] N+1 문제 (0) | 2022.02.28 |
JPA 즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)? (0) | 2022.02.24 |