![[JPA] JPA Auditing](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTXGo%2FbtsJyfG4oJC%2FrDDnRdQ9Rk9F1IBZnzhUK1%2Fimg.png)
2024-09-11(수)
스프링 심화 1기 과정을 하고, 팀프로젝트를 하면서 하루하루 새로운 걸 알아가고 무심코 아무생각 없이 사용했던 것들의 의미를 제대로 알아가며 기록하는 중이다.

Timestamped
📌 데이터의 생성(created_at), 수정(modified_at) 시간은 포스팅, 게시글, 댓글 등 다양한 데이터에 매우 자주 활용된다. 각각의 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;
@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;
}
- Spring Data JPA에서는 시간에 대해서 자동으로 값을 넣어주는 기능인 JPA Auditing을 제공하고 있다.
- @MappedSuperclass
- JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createdAt, modifiedAt 처럼 추상 클래스에 선언한 멤버변수를 컬럼으로 인식할 수 있다.
- @EntityListeners(AuditingEntityListener.class)
- 해당 클래스에 Auditing 기능을 포함시켜 준다.
- @CreatedDate
- Entity 객체가 생성되어 저장될 때 시간이 자동으로 저장된다.
- 최초 생성 시간이 저장되고 그 이후에는 수정되면 안되기 때문에 updatable = false 옵션을 추가한다.
- @LastModifiedDate
- 조회한 Entity 객체의 값을 변경할 때 변경된 시간이 자동으로 저장된다.
- 처음 생성 시간이 저장된 이후 변경이 일어날 때마다 해당 변경시간으로 업데이트된다.
- @Temporal
- 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
- DB에는 Date(날짜), Time(시간), Timestamp(날짜와 시간)라는 세 가지 타입이 별도로 존재한다.
- DATE : ex) 2023-01-01
- TIME : ex) 20:21:14
- TIMESTAMP : ex) 2023-01-01 20:22:38.771000
📌 @SpringBootApplication 이 있는 class에 @EnableJpaAuditing 추가
JPA Auditing 기능을 사용하겠다는 정보를 전달해주기 위해 @EnableJpaAuditing 을 추가해야한다.

실제 프로젝트에 JPA Auditing 적용한 사례
1. BaseTimeEntity 생성 (Timestamped) - 프로젝트 기획에 맞게 변형하여 적용
import jakarta.persistence.*;
import lombok.Getter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Timestamp createdAt;
@CreatedBy
@Column(updatable = false, length = 100)
private String createdBy;
@LastModifiedDate
@Column
@Temporal(TemporalType.TIMESTAMP)
private Timestamp updatedAt;
@LastModifiedBy
@Column(length = 100)
private String updatedBy;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Timestamp deletedAt;
@Column(length = 100)
private String deletedBy;
public void setDeleted(Timestamp deletedAt, String deletedBy){
this.deletedAt = deletedAt;
this.deletedBy = deletedBy;
}
}
2. @EnableJpaAuditing 어노테이션을 추가한다.
@EnableJpaAuditing
@EnableFeignClients
@SpringBootApplication
public class HubServiceApplication {
public static void main(String[] args) {
SpringApplication.run(HubServiceApplication.class, args);
}
}
3. 적용하고자 하는 Entity 클래스에서 BaseTimeEntity를 상속받는다

참고
https://ttl-blog.tistory.com/116
[JPA] 필드와 컬럼 매핑 - @Temporal
시작에 앞서 자바 8부터 LocalDate, LocalDateTime을 사용할 수 있습니다. 하이버네이트 최신 버전을 사용한다면, @Temporal 어노태이션을 생략하여도 LocalDate와 LocalDateTime을 사용할 수 있습니다. @Entity publ
ttl-blog.tistory.com
https://lahezy.tistory.com/114
JpaAuditing을 이용해서 base entity 생성하기
JPA Auditing Auditing은 감사, 감시한다는 뜻으로 JPA를 감시한다는 의미입니다. 즉 JPA Auditing은 Java Persistence API(JPA)를 감시하며 엔티티와 관련된 이벤트를 추적하고 기록합니다. JPA Auditing을 사용하면
lahezy.tistory.com
'Programming > SpringBoot' 카테고리의 다른 글
[JPA] Query Methods (1) | 2024.09.11 |
---|
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!