[JPA] Auditing

컴공생의 코딩 일기·2023년 2월 3일
0

JPA

목록 보기
13/14
post-thumbnail

Auditing란?

Auditing란 스프링 데이터 JPA에서 시간에 대해서 자동으로 값을 넣어 주는 기능이다. Entity 클래스를 구현할 때 보통 등록일, 수정일은 필수 값으로 들어간다. 이러한 등록일, 수정일을 여러 클래스에서 따로 구현할 필요 없이 공통 클래스에서 등록일 수정일을 스프링 데이터 JPA가 자동으로 값을 넣어주는 편리한 기능이다.

  • 등록일
  • 수정일
  • 등록자
  • 수정자

순수 JPA를 사용한 구현

JpaBaseEntity 클래스 구현

@Getter
@MappedSuperclass
public class JpaBaseEntity {
    @Column(updatable = false)
    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;

    @PrePersist
    public void prePersist(){
        LocalDateTime now = LocalDateTime.now();
        this.createdDate = now;
        this.updatedDate = now;
    }

    @PreUpdate
    public void preUpdate(){
        this.updatedDate = LocalDateTime.now();
    }
}
  • @MappedSuperclass를 사용하여 공통 정보를 하나의 클래스로 매핑하기 위해 사용
  • @Column(updatable = false) : update를 못하게 막는 기능
  • @PrePersist : JPA 엔티티가 비영속 상태에서 영속 상태가 되는 시점 이전에 실행
  • @PreUpdate : 영속 상태에서 엔티티를 이용하여 데이터 업데이트를 수행하는 이전에 실행

JpaBaseEntity 상속

@Entity
public class Member extends JpaBaseEntity {
}

스프링 데이터 JPA 사용

1. 설정 : @EnableJpaAuditing -> 스프링 부트 설정 클래스에 적용해야 한다.

@EnableJpaAuditing // Auditing 설정
@SpringBootApplication
public class DataJpaApplication {
	public static void main(String[] args) {
		SpringApplication.run(DataJpaApplication.class, args);
}

스프링 데이터 Auditing 적용

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public class BaseEntity{
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
    
    @CreatedBy
    @Column(updatable = false)
    private String createBy;
    
    @LastModifiedBy
    private String lastModifiedBy;
}
  • 클래스에 @EntityListeners(AuditingEntityListener.class)를 설정해줘야 한다.
  • @CreatedDate : 등록일
  • @LastModifiedDate : 수정일
  • @CreatedBy : 등록자
  • @UpdatedBy : 수정자

등록자 수정자 값 넣는 방법

@EnableJpaAuditing
@SpringBootApplication
public class DataJpaApplication {

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

	@Bean
	public AuditorAware<String> auditorProvider(){
		return ()->Optional.of(UUID.randomUUID().toString());
	}
}

등록자, 수정자를 처리해주는 AuditorAware를 스프링 빈으로 등록해야 한다. 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받는다.

BaseEntity 상속

@Entity
public class Member extends BaseEntity {
}

참고: 실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다. 그래서 다음과 같이 Base 타입을 분리하고, 원하는 타입을 선택해서 상속한다.

public class BaseTimeEntity {
 @CreatedDate
 @Column(updatable = false)
 private LocalDateTime createdDate;
 @LastModifiedDate
 private LocalDateTime lastModifiedDate;
}
//-----------------------------------------------------------------
public class BaseEntity extends BaseTimeEntity {
 @CreatedBy
 @Column(updatable = false)
 private String createdBy;
 @LastModifiedBy
 private String lastModifiedBy;
}
profile
더 좋은 개발자가 되기위한 과정

0개의 댓글