[JPA] 리스너

Bam·2025년 6월 3일
0

Spring

목록 보기
70/73
post-thumbnail

리스너

JPA는 엔티티의 생명주기에 따라 이벤트를 처리하기 위한 리스너 Listener 기능을 제공하고 있습니다.

엔티티 생명주기는 이전 포스트를 참조해주세요.출처 - https://thorben-janssen.com/entity-lifecycle-model/

이벤트

엔티티 생명주기에 따라 발생하는 이벤트의 종류와 발생 시점은 다음 그림과 같습니다.

  • PreLoad: 엔티티가 영속성 컨텍스트에 조회된 직후 호출
  • PrePersist: 엔티티가 영속성 컨텍스트에 의해 관리되기 직전 호출
  • PreUpdate: 엔티티를 데이터베이스에 수정하기 직전 호출
  • PreRemove: 엔티티를 영속성 컨텍스트에서 제거하기 직전 호출
  • PostPersist: 엔티티를 데이터베이스에 저장한 직후 호출
  • PostUpdate: 엔티티를 데이터베이스에 수정한 직후 호출
  • PostRemove: 엔티티를 데이터베이스에서 삭제한 직후 호출

이벤트 처리

이벤트는 엔티티에서 직접 적용시키거나 별도의 리스너를 등록함으로써 처리할 수 있습니다.

엔티티에 직접 적용하는 방법

다음과 같이 엔티티에 이벤트를 처리하는 어노테이션을 달아준 메소드를 통해 처리합니다.

@Entity
public class Member {

	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "m_id")
    private String mId;
    
    @PrePersist
    public void prePersist() {}
    
    @PostPersist
    public void postPersist() {}
}

위와 같이 각 이벤트에 대해 처리를 지정하는 이벤트 어노테이션이 있다고 보시면 됩니다.

지금처럼 식별자 생성 전략을 사용하는 경우 PrePersist에서는 id가 null이고 PostPersist에서는 id가 생성된 후에 호출되어서 값이 나타납니다.

리스너 등록

다음과 같이 별도의 리스너 클래스를 정의하고 등록하여 사용하는 방법도 있습니다.

@Entity
@EntityListeners(MemberListener.class)
public class Member { }


public class MemberListener {

	@PrePersist
    public void prePersist() {}
    
    @PostPersist
    public void postPersist() {}
}

정의된 리스너 메소드는 대상 엔티티를 파라미터로 받아서 처리할 수도 있습니다. 이때 반환값은 반드시 void 타입이어야합니다.

기본 리스너

orm.xml 설정 파일을 쓰는 경우에는 기본 리스너 등록 기능을 사용할 수 있습니다. 다음과 같이 기본 리스너를 등록합니다.

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="https://jakarta.ee/xml/ns/persistence/orm"
                 version="3.0">

    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <entity-listeners>
                <entity-listener class="com.example.listener.GlobalEntityListener"/>
            </entity-listeners>
        </persistence-unit-defaults>
    </persistence-unit-metadata>

</entity-mappings>

기본 리스너를 설정하면 모든 엔티티에 대해 전역적으로 적용되게 됩니다.


리스너 우선순위

여러 리스너 방식을 혼합해서 사용했을 때 리스너의 우선순위는 다음과 같습니다.

  1. 기본 리스너(전역)
  2. 부모 클래스 리스너
  3. 별도 정의 리스너
  4. 엔티티 적용 리스너

0개의 댓글