스프링 데이터 JPA - Auditing, 엔티티에 등록일, 수정일, 등록자, 수정자 자동으로 적용하기!
2021. 2. 8. 10:12ㆍJPA/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>
'JPA > SPRING DATA JPA' 카테고리의 다른 글
스프링데이터 JPA - 컨트롤러에서 Pageable 파라미터로 받아 페이징하기 (0) | 2021.02.08 |
---|---|
스프링데이터 JPA - 도메인 클래스 컨버터 (0) | 2021.02.08 |
스프링데이터 JPA - 사용자 정의 레퍼지토리 구현 (0) | 2021.02.07 |
스프링 데이터 JPA[쿼리 메서드] - 벌크 연산 (0) | 2021.02.06 |
스프링데이터 JPA[쿼리 메서드] - 페이징 (0) | 2021.02.06 |