package org.example.expert.domain.common.entity;
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;
import java.time.temporal.ChronoUnit;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
@CreatedDate
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime createdAt;
@LastModifiedDate
@Column
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime modifiedAt;
@PrePersist
public void onPrePersist() {
this.createdAt = createdAt.truncatedTo(ChronoUnit.MINUTES);
this.modifiedAt = modifiedAt.truncatedTo(ChronoUnit.MINUTES);
}
@PreUpdate
public void onPreUpdate() {
this.modifiedAt = modifiedAt.truncatedTo(ChronoUnit.MINUTES);
}
}

@PrePersist와 @PreUpdate는 JPA(EntityManager)에서 제공하는 콜백 메서드로, 엔티티가 영속성 컨텍스트에 추가되거나 업데이트되기 전에 특정 동작을 수행할 수 있게 합니다.
이 어노테이션들을 사용하면 엔티티가 저장되거나 업데이트되기 전에 수행해야 하는 로직을 정의할 수 있습니다.
1. @PrePersist
- 엔티티가 처음으로 영속성 컨텍스트에 추가되기 전에 실행됩니다. 즉, 엔티티가 데이터베이스에 처음 저장되기 전에 호출됩니다.
- 이 어노테이션을 사용하여 엔티티가 처음 저장되기 전에 설정해야 할 초기값이나 다른 처리를 수행할 수 있습니다.
2. @PreUpdate:
- 엔티티가 영속성 컨텍스트에서 업데이트되기 전에 실행됩니다. 즉, 엔티티의 데이터가 변경되어 데이터베이스에 저장되기 전에 호출됩니다.
- 이 어노테이션을 사용하여 엔티티가 업데이트되기 전에 수행해야 할 로직을 정의할 수 있습니다.
ChronoUnit.MINUTES 대신 ChronoUnit.SECONDS를 사용했다면 초까지만 저장이 된다.
'spring' 카테고리의 다른 글
| @MappedSuperclass와 @AttributeOverrides, @AttributeOverride (0) | 2025.03.14 |
|---|---|
| @WebMvcTest IllegalArgumentException: JPA metamodel must not be empty 오류 뜰때 (0) | 2025.03.06 |
| swagger 사용시 유용함. @Tag, @Operation (0) | 2025.03.06 |
| 테스트 코드 (0) | 2025.03.06 |
| 페이징처리할때 수동으로 처리하면서 공부한 내용 (0) | 2025.03.05 |