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