BaseTimeEntity
package study.datajpa.entity;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import lombok.Getter;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false) // 수정되지 않도록
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
BaseEntity
package study.datajpa.entity;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import lombok.Getter;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity extends BaseTimeEntity {
@CreatedBy
@Column(updatable = false) // 수정되지 않도록
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
BaseEntity와 BaseTimeEntity 분리 이유
생성일(CreatedDate)과 수정일(LastModifiedDate)은 거의 모든 테이블에서 사용하지만, 생성자(CreatedBy)와 수정자(LastModifiedBy)는 사용하지 않는 테이블들도 존재한다.
따라서 두 클래스를 분리하여 생성일과 수정일만 필요한 클래스는 BaseTimeEntity를 상속받고
생성일, 수정일, 생성자, 수정자가 모두 필요한 클래스는 BaseEntity를 상속 받아 이용하면 된다.
Application
package study.datajpa;
import java.util.Optional;
import java.util.UUID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@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());
}
}
@EnableJpaAuditing 추가
생성자, 수정자 로직
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
예제에서는 UUID를 이용했지만, 스프링 시큐리티를 이용했다면, SecurityContextHolder에서 id값을 가져와 넣어주면 된다.
자바 ORM 표준 JPA 프로그래밍 - 김영한