1. JPA에서 이벤트를 발행해주는 방법이 있다고?


JPA에서 엔티티와 관련된 이벤트를 처리하거나 발행하는 기능은 도메인 이벤트(Domain Event)와 연관됩니다. 엔티티에서 이벤트를 발행하는 기능은 도메인 주도 설계(DDD)에서 중요한 패턴 중 하나로, 도메인 모델이 특정 상태 변화나 중요한 비즈니스 이벤트가 발생했을 때 이를 외부로 알릴 수 있도록 합니다.

Spring Data JPA와 도메인 이벤트

Spring Data JPA는 도메인 이벤트를 쉽게 처리할 수 있는 메커니즘을 제공합니다. 이를 통해 엔티티 내부에서 이벤트를 발행하고, 이를 처리하는 리스너를 통해 특정 작업을 수행할 수 있습니다. 이 방법을 사용하면 애플리케이션의 모듈성을 높이고, 비즈니스 로직과 부가 작업(예: 이메일 알림, 로그 기록 등)을 분리할 수 있습니다.

주요 구성 요소

  1. 도메인 이벤트 클래스: 이벤트 자체를 표현하는 클래스입니다.
  2. 도메인 이벤트 발행: 엔티티 내에서 이벤트를 발행합니다.
  3. 도메인 이벤트 리스너: 발행된 이벤트를 처리하는 리스너입니다.

예시 구현

1. 도메인 이벤트 클래스

먼저, 이벤트를 표현하는 클래스를 정의합니다.

import org.springframework.context.ApplicationEvent;

public class EmployeePromotedEvent extends ApplicationEvent {

    private final Long employeeId;
    private final String newPosition;

    public EmployeePromotedEvent(Object source, Long employeeId, String newPosition) {
        super(source);
        this.employeeId = employeeId;
        this.newPosition = newPosition;
    }

    public Long getEmployeeId() {
        return employeeId;
    }

    public String getNewPosition() {
        return newPosition;
    }
}

이 클래스는 직원이 승진되었을 때 발행되는 이벤트를 표현합니다. employeeIdnewPosition 필드를 통해 승진된 직원의 정보를 포함합니다.

2. 이벤트 발행