@DynamicUpdate
정의
@DynamicUpdate는 Hibernate에서 엔티티 변경 시 변경된 필드만 UPDATE 하도록 만드는 애너테이션이다.
JPA에서 엔티티가 수정될 때 기본적으로는 전체 필드를 갱신할 수 있는데, @DynamicUpdate를 사용하면 실제로 변경된 컬럼만 SQL에 포함된다.
🧩 Artifact
@DynamicUpdate는 Hibernate 기반 JPA 환경에서 동작한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.hibernate:hibernate-core:5.6.9.Final'
}
🛠 역할
- 변경된 필드만 UPDATE 하도록 최적화한다.
- 불필요한 업데이트 SQL을 줄인다.
- Hibernate의 Dirty Checking과 함께 사용된다.
🧪 사용법
@DynamicUpdate 적용 예시
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
@Entity
@DynamicUpdate
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
기본 JPA 업데이트와 비교
| 방식 | 설명 | 실행되는 SQL |
|---|---|---|
| 기본 JPA 업데이트 | 변경되지 않은 필드도 함께 업데이트될 수 있다. | UPDATE user SET name=?, email=? WHERE id=? |
@DynamicUpdate 사용 |
변경된 필드만 업데이트한다. | UPDATE user SET email=? WHERE id=? |
📌 장점과 단점
장점
- 변경된 필드만 업데이트하여 불필요한 SQL을 줄인다
- 트랜잭션 내에서 업데이트 범위를 줄일 수 있다
단점
- 업데이트 SQL이 동적으로 바뀌어 캐시 효율이 떨어질 수 있다
- Hibernate 의존 기능이라 JPA 표준은 아니다
⚠️ 주의사항
- 모든 상황에서 무조건 유리한 것은 아니다.
- 변경 컬럼이 많지 않더라도 동적 SQL 생성 비용이 생길 수 있다.
- 성능 최적화가 필요한 경우에만 사용하는 편이 좋다.
📌 정리
@DynamicUpdate는 변경된 필드만 UPDATE 하도록 하는 Hibernate 애너테이션이다.- Dirty Checking과 함께 쓰면 불필요한 SQL을 줄이는 데 도움이 된다.
- JPA 표준이 아니므로 사용 목적을 분명히 해야 한다.
댓글남기기