JPA에는 엔티티의 생성 정보를 자동으로 기록해주는 @CreatedDate와 @CreatedBy와 같은 어노테이션이 있다. @CreatedDate 어노테이션은 엔티티가 생성된 날짜와 시간을 자동으로 저장하는 데 사용되며, @CreatedBy 어노테이션은 엔티티를 생성한 사용자의 정보를 기록하는 데 사용된다. 이 두 어노테이션의 사용 방법과 그 역할에 대해 알아보자.
@MappedSuperclass
@Getter @Setter @ToString
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedDate
@Column(insertable = false)
private LocalDateTime updatedAt;
@LastModifiedBy
@Column(insertable = false)
private String updatedBy;
}
위 코드는 JPA에서 자식 클래스들에 모두 적용할 컬럼을 지정하는 슈퍼 클래스의 예시이다.
모든 자식 클래스들에 생성일, 생성자, 최종수정일, 최종수정자를 컬럼으로 갖게 하여 DB와 매핑시킬 의도를 가지고 있다.
@Component("auditAwareImpl")
public class AuditAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("AUDITOR");
}
}
AuditorAware를 구현한 클래스인 AuditAwareImpl을 작성한다.
AuditAwareImpl에는 @Component로써 auditAwareImpl이름을 붙여두고(추후 메인 클래스에서 지정하기 위함),
getCurrentAuditor()메서드에서는 감사자(auditor)로 들어갈 값을 지정해주면 된다.
예시 코드의 경우, @CreatedBy가 지정된 컬럼에는 "AUDITOR"가 들어갈 것이다.
예시코드에서 보았듯, BaseEntity에 @EntityListeners(AuditingEntityListener.class)어노테이션을 추가해준다.
이를 통해 해당 어노테이션에서 Auditing 기능이 제대로 동작하여 원하는 컬럼에 값을 자동으로 지정해줄 것이다.
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditAwareImpl")
public class AccountsApplication {
public static void main(String[] args) {
SpringApplication.run(AccountsApplication.class, args);
}
}
Auditing 기능을 사용하기 위해서는 메인 클래스에서 @EnableJpaAuditing 어노테이션이 필요하다. auditorAwareRef에는 아까 작성한 auditAwareImpl를 넣어준다.
이를 통해 감사자 정보를 엔티티에 전달해줄 수 있게 된다.
💡Auditor를 전달하기 위해서는 위 1,2,3 과정이 전부 필요하며, 시간을 전달하기 위함이라면 2 과정만 해도 상관 없다.
@CreatedDate와@CreatedBy는 다르게 동작하기 때문이다.
@CreatedDate:DateTimeProvider를 통해 날짜와 시간을 설정하며,DateTimeProvider는 사용자 정의가 가능하다.
@CreatedBy:AuditorAware인터페이스를 통해 현재 감사자를 설정하며,AuditorAware구현체를 통해 이 또한 사용자 정의할 수 있다.
@LastModifiedDate와 @LastModifiedBy도 동일하게 동작한다.