Auditing은?
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용한다. 실무에서 많이 사용된다.
- 등록일 : 모든 테이블에 공통으로 적용 (권장)
- 수정일 : 모든 테이블에 공통으로 적용 (권장)
- 등록자, 수정자 : 테이블에 따라 정한다 (팀 컨밴션)
먼저, 순수 JPA에서 사용한다면?
우선, 등록일과 수정일만 적용해보자
public class Member extends JpaBaseEntity {
}
- @*MappedSuperclass :* 는 테이블과는 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할이다.
- @PrePersist : 엔티티가 비영속 상태에서 영속 상태가 되는 시점 이전에 실행된다.
- @PreUpdate : 영속 상태의 엔티티를 이용하여 데이터 업데이트를 수행하기 이전에 실행된다.
스프링 데이터 JPA에서 사용해보자. 훨씬 간편하다!
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
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;
}
- @CreatedDate : 등록일
- @LastModifiedDate : 수정일
- @CreatedBy : 등록자
- @LastModifiedBy : 수정자
등록자, 수정자를 처리하기 위해서 AuditorAware을 스프링 빈으로 등록해야 한다. 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받는다.
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
참고
실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다. 그래서 Base 타입을 분리하고, 원하는 타입을 선택해서 상속한다!
'공부 > Spring' 카테고리의 다른 글
[QueryDSL] 기본 문법을 알아보자 (0) | 2022.08.26 |
---|---|
QueryDSL을 적용해보자 (0) | 2022.08.26 |
[스프링 데이터 JPA] 사용자 정의 레포지토리를 추가로 구현하는 방법을 알아보자 (0) | 2022.08.25 |
JPA Hint를 통해 성능최적화를 할까? (0) | 2022.08.25 |
@EntityGraph을 통해 간편히 페치조인을 적용해보자 (0) | 2022.08.25 |
댓글