스프링 데이터 JPA - Auditing, 엔티티에 등록일, 수정일, 등록자, 수정자 자동으로 적용하기!

2021. 2. 8. 10:12JPA/SPRING DATA JPA

데이터베이스의 테이블에 등록일, 수정일과 같은 정보는 시스템을 운영하는데 있어서 거의 모든 테이블에 필수적으로 들어가야하는 정보들이다. JPA에서는 @MappedSuperclass 어노테이션으로 베이스 엔티티를 설정 할 수 있고 베이스 엔티티를 상속받아 등록일, 수정일을 적용할 수 있다. 하지만 상속을 해야한다는 것이 꺼림직하다...하지만 스프링 데이터 JPA에서는 이와 같은 정보를 엔티티가 저장될때, 혹은 수정될때 상속없이 어노테이션으로 자동으로 처리할 수 있게 지원하고 있다. 그 방법을 알아보자!

 

1. @EnableJpaAuditing -> 스프링 부트 설정 클래스에 적용

2. @EntityListeners(AuditingEntityListener.class) -> Auditing을 적용할 엔티티에 적용!(이 어노테이션을 사용하지 않고 모든 엔티티에 적용하는 방법은 밑에 있습니다)

3. 시간 엔티티 만들기

public class BaseTimeEntity {
	@CreatedDate 
	@Column(updatable = false)
	private LocalDateTime createdDate;
    
	@LastModifiedDate 
	private LocalDateTime lastModifiedDate;
}

4. 사용자 엔티티 만들기 - 시간 엔티티는 거의 모든 엔티티에 적용되야하는 반면 사용자 엔티티는 선택적으로 적용해야하기 때문에 시간과 사용자를 분리하여 상속받는 형태로 엔티티에 선택적으로 적용할 수 있도록 한다.

public class BaseEntity extends BaseTimeEntity {
	@CreatedBy
	@Column(updatable = false) 
	private String createdBy;
    
	@LastModifiedBy
	private String lastModifiedBy; 
}

5. 사용자를 처리해주는 AuditorAware 스프링 빈 등록 - 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받음

@Bean 
public AuditorAware<String> auditorProvider() { 
	return () -> Optional.of(UUID.randomUUID().toString()); 
}

모든 엔티티 적용하기

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>