Backend/JPA

[JPA] @EntityListeners

킴준현 2024. 9. 4. 12:29

EntityListeners?

Entity가 삽입, 삭제, 수정, 조회 등의 작업을 할 때 전, 후에 작업을 하기 위한 어노테이션

 

  • @PrePersist
    Persist(Insert) 메서드가 호출되기 전에 실행되는 메서드
  • @PreUpdate
    Merge(Update) 메서드가 호출되기 전에 실행되는 메서드
  • @PreRemove
    Remove(Delete) 메서드가 호출되기 전에 실행되는 메서드
  • @PostPersist
    Persist(Insert) 메서드가 호출된 후에 실행되는 메서드
  • @PostUpdate
    Merge(Update) 메서드가 호출된 후에 실행되는 메서드
  • @PostRemove
    Remove(Delete) 메서드가 호출된 후에 실행되는 메서드
  • @PostLoad
    Select 조회가 실행된 직후에 실행되는 메서드

Example

데이터가 삽입되기 전, 수정되기 전 createdAt과 updatedAt 시간을 조작해야한다.

 

- SampleApplication.java

@SpringBootApplication
@EnableJpaAuditing
public class SampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
}

@EnableJpaAuditing
Spring Data JPA에서 제공하는 Auditing 기능을 제공하기 위해, 엔티티에 변경시점 감지를 위한 어노테이션을 붙여준다.

 

- TimeStamp.java

@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)  // AuditingEntityListener.class를 EntityListners로 등록
@Slf4j
public abstract class BaseEntity {

  @CreatedDate
  @Column(updatable = false)
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime createdAt;

  @CreatedBy
  @Column(updatable = false)
  private Long createdBy;

  @LastModifiedDate
  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime updatedAt;

  @LastModifiedBy
  @Column(updatable = false)
  private Long updatedBy;

  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime deletedAt;

  @Column(updatable = false)
  private Long deletedBy;
  
	...
  
  }

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)

abstract

  • 생성시작과, 수정시각은 대부분의 엔티티에서 사용되는 필드이다.
    따라서 이를 별개의 엔티티 클래스로 분리하고, 다른 엔티티에서 extends로 상속받아 사용하면 중복 코드를 줄일 수 있다.
  • AuditingEntityListener 는 Spring Data JPA에서 제공하는 이벤트 리스너이다.

 

  • 추상클래스(abstract)와 @MappedSuperClass를 함께 사용할 경우, 이러한 이점이 있다.
    • 강제 상속
      • 추상 클래스는 인스턴스를 직접 생성할 수 없기 때문에, 자식 클래스가 반드시 상속받아야 한다.
      • 이를 통해 코드 구조를 명확하게 유지할 수 있다.
    • 공통 기능 구현
      • 추상 클래스는 공통적인 필드나 메서드를 구현하고, 자식 클래스에 해당 기능을 제공한다.
    • 객체-관계 매핑에서 활용
      • @MappedSuperclass를 추상 클래스와 함께 사용하면, 공통적인 매핑 정보(예: createdAt, updatedAt)를 여러 엔티티에 쉽게 적용할 수 있다.

참고

https://juoonge.notion.site/EntityListeners-a6974cbd8e7c494b8cae520b033db60b

 

@EntityListeners | Notion

EntityListeners?

juoonge.notion.site

https://velog.io/@seongwon97/Spring-Boot-Entity-Listener

 

[Spring JPA] Entity Listener

Entity Listener는 엔티티의 변화를 감지하고 데이블의 데이터를 조작하는 일을 한다.

velog.io