Auditing

어떠한 entity의 변화가 발생했을 때, 변화가 언제, 누구에 의해 발생했는지를 기록하는 기능.

예시

Account, Comment라는 Entity가 있다.

comment라는 엔티티에 변경이 있을 때 마다, 언제 만들어졌으며(created), 언제 업데이트가 되었는지(updated), 누가 만들었는 지(createdBy), 누가 수정했는 지(updatedBy)에 대한 정보를 업데이트 하려고 한다.

먼저 @CreatedDate, @CreatedBy, @LastModifiedDate, @LastModifiedBy 애노테이션을 붙여준다.

Account 타입에 @ManyToOne을 붙여준다.

메인에 @EnableJpaAuditing를 붙여준다.

그 후 Auditing 기능을 사용할 Entity(여기서는 Comment)에 @EntityListeners(AuditingEntityListener.class)를 붙여준다.

이렇게하면, Date와 관련된 부분들은 자동 업데이트가 된다.

하지만, 현재 유저가 누군지 알 방법이 없으므로, Account와 관련된 부분은 업데이트를 할 수 없다.

현재 유저정보를 security에서 가져와서 넣을 수 있는 방법이 있다. AuditorAware라는 인터페이스의 구현체를 만들어야한다.

빈으로 등록해야한다.(@Service) 빈으로 등록 시 빈의 이름은 class이름의 앞글자를 소문자로 바꾼 것이 된다.(이 경우 accountAuditAware로 빈으로 등록되는 것)

getCurrentAuditor() 메서드에 security에서 현재 유저를 가져와서 authentication을 사용할 도메인 타입으로 변경해서 return해주는, 즉 현재 유저를 꺼내오는 로직만 넣어주면 된다. 그러면 Audit 기능을 사용할 수 있다.

(security부분이 들어가므로, 실제 구현은 하지 않겠다.)

그 후, 메인의 @EnableJpaAuditing에 만들어 준 구현체의 빈의 이름을 적어준다.(auditorAwareRef = "accountAuditAware")

JPA 라이프 사이클 이벤트

JPA 라이프 사이클 이벤트를 이용해서도 날짜, 유저를 설정해 줄 수 있다. JPA 라이프 사이클 이벤트란 어떠한 엔티티에 변화가 일어날 때, 특정한 콜 백을 실행할 수 있는 이벤트를 발생시켜주는 것이다.
(@EntityListeners(AuditingEntityListener.class), @EnableJpaAuditing(auditorAwareRef = "accountAuditAware") 이런 애노테이션 설정을 해 줄 필요가 없다.)

콜 백을 엔티티에 정의해줄 수 있다.

@PrePersist: 해당 엔티티가 저장되기 전에 호출된다.

다른 애노테이션

Ex.

0개의 댓글