Listener의 활용

Lumi·2021년 7월 21일
0

JPA

목록 보기
6/11
post-thumbnail

Entity Listener
-> 일종의 event가 발생을 하면 특정 동작을 실행하는것

JPA에서 제공하는 이벤트는 7가지가 있다
@PrePersist
@PreUpdate
@PreRemove

@PostPersist
@PostUpdate
@PostRemove
@PostLoad
이벤트는 메서드에 사용이 되어야 한다

pre 어노테이션은 말그대로 동작하기 전에 사용되며
post 어노테이션은 동작 후에 사용이 된다.

뒤에 붙은 수식어구(Persist, update 등등)은 의미 그대로 사용된다.

예를들면 Persist 는 insert에 관할떄
-> 새로운 값이 들어올떄

PostLoad는 DB에서 변수들을 확인한 후에
-> 작동할떄마다 변수들은 확인하기 떄문에
계속해서 사용된다.

Update는 기존값에서 값이 변경된 값이 들어올떄 사용된다.

일반적으로는 prePersist, PreUpdate가 가장 많이 사용된다.

주로 고정적으로 값을 받아야 할떄에 사용된다.
예를들면 A,B,C,D중 C.D는 계속해서 값을 고정적으로 이용해야할떄
PrePersist를 사용하면 된다.
PreUpdate또한 Update 과정중에 고정된 값을 계속해서 사용할떄 사용한다.

코딩를 참고해보면 알수 있듯이 저러한 메서드는 정보를 입력 또는 수정할떄마다 사용해야 한다.
그렇게 사용하게 되면 계속해서 메서드를 반복적으로 추가해주어야 하기 떄문에
따로 class로 관리해 줄수 있다.

일단 공통적으로 사용할 부분이기 떄문에 인터페이스를 하나 만들어 준다.

이후 새로운 class를 만든뒤 메서드를 만들어 준다.
메서드의 구현부를 만들어 준다.

직접 implements할 필요 없이 단지 값을 받아 오기만 하면 된다.

이렇게 까지 설정을 했다면 @EntityListeners에 메서드를 구현해준 class를 붙여주게 되면 끝이다.

그러면 반복적으로 사용해야할 메서드를 @EntityListeners를 통해서 관리를 할수가 있다.


사진이 잘못 나왔다.
-> Auditable을 implement 해주어야 한다.
-> MyEntityListener의 타입을 Auditable로 선언했기 떄문에

만약 저렇게 관리를 하지 않는다면

이런식으로 사용해야한 class에 모두 메서드를 추가해 주어야 한다.

윗 과정 같은 경우에는 학습을 하는 과정이기 떄문에 이러한 방법이 있다고만 알고 있으면 된다

==> 이미 Spring자체적으로 AuditingEntityListener이라는 class를 통해서 똑같은 기능을 제공해주고 있다.

-> @CreatedDate, @LastModifiedDate

이와 같이 EntityListeners를 수정하여
단순하게 어노테이션을 붙여주면 앞서 했던 class를통해 작동하던 것과
같은 역할을 할수 있게 된다.

좀더 실무적으로 수정한다면


@MappedSuperclass
-> field의 값들을 상속받는 class에 전달해 준다.
== 그냥 상속과 같은 역할을 변수에도 적용한다고 이해하면 될꺼같다.
== 어노테이션의 역할까지 내려받는다.
그러기 떄문에 User의 EntityListeners에는 AuditingEntityListener이 없어도 된다.

User는 BaseEntity와 Auditable를 상속받고 있다.
BaseEntity에서 값을 내려 받고 있으며

Auditable에서 선언한 인터페이스들을 BaseEntity에서 내려받는 값을 통해서 처리해 주고 있다.
== 실질적으로 그냥 BaseEntity가 Auditable의 인터페이스를 처리하고 있다.

==================!! ==========================

Entity객체들은 component를 사용 할수가 없다.
그러기 떄문에 코드를 참고해보면
BeanUtils class에서 ApplicationContextAware를 implement하여 bean에 있는 값을 가져 옴으로써 객체를 사용할수가 있다.
-> 전에 Aop에서도 활용했던 방법이다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글