JPA

JpaAuditing을 이용해서 base entity 생성하기

Lahezy 2023. 6. 24.
728x90

JPA Auditing

Auditing은 감사, 감시한다는 뜻으로 JPA를 감시한다는 의미입니다.

즉 JPA Auditing은 Java Persistence API(JPA)를 감시하며 엔티티와 관련된 이벤트를 추적하고 기록합니다.

JPA Auditing을 사용하면 엔티티의 생성일(createdDate)과 수정일(lastModifiedDate)을 자동으로 관리하는 기능을 제공하여 개발자가 수정일과 생성일 등을 수동으로 관리하지 않아도 되는 장점이 있습니다.

JPA Auditing 설정 하기

의존성 추가

dependencies {
    // 다른 의존성들...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

추가로 properties 파일에서 spring.data.jpa.repositories.enabled=true를 설정해야 하지만 default가 true 이기 때문에 따로 수정해주지 않아도 됩니다.

config 추가(@EnableJpaAuditing)

방법 1. 매인 애플리케이션에 추가

**@EnableJpaAuditing**
@SpringBootApplication
public class TodoApplication {

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

}

방법 2. 별도로 관리

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

base entity 추가

@Data
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class BaseEntity {
        @Column(name = "created_at", updatable = false)
    @CreatedDate
    private Instant createdAt;

    @Column(name = "updated_at")
    @LastModifiedDate
    private Instant updatedAt;

    private Instant deletedAt; //Instant 부분을 LocalDateTim으로 할 수도 있다.

    //이후에 작성자도 추가(spring security)
}

@Data

Getter, Setter, RequiredArgsConstructor, ToString, EqualsAndHashCode, Value을 제공하는 lombok 라이브러리 어노테이션입니다.

@EntityListeners(AuditingEntityListener.class)

Spring Data JPA에서 제공하는 JPA Auditing 이벤트 리스너입니다.

이 리스너는 엔티티의 저장, 업데이트 등의 이벤트가 발생할 때 해당 이벤트를 처리하여 생성일과 수정일을 자동으로 업데이트합니다.

@MappedSuperclass

JPA에서 엔티티 클래스들 간에 공통으로 사용되는 매핑 정보를 정의하기 위해 사용되는 어노테이션입니다.

이 어노테이션을 사용하면 공통된 매핑 정보를 가진 슈퍼 클래스를 정의하고, 이를 상속받은 서브 클래스들은 해당 매핑 정보를 상속받을 수 있습니다.

엔티티 클래스들 간에 공통으로 사용되는 필드나 매핑 설정을 포함한 추상적인 슈퍼 클래스를 정의할 때 사용됩니다.

하지만 해당 클래스는 직접적으로 인스턴스화되거나 테이블과 매핑되지 않기 때문에, 엔티티로서 독립적으로 사용할 수 없습니다. 즉, @MappedSuperclass 어노테이션을 사용한 클래스는 반드시 서브 클래스를 통해 확장하여 사용되어야 합니다.

@CreatedDate

어노테이션은 Spring Data JPA에서 제공하는 어노테이션으로, JPA Auditing 기능을 활용하여 엔티티가 생성될 때 해당 필드에 생성일을 자동으로 할당하는 역할을 합니다.

@LastModifiedDate

어노테이션은 Spring Data JPA에서 제공하는 어노테이션으로, JPA Auditing 기능을 활용하여 엔티티가 수정될 때 해당 필드에 수정일을 자동으로 할당하는 역할을 합니다.

 

참고로 hibernate에서 제공하는  @CreationTimestamp와 @UpdateTimestamp도 있습니다.

상속

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Entity
public class Todo extends BaseEntity {
    @Id
    @Column(name = "todo_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;
    private String content;

    @Enumerated(EnumType.STRING)
    private Status status;

    public Todo(String content, Status status) {
        this.content = content;
        this.status = status;
    }
}

테스트

생성 테스트

수정 테스트

content 가 test1 → test2로 변경되자 updated_at의 시간이 변경된 것을 확인할 수 있습니다.

추가로 spring security를 이용하여 created_by를 추가할 수도 있습니다.

deleted_at은 soft delte를 위한 칼럼으로 이후에 만약 해당 칼럼이 삭제되면 deleted_at 칼럼을 변경하기 위해 추가하였습니다.

 

References.

JPA Auditing 기능이란?

Auditing with JPA, Hibernate, and Spring Data JPA | Baeldung

Spring Data Commons - Reference Documentation

Spring Data JPA - Reference Documentation

728x90

댓글