[java] Hibernate Envers에서 Audited Entity의 변경 이력을 어떻게 저장하나요?

먼저, Hibernate Envers를 프로젝트에 추가해야 합니다. Maven 프로젝트의 경우, pom.xml 파일에 다음 의존성을 추가할 수 있습니다:

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

그리고, 변경 이력을 저장할 Entity 클래스에 @Audited 어노테이션을 추가해야 합니다. 이 어노테이션은 Hibernate에 해당 Entity의 변경 이력을 추적하도록 지시합니다.

import org.hibernate.envers.Audited;

@Entity
@Audited
public class YourEntity {
    // Entity의 필드 및 메서드 정의
}

이제 Entity를 변경할 때 마다 Hibernate Envers는 변경 이력을 관리하는 동안 추가적인 테이블을 생성합니다. 변경 이력은 변경된 Entity의 이전 값과 현재 값을 저장하며, 변경된 필드는 어떻게 변경되었는지 추적합니다.

이력을 가져오기 위해서는 AuditReader를 사용해야 합니다. 예를 들어, 다음 코드는 AuditReader를 사용하여 YourEntity의 변경 이력을 가져오는 방법을 보여줍니다:

@Autowired
private AuditReader auditReader;

public List<Number> getRevisionsOfEntity(Long entityId) {
    AuditQuery query = auditReader.createQuery().forRevisionsOfEntity(YourEntity.class, false, true);
    query.add(AuditEntity.id().eq(entityId));
    query.addOrder(AuditEntity.revisionNumber().desc());
    
    List<Object[]> revisions = query.getResultList();
    List<Number> revisionNumbers = new ArrayList<>();
    
    for(Object[] revision : revisions) {
        Number revisionNumber = (Number) revision[1];
        revisionNumbers.add(revisionNumber);
    }
    
    return revisionNumbers;
}

위의 코드는 특정 Entity의 변경 이력을 가져옵니다. entityId 매개 변수는 변경 이력을 가져올 Entity의 ID입니다. 결과로는 revisionNumbers라는 List<Number>가 반환되며, 이는 해당 Entity의 이력 번호 목록입니다.

이렇게 Hibernate Envers를 사용하면 Audited Entity의 변경 이력을 쉽게 추적하고 저장할 수 있습니다. 자세한 내용은 Hibernate Envers의 공식 문서를 참조하세요.

참고 자료: