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;
}
이렇게 방금 구현한 클래스를 엔티티 클래스에 상속해주면
엔티티에 생성일과 수정일 컬럼을 작성하지 않아도 위와 같이 생성일과 수정일 컬럼이 만들어지고 값도 자동으로 채워준다👍