이번 게시글에서는 @DynamicUpdate에 대해서 정리하겠다.
Hibernate는 JPA의 구현체 중 하나로, 애플리케이션이 시작될 때 모든 엔티티를 스캔하여 업데이트 쿼리를 미리 캐싱한다. 이 때문에 엔티티의 일부 필드만 변경되어도 엔티티 전체가 업데이트 된다. 이러한 문제를 해결하는 방법중 하나가 @DynamicUpdate이다.
@Entity 어노테이션이 붙은 클래스에 @DynamicUpdate를 추가함으로써 쉽게 적용할 수 있다. 이를 통해 변경된 필드만 업데이트 쿼리에 포함시킬 수 있게 된다.
value 필드만 수정했음에도 불구하고 엔티티의 모든 컬럼이 업데이트 쿼리에 포함된 상태이다.
@DynamicUpdate 적용 이후에는 value 필드와 수정 시간 필드(modified_at)만 업데이트 쿼리에 포함되는 것을 확인할 수 있다.
@DynamicUpdate와 같이 유용해 보이는 기술이 왜 기본 설정으로 제공되지 않는지 의문을 가졌다. 이에 대해서 조사해보았고, 아래와 같은 이유로 기본 설정으로 제공되지 않는다고 한다.
그래서 엔티티 필드가 많지 않거나 대부분의 필드가 업데이트 되는 경우, @DynamicUpdate의 효과는 미미하며 오히려 성능 저하를 일으킬 수 있다고한다.
그렇다면 반대로 @DynamicUpdate를 적용해야하는 경우는 언제일까?