JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit
은 감시하다
, 감사하다
라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다.
도메인을 영속성 컨텍스트에 save하거나 조회를 수행한 후에 update를 하는 경우,
매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 audit된 클래스 안의 필드(시간 데이터)들이 데이터베이스의 테이블의 필드로 등록되어 넣어지게 됩니다.
1) BaseTimeEntity 생성
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(name = "created_at", updatable = false, columnDefinition = "TIMESTAMP")
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at", columnDefinition = "TIMESTAMP")
private LocalDateTime modifiedAt;
// @EnableJpaAuditing 없이 사용할려면...
// @PrePersist
// public void prePersist() {
// createdAt = LocalDateTime.now();
// }
//
// @PreUpdate
// public void preUpdate() {
// modifiedAt = LocalDateTime.now();
// }
}
2) BaseEntity 추가
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends BaseTimeEntity {
@CreatedBy
@Column(name = "created_by", updatable = false)
private String createdBy;
@LastModifiedBy
@Column(name = "updated_by")
private String updatedBy;
}
2) 각 엔티티에 extends BaseEntity
추가
Board(BaseEntity 상속할 엔티티 클래스)
public class Board extends BaseEntity {
...
}
3) @EnableJpaAuditing
추가
SpringbootBoardExampleApplication
@SpringBootApplication
@EnableJpaAuditing
public class SpringbootBoardExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbotBoardExampleApplication.class, args);
}
}
💥그러나 main문으로 넣어서 추가하면 향후 Mock 테스트할 때 오류가 날 수있습니다. 참고 : https://velog.io/@mooh2jj/JUnit-테스트-에러-JPA-metamodel-must-not-be-empty
그래서 별도의 @Configuration 자바 파일 분리
해서 @EnableJpaAuditing
을 추가하는 것이 좋습니다!
JpaConfig.java
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}
auditor 설정시
✅이건 인증 설정시 추가하는 설정입니다.
@Configuration
@EnableJpaAuditing
public class JpaConfig {
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.of("uno"); // TODO: 스프링 시큐리티로 인증 기능을 붙이게 될 때, 수정하자.
}
}