[Fast Campus] 한번에 끝내는 Java/Spring : Entity Listener

Player-Geun·2022년 2월 19일
0

✨ Entity Listener 의 활용 (1)

Listener

이벤트를 관찰하고 있다가 이벤트가 발생하면 특정 동작을 실행

Event

  • JPA에서는 7가지의 Event를 제공
  • @PrePerist, @PostPersist : insert 메서드가 실행되기 전, 실행된 후
  • @PreUpdate, @PostUpdate : merge 메서드가 실행되기 전, 실행된 후
  • @PreRemove, @PostRemove : delete 메서드가 실행되기 전, 실행된 후
  • @PostLoad : select 조회가 실행된 직후
    💥 LocalDateTime과 같이 데이터 등록/수정 시간을 설정할때 용이

👉 대부분의 Entity에서 사용 (중복 발생)

  • 이때 Event Listener 활용 - 반복적인 코딩 감소
    @EntityListeners(value = MyEntityListener.class)

✨ Entity Listener 의 활용 (2)

데이터 백업

  • Entity가 update 되면 기존의 데이터를 백업하는 용도로도 사용됨
  • 이때 Entity Listener은 bean을 주입받을 수 없음 -> spring bean을 가져올 수 있는 특별한 클래스 필요
@Component
public class BeanUtils implements ApplicationContextAware {
//
    private static ApplicationContext applicationContext;
    //
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeanException {
        BeanUtils.applicationContext = applicationContext;
    }
    //
    public static <T>T getBean(Class<T> clazz) {
    	return applicationContext.getBean(clazz);
    }
}

기본 Listener

  • JPA에서는 위의 기능을 기본적으로 제공
  • @EnableJpaAuditing : main에 붙여줌
  • @EntityListeners(value = {AuditingEntityListener.class}) : Entity에 붙여줌
  • @CreatedDate, @LastModifiedDate : Auditing할 데이터에 붙여줌

@MappedSuperclass

  • 해당 클래스를 상속받는 Entity에서 해당 클래스의 속성들을 Entity의 컬럼으로 포함시키겠다는 의미
@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity {
	@CreatedDate
    private LocalDataTime createdAt;
    //
    @LastModifiedDate
    private LocalDateTime updatedAt;
}

👉 BaseEntity를 상속받는 Entity 클래스에 createdAt 과 updatedAt 을 테이블의 컬럼으로 추가

callsuper = true

  • 상속받은 클래스의 정보를 처리해주기 위해 재정의를 할때 사용됨
@ToString(callsuper = true)
@EqualsAndHashCode(callsuper = true)

📝 마치며

데이터의 생성 정보와 수정 정보에 대한 시간을 기록하는 다양한 방법을 학습했다. 제일 자주 사용하는 기본 제공 Auditing을 숙달해야겠다.

profile
주니어 개발자

0개의 댓글