[Spring data JPA] Auditing (AuditingEntityListener)
1. Jpa Auditing 이란?
Auditing이란?
Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때, 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재한다. 대표적으로 생성일자, 수정일자, 식별자 같은 필드 및 컬럼들.. 그런데 이것들이 도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 말이다. 이 중복으로 인한 번거로움을 해소해주기 위해 spring data JPA는 Auditing이라는 기능을 제공한다.
Audit는 감독하고 검사하다는 뜻으로, 해당 데이터를 보고 있다가 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 편리한 기능이다.
도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후 update를 하는 경우, 매번 시간 데이터를 입력하여 주어야 하는데 audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어줄 수 있다.
2. 사용 예제
(1) grade 의존성 추가
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.projectlombok:lombok')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
}
(2) BaseEntity.java 클래스 추가
@MappedSuperclass
@EntityListeners(value = { AuditingEntityListener.class })
@Getter
public class BaseEntity {
@CreatedDate
@Column(name = "regdate", updatable = false)
private LocalDateTime regDate;
@LastModifiedDate
@Column(name ="moddate")
private LocalDateTime modDate;
}
@MappedSuperclass :
JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createDate, modifiedDate를 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class :
해당 클래스에 Auditing 기능을 포함
@CreatedDate : Entity가 생성되어 저장될 때 시간이 자동 저장
@LastModifiedDate : 조회한 Entity의 값을 변경할 때 시간이 자동 저장
(3) BaseEntity 클래스 상속
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Note extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long num;
private String title;
private String content;
private Member writer;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = writer;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
(4) JPA Auditing 활성화 (EnableJpaAuditing)
Spring Data JPA 에서 JPA 를 사용하기 위해서는 SpringBoot 설정 클래스에 @EnableJpaAuditing 을 적어줘야한다.
@SpringBootApplication
@EnableJpaAuditing
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
Note 클래스가 @MappedSuperclass가 적용된 BaseTimeEntity 추상 클래스를 상속하기 때문에 JPA가 생성일자, 수정일자 컬럼을 인식하게 된다. 그리고 영속성 컨텍스트에 저장 후, BaseTimeEntity 클래스의 Auditing 기능으로 인해 트랜잭션 커밋 시점에 플러시가 호출할 때 하이버네이트가 자동으로 시간 값을 채워주는것을 확인 할 수 있다.. 이 실행 클래스에 @EnableJpaAuditing 어노테이션을 적용해 JPA Auditing을 활성화 하지 않으면 에러!가 난다.