[Spring Data JPA] - Auditing

홍정완·2022년 8월 2일
0

JPA

목록 보기
21/38
post-thumbnail
post-custom-banner

Auditing


Entity를 생성하거나 변경할 때, 각각의 시간과 담당자를 추적할 필요가 있다.

그렇게 위해선 Entity마다 필요에 따라 등록일, 수정일, 등록자, 수정자 이 네 가지 속성을 가져야 한다.

이때 공통적인 속성을 모두 가지는 클래스를 설계하면 간단히 해결할 수 있다.




Auditing - 순수 JPA 사용


@MappedSuperclass  
@Getter
public class BaseEntity {

 	@Column(updatable = false)  
 	private LocalDateTime createdDate;
	private LocalDateTime updatedDate;
 
 	@PrePersist  
 	public void prePersist() {
 		LocalDateTime now = LocalDateTime.now();
        
		createdDate = now;
		updatedDate = now;
 	}
    
 	@PreUpdate  
 	public void preUpdate() {
 		updatedDate = LocalDateTime.now();
 	}

}
@Entity
@Getter
public class Member extends BaseEntity { ... }

  • @MappedSuperClass

    • 상속된 엔티티에 매핑 정보가 적용되도록 지정한다.
    • 하위 클래스에서 @AttributeOverride나 @AssociationOverride로 재정의 할 수 있다.

  • updatable = false

    • 실수로 값을 바꿔도 업데이트되지 않는다.

  • @PrePersist

    • persist(insert) 하기 전 호출

  • @PreUpdate

    • update 하기 전 호출



Auditing - Spring Data JPA 사용


Spring Data JPA가 제공하는 기능을 이용한다면 더 편리하게 기능을 구현할 수 있다.


우선 기본 설정을 불러올 수 있게 애노테이션을 추가해 주자.


@SpringBootApplication
@EnableJpaAuditing  
public class SpringApplication {

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

}
@EntityListeners(AuditingEntityListener.class) // 이벤트가 발생할 때 호출해 줄 Listener 클래스 지정 
@MappedSuperclass
@Getter
public class BaseEntity {

    @CreatedDate // 등록 날짜를 나타내는 필드로 선언
    @Column(updatable = false)
    private LocalDateTime createdDate;
    
    @LastModifiedDate // 수정 날짜를 나타내는 필드로 선언
    private LocalDateTime lastModifiedDate;
}
@Entity
@Getter
public class Member extends Entity { ... }



대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다.
그래서 아래와 같이 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;
}

  • 저장 시점에 등록일, 등록자는 물론이고, 수정일, 수정자도 같은 데이터가 저장된다.

    • 데이터가 중복 저장되는 것 같지만, 변경 컬럼만 확인해도 마지막에 업데이트한 유저를 확인할 수 있으므로 유지 보수 관점에서 편리하다.

    • 이렇게 하지 않으면 변경 컬럼이 null 일 때 등록 컬럼을 또 찾아야 한다.


  • 저장 시점에 저장 데이터만 입력하고 싶으면 @EnableJpaAuditing(modifyOnCreate = false) 옵션을 사용
profile
습관이 전부다.
post-custom-banner

0개의 댓글