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)
- @PrePersist 이벤트 감지
- AuditingEntityListener 가 @CreatedDate 필드에 현재 시간 입력
- 엔티티 수정 시 (update)
- @PreUpdate 이벤트 감지
- AuditingEntityListener 가 @LastModifiedDate 필드에 현재 시간 갱신
- 엔티티 저장 시 (persist)
- 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 과는 관련없음