EntityListeners란 무엇일까?
오늘은 JPA(EntityListeners)에 대해 알아볼까 한다. EntityListeners는 엔티티의 생명주기 이벤트를 처리하기 위해 사용하는 기능이다. 이 기능을 사용하면 엔티티가 생성되거나 업데이트될 때 특정 로직을 실행할 수 있다.
EntityListeners의 기본 개념
EntityListeners는 엔티티 클래스에 리스너를 등록해서 엔티티의 상태 변화에 따라 특정 메서드를 호출하는 방식으로 동작한다. 예를 들어, 엔티티가 저장되기 전에, 저장된 후에, 삭제되기 전에, 삭제된 후에 등 다양한 시점에 원하는 작업을 수행할 수 있다.
주요 애노테이션
- @EntityListeners: 엔티티 클래스에 리스너 클래스를 지정할 때 사용
- @PrePersist: 엔티티가 저장되기 전에 호출
- @PostPersist: 엔티티가 저장된 후에 호출
- @PreUpdate: 엔티티가 업데이트되기 전에 호출
- @PostUpdate: 엔티티가 업데이트된 후에 호출
- @PreRemove: 엔티티가 삭제되기 전에 호출
- @PostRemove: 엔티티가 삭제된 후에 호출
- @PostLoad: 엔티티가 로드된 후에 호출
예제
그럼 간단한 예제를 통해서 EntityListeners를 어떻게 사용하는지 알아보자. 먼저, User 엔티티 클래스를 만들어보자.
@Entity
@EntityListeners(UserEntityListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
리스너 클래스
이제 UserEntityListener 클래스를 만들어보자. 이 클래스에서 User 엔티티의 생명주기 이벤트를 처리
public class UserEntityListener {
@PrePersist
public void prePersist(User user) {
System.out.println("Before saving user: " + user.getName());
}
@PostPersist
public void postPersist(User user) {
System.out.println("After saving user: " + user.getName());
}
@PreUpdate
public void preUpdate(User user) {
System.out.println("Before updating user: " + user.getName());
}
@PostUpdate
public void postUpdate(User user) {
System.out.println("After updating user: " + user.getName());
}
@PreRemove
public void preRemove(User user) {
System.out.println("Before deleting user: " + user.getName());
}
@PostRemove
public void postRemove(User user) {
System.out.println("After deleting user: " + user.getName());
}
@PostLoad
public void postLoad(User user) {
System.out.println("After loading user: " + user.getName());
}
}
마무리
이렇게 EntityListeners를 사용하면 엔티티의 생명주기 이벤트에 맞춰 다양한 로직을 추가할 수 있다. 특히 로깅, 감사 기능, 데이터 검증 등 여러 상황에서 유용하게 사용할 수 있다. 한번 직접 구현해보고 다양한 상황에 맞게 활용해보자!
'JPA' 카테고리의 다른 글
JPA - @DynamicUpdate (0) | 2024.07.17 |
---|---|
JPA - Spring Data JPA에서 엔티티의 생성 시간과 수정 시간을 자동으로 관리하기 (0) | 2024.07.17 |
JPA - @NoArgsConstructor & @AllArgsConstructor 개념 및 사용법 (0) | 2024.05.16 |
@Builder (1) | 2024.01.04 |
@GeneratedValue (2) | 2023.11.21 |
댓글