mingg IT

[Spring] EntityListeners 사용하기 본문

BackEnd

[Spring] EntityListeners 사용하기

mingg123 2021. 8. 10. 10:41

this.updatedAt = LocalDateTime.now() 와 같이 많이 DTO에서 많이 사용하는 부분을

 

EntityListeners를 사용하여 반복된 코딩을 하지 않을 수 있다.

 

MyEntityListner.java

package com.jps.bookmanager.domain;

import java.time.LocalDateTime;

import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;

public class MyEntityListner {
    @PrePersist
    public void prePersist(Object o) {
        if(o instanceof Auditable) {
            ((Auditable) o).setCreatedAt(LocalDateTime.now());
            ((Auditable) o).setUpdatedAt(LocalDateTime.now());
        }
    }

    @PreUpdate
    public void preUpdate(Object o) {
         if(o instanceof Auditable) {
            ((Auditable) o).setCreatedAt(LocalDateTime.now());
            ((Auditable) o).setUpdatedAt(LocalDateTime.now());
        }
    }
}

 

setCreatedAt(), setUpdatedAt()을 함수를 사용하기 위해 interface 를 하나 만든다.

 

Auditable.java

package com.jps.bookmanager.domain;

import java.time.LocalDateTime;

public interface Auditable {
    LocalDateTime getCreatedAt();
    LocalDateTime getUpdatedAt();

    void setCreatedAt(LocalDateTime createdAt);
    void setUpdatedAt(LocalDateTime updateAt);
}

 

 

 

Book.java

package com.jps.bookmanager.domain;

import java.time.LocalDateTime;

import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;

import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
@Data
@EntityListeners(value = MyEntityListner.class)
public class Book implements Auditable{
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String author;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;

    // @PrePersist
    // public void perPersist(){
    //     this.createdAt = LocalDateTime.now();
    //     this.updatedAt = LocalDateTime.now();
    // }

    // @PreUpdate
    // public void preUpdate() {
    //     this.updatedAt = LocalDateTime.now();
    // }
}

@EntityListeners(value = MyEntityListner.class를 사용한다.

 

 

BookRepositoryTests.java

package com.jps.bookmanager.repository;

import com.jps.bookmanager.domain.Book;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookRepositoryTests {
    @Autowired
    private BookRepository bookRepository;

    @Test
    void bookTest() {
        Book book = new Book();
        book.setName("jpa 패키지");
        book.setAuthor("저자");

        bookRepository.save(book);

        System.out.println(bookRepository.findAll());
    }
}

결과를 확인해보면 

 

맞게 들어간 것을 확인할 수 있다. 

@EntityListeners(value = MyEntityListner.class)  부분을 주석처리를 하게 되면  createdAt, updateAt이 null 로 들어간다.

 

지금은 하나의 DTO로 테스트 했지만 여러 DTO간에 공통된 부분을 묶어서 EntityListener를 사용하면 중복된 코딩을 막을 수 있다. 

 

Comments