[JPA] Auditing 사용하기

Spring Data JPA가 제공하는 Audit 기능을 알아보자. Audit은 주로 DB값이 변경했을 때 누가 값을 변경했고, 언제 변경했는지 Audit(감사)하는 용도로 사용한다. Spring Data JPA는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 와 같은 어노테이션을 제공한다.

1. @EnableJpaAuditing 추가

@EnableJpaAuditing 어노테이션을 RootClass의 최 상단에 추가한다.

@SpringBootApplication
@EnableJpaAuditing
public class Application {
    // 생략
}

2. 해당 Entity에 AuditingEntityListener 를 등록

해당 엔티티에 클래스 레벨에 @EntityListeners를 선언하고,AuditingEntityListner를 등록한다.

@Data
@Entity
// 엔티티 리스너 등록
@EntityListeners(AuditingEntityListener.class)
public class Comment {

    @Id
    @GeneratedValue
    private Long id;
    private String comment;

3. Audit할 날짜 필드를 정의한다.

해당 엔티티에 Audit을 할 필드를 정의한다. (생성일,수정일 )

    // Audit 날짜 field를 정의한다.
    @CreatedDate
    private Date createdDate;

    @LastModifiedDate
    private Date lastModifiedDate;

4. Audit하는 작성자 필드를 정의한다.

    // Audit 작성자 field를 정의한다.
    @CreatedBy
    @ManyToOne
    private Account createdBy;

    @LastModifiedBy
    @ManyToOne
    private Account updatedBy;

DB의 변경사항을 일으키는 Author를 Account클래스의 객체와 매핑했다.
Account 클래스는 다음과 같다.

@Entity
@Data
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
    private String password;
}

@CreatedBy@LastModifiedBy 는 Spring Security의 ContextHolder안에 들어있는 Principal(신원정보)의 name값으로 매핑을 해준다. 만약에 Custom하게 구현할려면 아래와 같이 AuditorAware 인터페이스를 구현해야 한다. Spring Security의 ContextHolder에 존재하는 Authentication 정보를 통해서 매핑한다.

@Service
public class AccountAwareAudit implements AuditorAware<Comment> {

    @Override
    public Optional<Comment> getCurrentAuditor() {
        // Spring Security를 통한 Auditor 매핑
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            return null;
        }

        return ((MyUserDetails) authentication.getPrincipal()).getUser();
    }

이렇게 만든 빈(AccountAwareAudit)을 참조할 수 있도록 @EnableJpaAuditing의 auditorAwareRef 속성값으로 등록 해준다.

@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "accountAwareAudit")
public class Application {

    // 생략
}

5. 정리

Spring Data Jpa가 제공하는 엔티티의 변화를 추적하는 Audit 기능에 대해서 알아보았다. 날짜 Audit은 제공해준 어노테이션 기반으로 구현할 부분이 없었지만, 작성자에 관한 부분은 대부분 Spring Security를 사용하기 때문에 ContextHolder를 통해서 신원정보를 가져와서 매핑해 주었다.

6. 참고자료

📚 Related Posts

[JPA] Auditing 사용하기
Older post

[JPA]@Transactional를 통한 Optimization

Newer post

[Spring]Bean에 대해서 알아보자

[JPA] Auditing 사용하기