[공부정리] @DynamicUpdate 사용하기

jeyong·2024년 3월 30일
0

공부 / 생각 정리  

목록 보기
65/120
post-thumbnail
post-custom-banner

이번 게시글에서는 @DynamicUpdate에 대해서 정리하겠다.

1. @DynamicUpdate란?

Hibernate는 JPA의 구현체 중 하나로, 애플리케이션이 시작될 때 모든 엔티티를 스캔하여 업데이트 쿼리를 미리 캐싱한다. 이 때문에 엔티티의 일부 필드만 변경되어도 엔티티 전체가 업데이트 된다. 이러한 문제를 해결하는 방법중 하나가 @DynamicUpdate이다.

2. 프로젝트에 @DynamicUpdate 적용

@Entity 어노테이션이 붙은 클래스에 @DynamicUpdate를 추가함으로써 쉽게 적용할 수 있다. 이를 통해 변경된 필드만 업데이트 쿼리에 포함시킬 수 있게 된다.

적용 전

value 필드만 수정했음에도 불구하고 엔티티의 모든 컬럼이 업데이트 쿼리에 포함된 상태이다.

적용 후

@DynamicUpdate 적용 이후에는 value 필드와 수정 시간 필드(modified_at)만 업데이트 쿼리에 포함되는 것을 확인할 수 있다.

3. @DynamicUpdate가 기본 설정이 아닌 이유

@DynamicUpdate와 같이 유용해 보이는 기술이 왜 기본 설정으로 제공되지 않는지 의문을 가졌다. 이에 대해서 조사해보았고, 아래와 같은 이유로 기본 설정으로 제공되지 않는다고 한다.

  • 캐시 된 쿼리를 사용하지 못하고 동적 쿼리 생성 과정에서 오버헤드가 발생함

그래서 엔티티 필드가 많지 않거나 대부분의 필드가 업데이트 되는 경우, @DynamicUpdate의 효과는 미미하며 오히려 성능 저하를 일으킬 수 있다고한다.

4. @DynamicUpdate 적용을 고려해야 하는 경우

그렇다면 반대로 @DynamicUpdate를 적용해야하는 경우는 언제일까?

  • 엔티티의 필드가 많고, 일부 필드만 자주 업데이트 되는 경우
  • 낙관적 락을 사용하며 버전 관리를 위해 @Version 어노테이션과 함께 사용하는 경우

@DynamicUpdate는 특정 상황에서 성능 최적화에 도움이 될 수 있지만, 모든 경우에 도움이 되는건 아니다. 따라서 도입 전 충분한 테스트를 통해 실제 애플리케이션에서의 영향을 검토하고, 적용 여부를 결정하는 것이 중요하다고 생각한다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글