1. 개요
Hibernate와 함께 Spring Data JPA를 사용하면 Hibernate의 추가 기능도 사용할 수 있습니다. @DynamicUpdate 는 그러한 기능 중 하나입니다.
@DynamicUpdate 는 JPA 엔터티에 적용할 수 있는 클래스 수준 어노테이션입니다. 그것은 Hibernate가 엔터티의 업데이트를 위해 생성하는 SQL 문에서 수정된 열만 사용하도록 합니다 .
이 기사에서는 Spring Data JPA 예제 를 사용하여 @DynamicUpdate 어노테이션을 살펴보겠습니다 .
2. JPA @엔티티
애플리케이션이 시작되면 Hibernate는 모든 엔터티의 CRUD 작업에 대한 SQL 문을 생성합니다. 이러한 SQL 문은 한 번 생성되며 성능을 향상시키기 위해 메모리에 캐시됩니다.
생성된 SQL 업데이트 문에는 엔터티의 모든 열이 포함됩니다. 엔터티를 업데이트하는 경우 수정된 열의 값이 SQL 업데이트 문으로 전달됩니다. 업데이트되지 않은 열의 경우 Hibernate는 업데이트를 위해 기존 값을 사용합니다.
예를 들어 이것을 이해하려고 노력합시다. 먼저 Account 라는 JPA 엔터티를 고려해 보겠습니다 .
@Entity
public class Account {
@Id
private int id;
@Column
private String name;
@Column
private String type;
@Column
private boolean active;
// Getters and Setters
}
다음으로 계정 엔터티 에 대한 JPA 리포지토리를 작성해 보겠습니다 .
@Repository
public interface AccountRepository extends JpaRepository<Account, Integer> {
}
이제 AccountRepository 를 사용하여 계정 개체 의 이름 필드 를 업데이트 합니다.
Account account = accountRepository.findOne(ACCOUNT_ID);
account.setName("Test Account");
accountRepository.save(account);
이 업데이트를 실행한 후 생성된 SQL 문을 확인할 수 있습니다. 생성된 SQL 문에는 계정 의 모든 열이 포함됩니다 .
update Account set active=?, name=?, type=? where id=?
3. @DynamicUpdate 를 사용하는 JPA @Entity
이름 필드만 수정했지만 Hibernate가 SQL 문에 모든 열을 포함하는 것을 보았습니다 .
이제 계정 엔터티 에 @DynamicUpdate 어노테이션을 추가해 보겠습니다.
@Entity
@DynamicUpdate
public class Account {
// Existing data and methods
}
다음으로 이전 섹션에서 사용한 것과 동일한 업데이트 코드를 실행해 보겠습니다. 이 경우 Hibernate에 의해 생성된 SQL에는 이름 열만 포함되어 있음을 알 수 있습니다.
update Account set name=? where id=?
그렇다면 엔티티에 @DynamicUpdate 를 사용하면 어떻게 될까요?
실제로 엔티티에서 @DynamicUpdate 를 사용할 때 Hibernate는 업데이트를 위해 캐시된 SQL 문을 사용하지 않습니다. 대신 엔터티를 업데이트할 때마다 SQL 문을 생성합니다. 이 생성된 SQL에는 변경된 열만 포함됩니다 .
변경된 열을 찾기 위해 Hibernate는 현재 엔터티의 상태를 추적해야 합니다. 따라서 엔터티의 필드를 변경하면 엔터티의 현재 상태와 수정된 상태를 비교합니다.
이는 @DynamicUpdate 에 관련된 성능 오버헤드가 있음 을 의미합니다 . 따라서 실제로 필요할 때만 사용해야 합니다.
확실히 이 어노테이션을 사용해야 하는 몇 가지 시나리오가 있습니다. 예를 들어 엔터티가 많은 수의 열이 있는 테이블을 나타내고 이러한 열 중 몇 개만 자주 업데이트해야 하는 경우입니다. 또한 버전 없는 낙관적 잠금을 사용할 때 @DynamicUpdate 를 사용해야 합니다 .
4. 결론
이 사용방법(예제)에서는 Hibernate의 @DynamicUpdate 어노테이션을 살펴보았습니다 . Spring Data JPA의 예를 사용하여 @DynamicUpdate 가 작동하는 것을 확인했습니다. 또한 이 기능을 사용해야 할 때와 사용하지 말아야 할 때를 논의했습니다.
항상 그렇듯이 이 예제에서 사용된 전체 코드 예제는 Github에서 사용할 수 있습니다 .