실전! 스프링 데이터 JPA

Ch04. 확장 기능 - Auditing

webmaster 2021. 12. 27. 11:27
728x90

엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면?

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

JPA

@PrePersist, @PreUpdate 어노테이션을 사용하여 영속화가 될떄와 Update가 될떄의 이벤트 정의
Test

  • JPA에서 아래와 같은 이벤트 어노테이션을 활용한다.
    • @PrePersist, @PostPersist @PreUpdate, @PostUpdate

SpringDataJPA

@EnalbeJpaAuditing 어노테이션 필수
명시적으로 Auditing 메소드 사용가능
생성일, 수정일

@Bean
public AuditorAware<String> auditorProvider() {
 return () -> Optional.of(UUID.randomUUID().toString());
}
  • 등록자, 수정자를 처리해주는 AuditorAware 스프링 빈 등록
  • 실무에서는 생성일, 수정일은 필요하지만 생성자, 수정자는 필요 없을 수도 있기 때문에 분리해서 만든다.
  • @EntityListeners(AuditingEntityListener.class) -> 엔티티에 적용
  • 각각의 어노테이션을 적용한다.
    • @CreatedDate @LastModifiedDate @CreatedBy @LastModifiedBy 

참고

저장 시점에 등록일, 등록자는 물론이고, 수정일, 수정자도 같은 데이터가 저장된다. 데이터가 중복 저장되는 것 같지만, 이렇게 해두면 변경 컬럼만 확인해도 마지막에 업데이트한 유저를 확인할 수 있으므로 유지보수 관점에서 편리하다. 이렇게 하지 않으면 변경 컬럼이 null 일 때 등록 컬럼을 또 찾아야 한다.

참고로 저장시점에 저장 데이터만 입력하고 싶으면 @EnableJpaAuditing(modifyOnCreate = false) 옵션을 사용하면 된다

전체 적용

META-INF/orm.xml

<?xml version=“1.0” encoding="UTF-8”?>
<entity-mappings xmlns=“http://xmlns.jcp.org/xml/ns/persistence/orm”
 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
 xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/persistence/
orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd”
 version=“2.2">
 <persistence-unit-metadata>
 <persistence-unit-defaults>
 <entity-listeners>
 <entity-listener
class="org.springframework.data.jpa.domain.support.AuditingEntityListener”/>
 </entity-listeners>
 </persistence-unit-defaults>
 </persistence-unit-metadata>

</entity-mappings>
  • @EntityListeners(AuditingEntityListener.class)를 생략하고 스프링 데이터 JPA 가 제공하는 이벤트를 엔티티 전체에 적용하려면 orm.xml에 다음과 같이 등록하면 된다
728x90