BaseEntity 생성하기
Auditing이 필요한 Entity에서 상속받을 BaseEntity를 생성합니다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String modifiedBy;
}
@MappedSuperclass (javax.persistence)
Entity에서 Table에 대한 공통 매핑 정보가 필요할 때 부모 클래스에 정의하고 상속받아 해당 필드를 사용하여 중복을 제거
@EntityListeners (javax.persistence)
Entity를 DB에 적용하기 이전, 이후에 커스텀 콜백을 요청할 수 있는 어노테이션
Class AuditingEntityListener (org.springframework.data.jpa)
Entity 영속성 및 업데이트에 대한 Auditing 정보를 캡처하는 JPA Entity Listener
@CreatedDate (org.springframework.data)
데이터 생성 날짜 자동 저장 어노테이션
@LastModifiedDate (org.springframework.data)
데이터 수정 날짜 자동 저장 어노테이션
@CreatedBy (org.springframework.data)
데이터 생성자 자동 저장 어노테이션
@LastModifiedBy (org.springframework.data)
데이터 수정자 자동 저장 어노테이션
Entity에 적용하기
id와 name을 가지고 있는 간단한 User Entity에 BaseEntity를 상속받습니다.
@Getter
@Entity
@NoArgsConstructor(access = PROTECTED)
public class User extends BaseEntity {
@Id
@GeneratedValue
@Column(name = "user_id")
private Long id;
private String name;
public User(String name) {
this.name = name;
}
public void changeName(String name) {
this.name = name;
}
}
@CreatedBy, @ModifiedBy 사용하기
org.springframework.data.domain.AuditorAware를 스프링 빈으로 등록해야 합니다.
public interface AuditorAware<T> {
/**
* Returns the current auditor of the application.
*
* @return the current auditor.
*/
Optional<T> getCurrentAuditor();
}
AuditorAware<T> 인터페이스는 Optional<T>를 반환하는 method가 하나 있기 때문에 아래 코드처럼 람다로 AuditorAware<T>를 구현한 객체를 반환할 수 있습니다.
@Bean
public AuditorAware<String> auditorProvider() {
// 람다를 이용
return () -> Optional.of(UUID.randomUUID().toString());
// 익명 클래스를 이용
return new AuditorAware<String>() {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of(UUID.randomUUID().toString());
}
};
}
JUnit으로 테스트해보기
코드는 위와 동일합니다.
UUID의 값이 created_by와 modified_by 컬럼에 자동으로 insert 되었습니다.
random값으로 지정했기 때문에 userA가 userB로 바뀌면서 modified_by의 값도 변경되었습니다.
'JPA' 카테고리의 다른 글
페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법 (0) | 2022.07.14 |
---|---|
JPA 낙관적 락(부제 - OPTIMISTIC) (0) | 2022.06.22 |
@Converter (부제 - 데이터 변환) (0) | 2022.06.21 |
Spring data JPA 쿼리 생성 기능 (0) | 2022.06.19 |
벌크 연산(부제 - DB에 직접 쿼리) (0) | 2022.06.18 |