Spring

Spring Event, 스프링 이벤트, ApplicationEventPublisher

Karla Ko 2024. 1. 27. 16:30
728x90

 

Spring Event

  • 스프링 프레임워크를 사용할 때 빈(Bean) 간 데이터를 주고받는 방식
  • 이벤트를 발행(Publish)하고 이벤트를 수신 또는 구독하여 소비(Listen/Subscribe)하는 기능을 제공
  • 기존 로직에 트리거와 같은 후처리를 추가하면서 관심사 분리 (낮은 결합도)

 

1. 이벤트 클래스

  • 이벤트 클래스는 이벤트를 처리하는 데 필요한 최소한의 데이터 포함하여 생성
  • 이너 클래스 생성하여 사용 가능
@Getter
@RequiredArgsConstructor
public class AddPersonEvent {
    PersonDto personDto;
}

 

2. 이벤트 디스패처

  • 이벤트 발행을 위해 스프링에서 제공하는 ApplicationEventPublisher을 사용
@Slf4j
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class PersonService {
    private final ApplicationEventPublisher publisher;

    @Transactional
    public void test(PersonDto personDto) {
        log.info("test");

        publisher.publishEvent(new AddPersonEvent(personDto)); // 이벤트 발행

    }
}

 

3. 이벤트핸들러, 이벤트리스너

  • 이벤트를 처리할 핸들러는 Spring에서 제공하는 @EventListener 애너테이션을 사용해서 구현
  • 수신하여 이벤트를 처리
  • @Async 어노테이션을 사용하여 비동기 처리 가능
  • @TransactionalEventListener 어노테이션을 사용하여 동작하는 메서드가 트랜잭션을 적용해야 하는 경우 사용
@TransactionalEventListener

1. @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
default 값이며, 트랜잭션이 commit 되었을 때 이벤트를 실행합니다.
2. @TransactionalEventListener(phase = TransactionPhase.ROLLBACK)
트랜잭션이 rollback 되었을 때 이벤트를 실행합니다.
3. @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
트랜잭션이 completion(commit 또는 rollback)되었을 때 이벤트 실행합니다.
4. @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
트랜잭션이 commit 되기 전에 이벤트를 실행합니다.
@Component
@RequiredArgsConstructor
public class EventHandler {

    private final TestService testService;

    @Async // 비동기 처리
    @EventListener(AddPersonEvent.class) // 수신할 이벤트 클래스 지정
    public void handle(AddPersonEvent event){
        testService.add(event.getPersonDto()); // 이벤트 처리 로직
    }
}
728x90