본문 바로가기
JPA

JPA - @DynamicUpdate

by 지민재 2024. 7. 17.
반응형
SMALL

@DynamicUpdate 어노테이션에 대해서 알아보자!

 사용하다 보면 엔티티의 업데이트가 예상치 못하게 전체 컬럼을 업데이트하는 상황을 마주칠 때가 있다. 특히 큰 테이블이나 자주 업데이트되는 테이블에서는 성능 문제가 생길 수 있다. 이럴 때 유용하게 사용할 수 있는 것이 바로 @DynamicUpdate 어노테이션이다.


@DynamicUpdate란?

@DynamicUpdate는 Hibernate에서 제공하는 어노테이션으로, 엔티티의 변경된 필드만 업데이트 한다. 기본적으로 Hibernate는 엔티티를 업데이트할 때 모든 컬럼을 업데이트하는 SQL을 생성한다. 하지만 @DynamicUpdate를 사용하면 실제 변경된 컬럼만 업데이트하는 SQL을 생성하도록 설정할 수 있다.

참고 : @DynamicUpdate 는 JPA 스펙이 아니고 하이버네이트 기능이다. JPA 스펙으로는 변경되는 컬럼만 추적하는 기능이 없다.

 

사용법

@DynamicUpdate를 사용하기 위해서는 엔티티 클래스에 어노테이션을 추가해주기만 하면 된다. 예를 들어보자.

import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
public class User {

    @Id
    private Long id;
    private String name;
    private String email;

}

이렇게 @DynamicUpdate를 추가하면, 엔티티의 일부 필드만 변경되었을 때 해당 필드만 업데이트하는 SQL이 실행된다.

@DynamicUpdate를 사용할 때의 장단점

@DynamicUpdate를 사용하면 업데이트 성능이 개선될 수 있지만, 항상 좋은 선택은 아니다. 그래서 장단점을 잘 이해하고 사용하는 게 중요하다.

장점

  1. 업데이트 성능 향상: 변경된 필드만 업데이트하므로 불필요한 업데이트를 줄일 수 있어.
  2. 트래픽 감소: 네트워크를 통해 전송되는 데이터 양이 줄어들어 트래픽을 줄일 수 있어.

단점

  1. SQL 캐시 사용 제한: 변경된 필드에 따라 동적으로 SQL을 생성하기 때문에 SQL 캐시를 효과적으로 사용할 수 없어.
  2. 복잡성 증가: 엔티티의 필드가 많이 변경되는 경우, 어떤 필드가 변경되었는지 추적하는 로직이 복잡해질 수 있어.
추가 설명

예전에 JDBC 를 직접 이용해서 SQL 작성했을 때 PreparedStatement 클래스가 있었다. PreparedStatement 는 Statement 클래스와 달리 SQL 구문을 캐시하고, ? 로 작성된 파라미터 부분만 변경하여 재사용한다. JPA 에서도 내부적으로는 JDBC 와 PreparedStatement 를 사용하게 되는데, 변경된 컬럼에 대해서만 update 쿼리를 날리게 되면 이런 SQL 캐시 히트율이 떨어지게 될 것이다.

언제 사용하면 좋을까?

  • 테이블의 컬럼 수가 많고, 특정 컬럼만 자주 업데이트되는 경우
  • 대용량 트래픽을 처리해야 하는 경우

하지만 단순한 CRUD 애플리케이션에서는 @DynamicUpdate를 사용하는 것이 오히려 복잡성을 증가시킬 수 있으니, 꼭 필요한 경우에만 사용하는 것이 좋다.


마치며

Hibernate를 사용하면서 성능 이슈를 해결하고 싶다면 @DynamicUpdate를 고려해보는 것도 좋은 방법이다. 하지만 사용 전에 장단점을 충분히 이해하고 적용하는 것이 중요하다. 이렇게 하면 불필요한 업데이트를 줄이고 성능을 최적화할 수 있다 !

틀린점이 있다면 언제든 댓글 남겨줘 !

댓글