Back End/Spring && Spring Boot

[JPA] Entity 생성 시간 자동 기록하기

Im_Hayden 2024. 6. 15. 23:19

프로젝트를 진행하다 보면 엔티티에 생성 시간 또는 마지막 수정 시간에 대한 필드를 넣는 경우가 한번쯤 있을 것이다.
이때 가장 단순한 방법으로는 setter 를 사용해서 직접 시간을 설정해 줄수도 있겠지만, 매번 직접 시간을 설정하자니 영 번거롭다.
JPA에서는 이러한 상황을 위해, 시간을 자동으로 기록해주는 기능을 제공한다.
한번 살펴보자.

01.JPA Auditing 이란?

Auditing은 '감시', '감사'

(thank 말고 다른 감사..)

의 의미를 가지고 있다.
Auditing은 말 그대로 Entity의 생성, 변경 등을 감시하는 기능이다.
JPA에서는 Auditing을 통하여 Entity가 생성되거나 변경되는 시간을 추적하고 기록한다.
그럼 해당 기능을 어떻게 사용하는지 알아보자

02.JPA Auditing 사용하기

✨ Spring Boot Application Class

  • <Project name>Application.java
package com.hayden.limg_diary;

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

@SpringBootApplication
@EnableJpaAuditing
public class LimgDiaryApplication {

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

}

스프링 부트의 매인 메소드가 정의된 Application 클래스에 @EnableJpaAuditing 아노테이션을 추가하자
해당 아노테이션을 설정하면, 스프링부트에서 Auditing을 사용할 수 있다.

✨ Entity 클래스

package com.hayden.limg_diary.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.util.Date;


@Entity
@Getter
@Setter
@EntityListeners(AuditingEntityListener.class)
public class Diary {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int diary_id;

    private String content;

    @CreatedDate
    private Date date;

    private String feeling;

    private String image_path;

    @ManyToOne
    @JoinColumn
    private User user_id;
}
  • @EntityListeners(AuditingEntityListener.class)
    @EntityListeners() 아노테이션을 붙이면, 해당 아노테이션이 붙은 엔티티가 생성, 변경될 때 호출될 이벤트를 등록할 수 있다.
    해당 아노테이션을 이용하여 AuditingEntityListener 클래스를 등록해준다.
  • @CreatedDate
    JPA Auditing은 @CreatedDate 아노테이션이 붙은 필드에 엔티티 생성 시간을 기록한다.
    이와 비슷한 아노테이션으로 @LastModifiedDate이 있다.
    • @LastModifiedDate : 엔티티가 마지막으로 수정된 시간을 기록

실행 결과

위 이미지처럼 DB에 자동으로 엔티티 생성 시간이 기록됨을 볼 수 있다.

03.주의 사항

Auditing 설정을 안하고, @CreatedDate@LastModifiedDate 아노테이션 사용하는 경우가 흔히 있다. 필자도 이런 경험이 있다.

  • 만약 Auditing 설정을 제대로 해주지 않고 위의 아노테이션만 붙인다면, ***해당 필드에는 null값이 삽입될 수도 있다.
  • 이를 방지하기 위해 Application 클래스에 @EnableJpaAuditing 설정 및 엔티티 클래스에 @EntityListeners(AuditingEntityListener.class) 설정꼭!!! 해주어야 한다.