[SpringData] Auditing

KMS·2022년 4월 26일
0

SpringData

목록 보기
6/9

실무에서는 엔티티를 생성일, 마지막 수정일, 생성자, 마지막 수정자를 추적하는 것이 중요합니다. 이 정보들을 추적하는 것을 Auditing이라고 합니다.
JPA에서는 엔티티에 해당 정보들을 저장할 수 있는 Column들을 생성해서 추적했으며, 재사용에 용이하도록 BaseEntity를 생성해서 했습니다.(더 자세한 내용은: https://velog.io/@k_ms1998/JPA-MappedSuperClass)
이번 포스팅에서는 JPA와 SpringData에서 Auditing 하는 방식을 보고 차이점을 보도록 하겠습니다.

JPA

JpaBaseEntity

@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
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();
    }
}
  • 생성 날짜(createdDate)는 처음 엔티티 생성 이후에는 변경할 필요가 없으므로, updatable = false로 추후에 변경이 되는 것을 막아줍니다
  • @PrePersist: persist가 이루어지기 전에 호출할 메서들을 알려줌으로써, persist가 이루어지기 전에 자동으로 해당 메서드가 호출됩니다.
  • @PreUpdate: update 쿼리가 실행이 되기 전에 메서드가 호출되도록 해줍니다

SpringData

DataBaseEntity

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
public class DataBaseEntity extends DataBaseTimeEntity{

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

    @LastModifiedBy
    private String lastModifiedBy;

}

DataBaseTimeEntity

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
public class DataBaseTimeEntity {

    @CreatedDate
    @Column(updatable = false) //해당 값을 한번 생성하면 변할수 없도록 해줌
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;

}

Main

@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());
	}

}

SpringData에서 Audinting을 사용하기 위해서는 BaseEntity들에 @EntityListeners(AuditingEntityListener.class)와 Main에는 @EnableJpaAuditing 애노테이션들을 추가해 줘야 합니다.
그리고, 각 BaseEntity에서 @CreatedDate, @LastModifiedDate, @CreatedBy 그리고 @LastModifiedBy 애노테이션들로 Auditing을 구현할 수 있습니다.
결과:

(Team에는 생성일, 수정일 그리고 Member에는 생성일, 수정일, 생성자, 수정자 모두 필요하다고 가정했을때의 경우; BaseEntity와 BaseTimeEntity을 해당 예제처럼 분리해서 사용하면 엔티티에 필요에 따라 Auditing을 할 수 있습니다; 이런식으로 분리하는 것은 JPA에서도 가능)

profile
Student at Sejong University Department of Software

0개의 댓글