본문 바로가기
FrameWork/Spring

[Spring] JPA Auditing 사용법

by 계범 2022. 8. 11.

JPA Auditing

서비스를 운영하다보면 DB에 데이터를 누가,언제 데이터를 생성했는지, 수정했는지를 저장해놓을 일이 있다.

 

이럴때마다, 엔티티별로 동일한 필드명을 달고, 데이터를 넣어주는 코드를 중복적으로 짜야하는 것을 없애기위해 Java ORM 기술인 JPA에서 제공해주는 기술이다.

 

Auditing은 감사를 뜻하고, JPA Auditing은 해당 Entity를 지켜보다가 데이터를 조작할일이 생기면 자동으로 값을 넣어준다.

 

javax에서도 제공하는 Auditing이 있지만(내부적으로 해당 기술 사용)

@PrePersist @PostPersist @PreUpdate @PostUpdate

Spring Data JPA에서 제공해주는 Auditing을 쓸 생각이다.(값도 자동으로 넣어주기 위해)

 

Auditing 사용법

auditing을 사용할려면, 일단 SpringBootApplication위에 @EnableJpaAuditing을 달아서 활성화해준다.

@EnableJpaAuditing
@SpringBootApplication
public class DemoApplication {

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

}

 

auditing을 사용할 Entity에 auditing 내용들을 적용한다.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createDateTime;

    @LastModifiedDate
    private LocalDateTime updateDateTime;

    @CreatedBy
    @Column(updatable = false)
    private String creator;

    @LastModifiedBy
    private String updator;

}
  • @MappedSuperclass(javax)
    • 객체들간의 공통 매핑 정보가 필요할때, MappedSuperclass가 붙은 부모클래스에 선언하고, 해당 클래스를 상속받아 사용하여 중복을 제거하게 된다
    • 혼자선 존재할 수 없기에 추상클래스로 선언
  • @EntityListeners(javax)
    • Entity를 db에 적용 전, 커스텀 콜백 요청 어노테이션
    • 지원이벤트 종류
    • 더보기
      @PrePersist : 새로운 엔티티에 대해 persist가 호출되기 전@PreUpdate : 엔티티 업데이트 작업 전
      @PreRemove : 엔티티가 제거되기 전 
      @PostPersist : 새로운 엔티티에 대해 persist가 호출된 후
      @PostUpdate : 엔티티가 업데이트된 후
      @PostRemove : 엔티티가 삭제된 후
      @PostLoad : Select조회가 일어난 직후에 실행
  • AuditingEntityListener.class
    • Entity 영속성 및 업데이트에 대한 Auditing 정보를 캡처하는 JPA Entity Listener
  • @CreatedDate
    • 데이터 생성 일시 자동 저장 어노테이션
    • @Column(updatable = false) 생성날짜가 저장되는것이므로, 수정 불가능으로 지정
  • @LastModifiedDate
    • 데이터 마지막 수정 일시 자동 저장 어노테이션
  • @CreatedBy
    • 데이터 생성자 자동 저장 어노테이션( config 설정 해줘야 동작! )
  • @LastModifiedBy
    • 데이터 마지막 수정자 자동 저장 어노테이션( config 설정 해줘야 동작! )

 

이렇게 지정해둔 BaseEntity를 다른 Entity에서 상속받아서 사용하면 된다.

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User extends BaseEntity{

    @Id
    private Long sn;

    private String name;
    
}

 

@CreatedBy @LastModifiedBy 사용을 위한 Config설정

JPA에서 생성자와 수정자가 누군지는 알 수 없기때문에,

개발자가 어떤 기준으로 넣어줄 건지 정해줘야한다.

 

@Configuration
public class AuditorProvider implements AuditorAware {

    @Override    public Optional getCurrentAuditor() {
        return Optional.of(ManagerContextHolder.getCmsMember());    }
    
}

AuditorAware를 스프링으로 등록해주고,
해당 Auditor를 어떤 값을 반환해줄 것인지 지정해두면 잘 적용된다.

 

참조

AuditingEntityListener (Spring Data JPA 2.7.2 API)

댓글