본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/Spring data JPA

SPRING DATA JPA 공부 7 - AuditingEntityListener 사용

반응형

지금까지 직접 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());


    }

 

 

결과

 

 

잘 찍혔다.

반응형