[Hibernate Envers] Hibernate Envers 사용할 때 필요한 이런 저런 설정들

by 스뎅(thDeng) on

이 설정들은 꾸준히 업데이트 될 수 있음

org:
  hibernate:
    envers:
      audit_table_suffix: _audit
      store_data_at_delete: true # Delete 될 때, 현재 상태를 함께 저장한다. false 인 경우 null 로 저장됨. default: false
      do_not_audit_optimistic_locking_field: false # false 로 설정 해야 @Version 컬럼도 audit 테이블에 저장된다. default : true

Envers 설정 목록

REV 컬럼 Long 타입으로 변경

REVINFO 테이블의 REV 컬럼은 int 에서 long 으로 변환해 줘야 한다. 추가/수정/삭제를 할 때 마다 REV 가 하나씩 증가하는데, 20억이 넘어가면 int 사이즈는 오버 플로우 되어버릴 것이다.

설정은 [Hibernate Envers] REV(revision number)를 long으로 바꾸기 참고

@JoinColumn을 사용한 @OneToMany 인 경우

@JoinColumn을 사용한 @OneToMany로 양방향 연관관계인 경우, one 쪽에 @JoinTable이나 @AuditMappedBy 설정을 해줘야 한다. 21.22. @OneToMany with @JoinColumn

@Entity
@Audited
@AuditTable("order_audit")
class Order(

  @OneToMany
  @AuditMappedBy(mappedBy = "order")
  private orderItems: List<OrderItems>,
)

@Version을 사용하는 경우

@Version 을 사용해서 optimistic locking 을 사용하는 경우, audit 테이블에 함께 저장하기 위해서는 do_not_audit_optimistic_locking_field 설정을 해줘야 한다.

org:
  hibernate:
    envers:
      do_not_audit_optimistic_locking_field: false # false 로 설정 해야 @Version 컬럼도 audit 테이블에 저장된다. default : true

삭제할 때도 스냅샷을 남기고 싶은 경우

팀/회사에서는 soft delete를 사용하고 있는데, Hibernate Envers는 hard delete 기준으로 만들어진 것 같다.

Envers는 데이터를 삭제하면 실제로 데이터를 지우는 형태로 REVTYPE=2(del) 와 모든 필드는 null 로 audit 테이블에 저장한다. 하지만, soft delete를 사용하면 일부 필드만 변경(deleted=true)을 하는 경우가 많고, 저장할 때의 값이 필요해질 때가 있다. 이런 경우, store_data_at_delete 설정을 해줘야 한다.

org:
  hibernate:
    envers:
      store_data_at_delete: true # Delete 될 때, 현재 상태를 함께 저장한다. false 인 경우 null 로 저장됨. default: false

아래 이미지의 111346111348은 모두 audit 테이블의 삭제된 데이터인데, 11134Ostore_data_at_delete=true설정으로 삭제된 데이터를 함께 저장한 경우이다.

Deleted data

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License