JPA Auditing 생성/수정시간 자동화 🍥

jiji·2023년 11월 13일
0

Spring Boot Project 🌱

목록 보기
9/16

Auditing?

Audit은 사전적 의미로 감사하다, 심사하다 등의 의미를 가지고 있다.
엔티티가 생성되고, 변경되는 그 시점을 감지하여 생성시각, 수정시각, 생성한 사람, 수정한 사람을 기록할 수 있다.

👩🏻‍💻 코드로 이해하기

1. @EnableJpaAuditing

  1. Application 클래스에서 @EnableJpaAuditing 어노테이션을 사용하여, Auditing을 활성화 한다. (또는 @Configuration 어노테이션이 사용된 클래스)
@SpringBootApplication
@EnableJpaAuditing
public class SampleApplication {

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

2. Entity 코드 작성

기존 코드에 사용

@EntityListeners(AuditingEntityListener.class)
@Entity
public class Post {

    ...

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;

    ...
}

BaseEntity 분리해서 사용

생성시각과 수정시각은 대부분의 엔티티에서 사용된다. 이를 BaseEntity로 분리하여 다른 엔티티들이 상속 받아 사용하도록 하자!

1. 
public class Post extends BaseEntity { //상속

2.
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
  @CreatedDate
  @Column(updatable = false)
  private LocalDateTime createdAt;

  @LastModifiedDate
  private LocalDateTime updatedAt;
}

@EntityListeners

@EntityListeners(AuditingEntityListener.class)

우선 Auditing을 적용할 엔티티 클래스에 @EntityListeners 어노테이션을 적용해야한다. 해당 어노테이션은 엔티티의 변화를 감지하여 엔티티와 매핑된 테이블의 데이터를 조작한다.

이 어노테이션의 파라미터에 이벤트 리스너를 넣어줘야하는데, 여기에 AuditingEntityListener.class를 넣어준다. 이 클래스는 Spring Data JPA에서 제공하는 이벤트 리스너로 엔티티의 영속, 수정 이벤트를 감지하는 역할을 한다.

@CreateDate

생성일을 기록하기 위해 LocalDateTime 타입의 필드에 @CreateDate 를 적용한다. 또한 생성일자는 수정되어서는 안되므로 @Column(updatable = false) 를 적용한다. 이렇게 적용하면, 엔티티가 생성됨을 감지하고 그 시점을 createdAt 필드에 기록한다.

@LastModifiedDate

수정일을 기록하기 위해 LocalDateTime 타입의 필드에 @LastModifiedDate 를 적용한다. 이렇게 적용하면, 엔티티가 수정됨을 감지하고 그 시점을 updatedAt 필드에 기록한다.

@MappedSuperclass

  • 객체의 입장에서 공통 매핑 정보가 필요할 때 사용한다.
  • 상속 관계 매핑이 아니다.
  • 엔티티가 아니기 때문에, 테이블과도 매핑이 되지 않는다.
    단순히 부모 클래스를 상속받는 자식클래스에 매핑 정보만을 제공한다.
  • 부모 타입으로는 조회가 불가능하다.
  • 직접 생성해서 사용할 일이 없기 때문에 추상 클래스로 만드는 것을 권장한다.
  • JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스만 상속할 수 있다.

0개의 댓글