Back-End

[Spharos_6기 복습] Timestamp 설정

ddh1713 2025. 3. 27. 23:11
[1] common.BaseEntity

 

import jakarta.persistence.*;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime updatedAt;
}

 

[1] @MappedSuperclass

이 클래스를 상속 받는 엔티티 클래스가 이 클래스의 필드를 자신의 필드처럼 인식하게 한다.
DB에 별도의 테이블을 만들지 않고, 자식 클래스의 테이블에 컬럼이 포함된다.
- 부모 클래스는 테이블 ❌, 즉, BaseEntity 라는 테이블은 생기지 않는다.
- 자식 클래스는 부모 클래스를 포함한 필드를 테이블의 컬럼에 추가한다.
⁉️ 이렇게 쓰는 이유
공통 필드를 코드에서는 한 번만 정의하고, 여러 엔티티에서 재사용하기 위해서 이렇게 설계한다.

 


[2] @EntityListeners(AuditingEntityListener.class)

전체 흐름 :

 

1️⃣ 메인 애플리케이션 클래스에 @EnableJpaAuditing 추가

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class StarbucksApplication {

	public static void main(String[] args) {
		SpringApplication.run(StarbucksApplication.class, args);
	}

}

 

2️⃣ 엔티티에 @EntityListeners(AuditingEntityListener.class) 등록

  • 이벤트 클래스에 이벤트 리스너를 등록하는 역할
    • 엔티티 저장 시 (persist)
      1. @PrePersist 이벤트 감지
      2. AuditingEntityListener 가 @CreatedDate 필드에 현재 시간 입력
    • 엔티티 수정 시 (update)
      1. @PreUpdate 이벤트 감지
      2. AuditingEntityListener 가 @LastModifiedDate 필드에 현재 시간 갱신
  • AuditingEntityListener.class
    • Spring Data JPA 에서 제공하는 역할
    • 엔티티가 생성 및 수정될 때, @CreatedDate , @LastModifiedDate 같은 어노테이션이 붙은 필드에 자동으로 현재 시간을 넣어주는 역할

 

3️⃣ 필드에 @CreatedDate , @LastModifiedDate 붙인다.

  • @CreatedDate
    • 엔티티가 처음 저장(persist)될 때 한 번만 작동
    • 해당 필드에 현재 시각을 자동으로 세팅함
    • 이후 수정될 때는 절대 바뀌지 않음
    • 👉 보통 @Column(updatable = false) 로 같이 설정됨.
  • @LastModifiedDate
    • 엔티티가 저장되거나 수정될 때마다 작동
    • 해당 필드에 항상 수정된 시간이 자동으로 기록됨
    • 수정할 때마다 자동 갱신됨

 


[3] @Temporal(TemporalType.TIMESTAMP)

📌 TemporalType 종류

 

❌ TemporalType.DATETIME 은 존재하지 않는다.
대신 그 역할은 TemporalType.TIMESTAMP 가 담당한다.


💡 LocalDate, LocalDateTime 과는 관련없음