BaseEntity, BaseTimeEntity 분리 설정

sangcheol·2024년 9월 8일
0
post-thumbnail

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 프로그래밍 - 김영한

profile
백엔드 개발자

0개의 댓글