먼저, Envers를 사용하기 위해서는 엔티티 클래스에 @Audited
어노테이션을 추가해야 합니다. 이 어노테이션은 해당 엔티티의 변경 이력을 추적하도록 설정합니다. 그리고 hibernate.revinfo_table
이라는 테이블이 설정한 데이터베이스에 생성되어야 합니다.
Envers는 변경된 엔티티의 이력을 조회하기 위해 다양한 쿼리를 제공합니다. 예를 들어, AuditReader
를 사용하여 특정 엔티티의 모든 버전을 조회할 수 있습니다. 다음은 이를 수행하는 예제 코드입니다.
AuditReader reader = AuditReaderFactory.get(entityManager);
List<Number> revisionNumbers = reader.getRevisions(Entity.class, entityId);
for (Number revisionNumber : revisionNumbers) {
Entity entity = reader.find(Entity.class, entityId, revisionNumber);
// 변경 이력에 대한 처리 로직 수행
}
위의 코드에서 Entity
는 변경된 엔티티를 나타내는 클래스입니다. entityId
는 조회할 엔티티의 식별자입니다. getRevisions
메서드를 사용하여 해당 엔티티의 모든 버전의 리비전 번호를 가져온 후, find
메서드를 사용하여 특정 리비전 번호에 해당하는 엔티티를 조회할 수 있습니다.
또한, Envers는 이력 조회를 위한 다양한 쿼리를 지원합니다. 예를 들어, AuditQuery
를 사용하여 특정 시간 범위 내에 변경된 엔티티를 조회할 수 있습니다. 아래는 해당 내용을 반영한 예제 코드입니다.
AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Entity.class, false, true)
.add(AuditEntity.property("timestamp").between(startDate, endDate));
List<?> results = query.getResultList();
위의 코드에서 startDate
와 endDate
는 조회할 시간 범위를 나타내는 날짜 객체입니다. forRevisionsOfEntity
메서드를 사용하여 특정 엔티티의 변경 이력을 조회하고, add
메서드를 사용하여 추가적인 조건을 설정할 수 있습니다.
이처럼 Hibernate Envers를 사용하면 다양한 쿼리를 사용하여 데이터 변경 로그를 조회할 수 있습니다. 자세한 내용은 Hibernate Envers 공식 문서를 참고하시기 바랍니다.
참고 문서: Hibernate Envers 공식 문서