아카이브

[스프링 데이터 JPA] 스프링 데이터 JPA 11. Auditing 본문

Spring/스프링 데이터 JPA

[스프링 데이터 JPA] 스프링 데이터 JPA 11. Auditing

주멘이 2021. 1. 17. 17:15

엔티티의 변경 시점에 언제, 누가 변경했는지에 대한 정보를 기록하는 기능

 

아쉽지만 이 기능은 스프링 부트가 자동 설정해주지 않습니다.

메인 애플리케이션 위에 @EnableJpaAuditing 추가(@EnableJpaAuditing에 AuditorAware 빈 이름 설정하기)

@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "accountAuditAware")
@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND
        , repositoryImplementationPostfix = "Impl"
        , repositoryBaseClass = SimpleYourRepository.class)
@Import(JumenRegister.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

 

엔티티 클래스 위에 @EntityListeners(AuditingEntityListener.class) 추가

@NamedEntityGraph(name = "Comment.post", attributeNodes = @NamedAttributeNode("post"))
@Entity
@EntityListeners(AuditingEntityListener.class)
@Getter
@Setter
public class Comment {

    @Id
    @GeneratedValue
    private Long id;

    private String comment;

    /*
     * ManyToOne에서 fetch default = EAGER
     * */
    @ManyToOne(fetch = FetchType.LAZY)
    private Post post;

    @CreatedDate
    private Date created;

    @CreatedBy
    @ManyToOne
    private Account createdBy;

    @LastModifiedDate
    private Date updated;

    @LastModifiedBy
    @ManyToOne
    private Account updatedBy;


    private Integer likeCount = 0;

    private int up;

    private int down;

    private boolean best;



}

 

AuditorAware 구현체 만들기

@Service
public class AccountAuditAware implements AuditorAware<Account> {
    @Override
    public Optional<Account> getCurrentAuditor() {
        System.out.println("looking for current user");
        return Optional.empty();
    }
}

 

JPA의 라이프 사이클 이벤트

 

Hibernate ORM 5.4.27.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

  • Hibernate가 제공하는 기능
  • 엔티티 변화에 따라 특정한 콜백 이벤트를 발생시켜준다.
  • 엔티티에 콜백을 정의할 수 있다.
  • 이를 통한 Audit 기능 구현이 가능하다.

Comment Entity에 라이프 사이클 이벤트 추가하기

public class Comment {

 	... 생략 ...
    
   
    
    @PrePersist 
    public void prePersist() {
        System.out.println("PrePersist is called");
        this.created = new Date();
    }

    @PreUpdate
    public void preUpdate() {
        System.out.println("PreUpdate is called");
        this.updated = new Date();
    }


}