지금까지 직접 EntityListener를 작성했지만 사실 자주 사용 되는 기능들을 이미 스프링에서 구현해놓은 EntityListner가 있다 .
바로 AuditingEntityListener 이다 .
AuditingEntityListener을 사용하기 위해선 어플리케이션 구동 클래스에 @EnableJpaAuditing을 달아줘야 한다 .
@SpringBootApplication
@EnableJpaAuditing
public class JpaTestApplication {
public static void main(String[] args) {
SpringApplication.run(JpaTestApplication.class, args);
}
}
엔티티에서 @EntityListener( value = AuditingEntityListener.class) 를 지정하면 사용할 수 있다 .
어노테이션으로 @CreatedBy(작성자) , @CreatedDate(작성일) @LastModifiedDate(수정일) @LastModifiedBy(수정자)
을 자동으로 넣어 주는 기능을 제공한다 .
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Book implements Auditable2 {
@Id @GeneratedValue
private Long id;
private String name;
private String author;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
아예 필드자체를 빼서 BaseEntity를 만들어서 상속 받게할 수 도 있다 .
package com.ugo.jpatest.domain;
import com.ugo.jpatest.domain.entitylistener.Auditable2;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@EntityListeners(value = {AuditingEntityListener.class})
//해당 클래스를 상속받는 엔티티에서 해당클래스의 필드를 컬럼으로 사용가능
@MappedSuperclass
@Data
public class BaseEntity implements Auditable2 {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
생성 시간과 수정시간을 저장하는 엔티티이다 해당 필드는 모든 엔티티에 적용될 것이기 때문에 다른 클래스에서 상속받아서 사용하는 BaseEntity 가 된다 baseEntity 임을 알리기 위해선
@MappedSuperClass를 붙혀줘야한다 . 해당 클래스를 상속받는 엔티티에서 해당 클래스 필드를 컬럼으로 사용하게 한다
BaseEntity에 AuditingEntityListener를 지정하면 . BaseEntity를 상속받는 곳에서는 AuditingEntityListener를 지정할 필요가 없다 .
@ToString과 @equalsAndHashcode를 callsuper=true로 지정해줘야 부모클래스의 정보까지 출력이 가능하다.
package com.ugo.jpatest.domain;
import lombok.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
//BaseEntity가 상위 클래스이기 때문에 상위크래스의 ToString 과 EqualsAndHashCode 를 사용해야
//출력이 잘 된다.
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Book extends BaseEntity{
@Id @GeneratedValue
private Long id;
private String name;
private String author;
}
이전에 만들었던 Book 엔티티를 사용해서 예시를 들어 보겠다 .
BaseEntity를 상속받았기 때문에 updateAt과 createdAt가 필요 없어졌다 .
테스트를 작성해서 book 엔티티를 사용해 보자
@Test
void bookTest(){
Book book = new Book();
book.setName("ugobook");
book.setAuthor("ugo");
bookRepository.save(book);
Book book1 = bookRepository.findById(1L).orElseThrow(RuntimeException::new);
System.out.println(book1);
book1.setName("고냥이");
bookRepository.save(book1);
Book updatedBook = bookRepository.findById(1L).orElseThrow(RuntimeException::new);
System.out.println("updatedBook.getUpdatedAt() = " + updatedBook.getUpdatedAt());
assertNotEquals(book1.getUpdatedAt(),updatedBook.getUpdatedAt());
}
결과
잘 찍혔다.
'JPA > Spring data JPA' 카테고리의 다른 글
SPRING DATA JPA 공부 5 - EntityListener 활용 (0) | 2021.05.29 |
---|---|
SPRING DATA JPA 공부 4 - Query Method 활용 2 ( 정렬과 페이징) (1) | 2021.05.28 |
SPRING DATA JPA 공부 3 - QueryMethod 활용 (0) | 2021.05.27 |
SPRING DATA JPA 공부 2- JPA 메서드 살펴보기 (0) | 2021.05.27 |
SPRING DATA JPA 공부 1 - JPA 란? (0) | 2021.05.27 |