오늘은 Part2. 게시판 서비스 강의의 `데이터베이스 접근 로직 테스트 정의3` 부분을 학습하였다.
@JPA Auditing
JPA를 사용하여 테이블에 매핑할 때 도메인들이 공통적으로 가지고 있는 필드나 컬럼이 존재한다. 대표적으로 생성일자, 수정일자, 식별자 같은 필드 및 컬럼이 있다.
Audit은 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 된다.
@JPA Auditing 사용 방법
JpaConfig.class 파일 추가
@EnableJpaAuditing
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<String> auditorAware(){
return ()-> Optional.of("sarang682"); // TODO: 스프링 시큐리티로 인증 기능을 붙이게 될 때, 수정하자
}
}
AuditingFields 추출생성자, 생성일자, 수정자, 수정일시는 반복적으로 엔티티 클래스에 들어가는 요소이고, 도메인과 직접 연관이 없는 요소 이므로 추출이 가능하다.@MappedSuperClass 를 사용하여 상속 방식으로 추출하였다.
@ToString
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class AuditingFields {
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE_TIME)
@CreatedDate
@Column(nullable = false, updatable = false) //업데이트 불가 옵션
private LocalDateTime createdAt; // 생성일시
@CreatedBy
@Column(nullable = false, length = 100)
private String createdBy; // 생성자
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE_TIME)
@LastModifiedDate
@Column(nullable = false)
private LocalDateTime modifiedAt; // 수정일시
@LastModifiedBy
@Column(nullable = false)
private String modifiedBy; // 수정자
}
@Entity
public class Article extends AuditingFields {
...
}
@Entity
public class ArticleComment extends AuditingFields {
...
}