Spring/Spring JPA

[JPA] EntityListener 간단하게

개발자잡 2024. 11. 16. 02:25

EntityListener는 JPA에서 엔티티의 생명 주기에 따라 특정 이벤트가 발생했을 때 콜백 메서드를 실행할 수 있도록 돕는 기능입니다. 즉, 엔티티의 상태가 변할 때 미리 정의된 특정 작업(예: 데이터 생성/변경 시 타임스탬프 업데이트 등)을 수행할 수 있게 해줍니다.

주요 기능과 사용 예시

1. 주요 이벤트 종류

  • @PrePersist: 엔티티가 영속화되기 전에 호출됩니다. (예: 엔티티가 EntityManager.persist() 메서드로 저장되기 직전)
  • @PostPersist: 엔티티가 영속화된 후에 호출됩니다.
  • @PreUpdate: 엔티티가 업데이트되기 전에 호출됩니다.
  • @PostUpdate: 엔티티가 업데이트된 후에 호출됩니다.
  • @PreRemove: 엔티티가 삭제되기 전에 호출됩니다.
  • @PostRemove: 엔티티가 삭제된 후에 호출됩니다.
  • @PostLoad: 엔티티가 로드된 후에 호출됩니다.

2. 사용 방법

EntityListener는 주로 아래와 같이 특정 엔티티 클래스에 설정하여 사용하거나, 별도의 리스너 클래스를 정의하여 사용할 수 있습니다.

예시 1: 엔티티 클래스 내에서 직접 리스너 사용

@Entity
@EntityListeners(AuditListener.class)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @PrePersist
    public void beforeSave() {
        System.out.println("User is about to be persisted!");
    }

    @PostPersist
    public void afterSave() {
        System.out.println("User has been persisted!");
    }
}

예시 2: 별도의 리스너 클래스 정의

public class AuditListener {

    @PrePersist
    public void prePersist(Object object) {
        System.out.println(object + " is about to be persisted!");
    }

    @PreUpdate
    public void preUpdate(Object object) {
        System.out.println(object + " is about to be updated!");
    }
}

@Entity
@EntityListeners(AuditListener.class)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

3. 활용 사례

  • 생성일, 수정일 관리: @PrePersist와 @PreUpdate를 사용하여 생성일자와 수정일자를 자동으로 설정.
  • 감사 로깅: 데이터의 변동 사항을 기록하거나 특정 조건에 따라 알림을 보낼 때 활용.
  • 데이터 검증: 데이터가 영속화되거나 업데이트되기 전에 특정 조건을 확인하는 작업에 사용.

EntityListener는 이러한 엔티티 라이프사이클 이벤트를 통해 데이터의 상태 변화를 쉽게 관리할 수 있도록 해주며, 데이터 무결성을 보장하거나 특정 로직을 추가하고자 할 때 매우 유용합니다.