[java] Hibernate Envers에서 다양한 쿼리를 사용하여 데이터 변경 로그를 조회할 수 있나요?

먼저, 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();

위의 코드에서 startDateendDate는 조회할 시간 범위를 나타내는 날짜 객체입니다. forRevisionsOfEntity 메서드를 사용하여 특정 엔티티의 변경 이력을 조회하고, add 메서드를 사용하여 추가적인 조건을 설정할 수 있습니다.

이처럼 Hibernate Envers를 사용하면 다양한 쿼리를 사용하여 데이터 변경 로그를 조회할 수 있습니다. 자세한 내용은 Hibernate Envers 공식 문서를 참고하시기 바랍니다.

참고 문서: Hibernate Envers 공식 문서