EntityListener 어노테이션
@EntityListener
- EntityListener는 엔티티의 변화를 감지하고 테이블의 데이터를 조작하는 일을 한다
Column 값이 수정되는 것에 대해서 반복적인 코드를 일일이 작성하면 실수가 발생할 수 있기 때문에 EntityListener를 사용하면 좋다
- JPA에서는 아래의 7가지 Event를 제공한다
- @PrePersist : Persist(insert) 메서드가 호출되기 전에 실행되는 메서드
- @PreUpdate : merge 메서드가 호출되기 전에 실행되는 메서드
- @PreRemove : Delete 메서드가 호출되기 전에 실행되는 메서드
- @PostPersist : Persist 메서드가 호출된 이후에 실행되는 메서드
- @PostUpdate : merge 메서드가 호출된 이후에 실행되는 메서드
- @PostRemove : Delete 메서드가 호출된 이후에 실행되는 메서드
- @PostLoad : Select 조회가 일어난 직후에 실행되는 메서드
- 사용 예제
1
2
3
4
5
6
7
8
9
10
@PrePersist
public void prePersist(){
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}
@PreUpdate
public void preUpdate(){
this.updatedAt = LocalDateTime.now();
}
- 위와 같이 데이터가 업데이트, 생성되는 시간을 기록하는 속성의 경우는 거의 모든 Entity table에 대해서 적용될 것이다.
- 이러한 메소드를 매번 반복되게 추가하는 것을 비효율적이다.
- @EntityListeners를 사용한 클래스를 만들고 반복되는 메소드들을 모아놓자
- 그 후 Listener class를 호출하여 사용하면 코드의 가독성이 증가하고 코드의 중복도 크게 줄일 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MyEntityListener {
// 객체 내에서 만드는 Event가 아니므로 객체애 대한 정보가 없다.
// Object를 parameter로 받고 Auditable instance인지 확인해야 한다
// Auditable은 EventListener를 구현하기 위해 반복되어 사용될 메소드들을 묶어 직접 생성한 interface 이다
@PrePersist
public void prePersist(Object o){
if(o instanceof Auditable){
((Auditable) o).setCreatedAt(LocalDateTime.now());
((Auditable) o).setUpdatedAt(LocalDateTime.now());
}
}
@PreUpdate
public void prePersist(Object o){
if(o instanceof Auditable){
((Auditable) o).setUpdatedAt(LocalDateTime.now());
}
}
}
- 해당 MyEntityListener를 Entity 객체에 적용하는 방법은 class 위에 @EntityListeners(value = MyEntityListener.class) 를 추가해주면 된다.
AuditingEntityListener.class
- 위의 예제로 다뤘던 데이터가 업데이트, 생성됨에 따라 createdAt, updatedAt를 업데이트 하는 것은 대부분의 DB에서 사용하게 된다.
- 그래서 JPA는 이러한 기능을 기본적으로 제공하고 있다.
- 이것이 AuditingEntityListener.class 이다
- 사용법
- AuditingEntityListener.class를 사용하기 위해서는 ~Application.java 파일에 @EnableJpaAuditing 를 추가해주어야 한다
- Entity로 사용할 객체의 @EntityListeners 의 value 값에 AuditingEntityListener.class를 넣어준다. @EntityListeners(AuditingEntityListener.class)
- Auditing에서 데이터가 생성될 때 업데이트 해주길 바라는 변수에 @CreatedDate를 붙인다
- Auditing에서 데이터가 업데이트 될 때, 업데이트 해주길 바라는 변수에 @LastModifiedDate를 붙인다
- 그 외에 @CreatedBy, @LastModifiedBy도 존재한다.