[java] Hibernate Envers를 사용하여 특정 필드의 변경 이력을 자세히 추적할 수 있나요?

Hibernate Envers를 사용하려면 먼저 Hibernate JPA 프로젝트에 Envers 종속성을 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 아래 의존성을 추가하면 됩니다:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>5.x.x.Final</version>
</dependency>

Hibernate Envers를 사용하기 위해 엔티티 클래스에 @Audited 어노테이션을 추가해야 합니다. 이는 해당 엔티티의 변경 이력을 추적할 수 있도록 합니다. 변경 이력은 자동으로 aud 테이블에 저장됩니다.

특정 필드의 변경 이력을 자세히 추적하기 위해 @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 어노테이션을 해당 필드에 추가해야 합니다. 이렇게 하면 해당 필드의 값의 변경 이력이 추적되지 않지만, 이력 기록에는 해당 필드가 포함됩니다.

예를 들어, 다음은 User 엔티티 클래스에서 username 필드의 변경 이력을 추적하는 예입니다:

@Entity
@Audited
public class User {

    @Id
    private Long id;
    
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private String username;
    
    // getter, setter, constructors, etc.
}

이제 User 엔티티의 username 필드에 대한 변경 이력을 검색하려면 AuditReader 인터페이스를 사용해야 합니다. AuditReader 인스턴스는 AuditReaderFactory를 통해 얻을 수 있습니다.

AuditReader reader = AuditReaderFactory.get(entityManager);
List<Number> revisions = reader.getRevisions(User.class, userId);

for (Number revision : revisions) {
    User user = reader.find(User.class, userId, revision);
    String username = user.getUsername();
    // username 변경 이력 처리
}

위 코드에서 getRevisions 메서드를 사용하여 특정 엔티티의 변경 이력 버전을 가져올 수 있습니다. 그런 다음 find 메서드를 사용하여 특정 버전의 엔티티 인스턴스를 검색할 수 있습니다.

Hibernate Envers를 사용하여 특정 필드의 변경 이력을 자세히 추적할 수 있으므로, 데이터베이스의 변경 이력을 보다 쉽게 관리하고 문제를 디버깅할 수 있습니다.

참고 문서: