Backend/Spring

[JPA] Auditing

EUNAH.J 2023. 2. 18. 18:27

Auditing

Spring Data JPA는 엔티티 히스토리를 위한 컬럼 값을 자동으로 넣어주는 기능을 제공한다.

audit, 말 그대로 감시하는 기능으로 엔티티를 누가, 언제 생성하고 수정했는지 알 수 있다.

데이터를 수정할 때 마다 LocalDateTime.now() 하지 않아도 된다는 말!

 

 

Application.java 파일에 @EnableJpaAuditing 추가

@EnableJpaAuditing
@SpringBootApplication
public class testApplication {

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

}

애플리케이션 파일에 해당 애노테이션을 꼭 붙여줘야지 auditing 기능이 작동한다.

구현 다 하고 애플리케이션에 애노테이션을 안 붙여줘서 외않되...? 하고 있었음🥲

 

 

필드 공통화 클래스 구현

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
    @CreatedDate
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createAt;

    @LastModifiedDate
    @Column(name = "modified_at")
    private LocalDateTime modifiedAt;
}

@MappedSuperclass

애노테이션이 추가된 클래스는 이 클래스를 상속하는 Entity 클래스의 필드로 간주되어 컬럼 매핑의 대상이 된다.

생성일과 수정일을 기록하고 싶은 Entity 클래스에 위에서 작성한 클래스를 상속하면 자동으로 컬럼이 생기는 이유가 이 애노테이션 덕분이다.

 

@EntityListeners

Entity 클래스에 리스너를 추가할 수 있게 해주는 애노테이션. 여기서는 AuditingEntityListener 를 추가했다.

 

AuditingEntityListener.class

영속성 컨텍스트에 저장된 엔티티의 변경 사항이 flush 되기 전에 엔티티의 생성일시, 수정일시 필드에 값을 추가하는 역할을 한다.

 

@CreateBy 애노테이션을 사용하면 작성자도 기록이 가능한데, 현재 진행중인 프로젝트에 user 부분이 아직 다 완성이 되지 않아 나중에 추가하려고 한다.

 

 

엔티티 상속

@NoArgsConstructor
@Getter
@Setter
@Entity
public class TestEntity extends Auditable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @Column(nullable = false)
    private String title;
}

이렇게 방금 구현한 클래스를 엔티티 클래스에 상속해주면 

h2 console

엔티티에 생성일과 수정일 컬럼을 작성하지 않아도 위와 같이 생성일과 수정일 컬럼이 만들어지고 값도 자동으로 채워준다👍