Auditing

Mina Park·2022년 10월 13일
0

1. 사용 배경

  • 엔티티를 생성/변경할 때 변경한 사람/시간은 꼭 추적이 필요
    • 사실상 모든 테이블에 필요한 공통정보(운영시 추적 용이를 위해)

📌 등록일, 수정일, 등록자, 수정자

2. spring data jpa 사용 예시

  • 스프링부트 설정 클래스
    • @EnableJpaAuditing 어노테이션 적용
    • 등록자,수정자의 경우 AuditorAware 스프링 빈 등록 처리
      • 실제는 세션정보 받아서 아이디값 등을 꺼내 정보를 넣어줘야함
@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());
		//실제는 세션정보 받아서 아이디 꺼내서 정보를 넣어줘야함
	}
}
  • 엔티티
    • @EntityListeners(AuditingEntityListener.class) 어노테이션 적용
    • 각각 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 어노테이션 적용
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseEntity {

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

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;

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

    @LastModifiedBy
    private String lastModifiedBy;
}

[참고] 등록일/수정일은 모든 엔티티에 공통적이지만 만약 등록자/수정자는 필요 없다면?

  • BaseEntity(등록자/수정자)과 BaseTimeEntity(등록일/수정일) 분리하여 원하는 타입을 선택해서 상속
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;
}

[참고] 최초 저장시점에 수정일/수정자를 꼭 저장해야할까?

  • 데이터 중복저장이라는 생각이 들수도 있지만 이렇게 해두면 유지보수 관점에서 매우 편리
  • 또한 변경 컬럼이 null로 들어가게되면 등록 컬럼을 또 찾아야하므로 번거로움
  • 저장시점에 저장데이터만 딱 입력하고싶다면 @EnableJpaAuditing(modifyOnCreate = false) 옵션 사용

0개의 댓글