ApplicationEventPublisher를 이용한 EventHandler에서 예외 처리가 발생하지 않는 이유는 EventHandler가 ApplicationEventPublisher에서 이벤트를 수신하여 처리하는 구조 때문이다.
일반적으로 EventHandler는 Spring Framework의 @EventListener 어노테이션을 이용하여 구현된다. 이 어노테이션을 사용하면 EventHandler 메서드가 ApplicationEventPublisher에 등록되어, 해당 이벤트가 발생하면 자동으로 호출된다.
이 때, @EventListener 어노테이션을 사용한 EventHandler에서 예외가 발생하면, 이 예외는 호출한 ApplicationEventPublisher로 다시 전달된다. 그러나 ApplicationEventPublisher는 이벤트를 발행(publish)하고, 해당 이벤트를 수신하는 리스너(listener)들에게 이벤트를 전달하는 역할만 하기 때문에, 이 예외를 처리할 수 있는 방법이 제한된다.
따라서, @EventListener 어노테이션을 사용한 EventHandler에서 예외 처리는 해당 메서드 내에서 적절하게 처리해주어야 한다. 예를 들어, 예외가 발생하면 로깅하거나, 다른 예외로 감싸서 다시 던지는 등의 방법을 사용할 수 있다.
@Transactional(propagation = Propagation.REQUIRES_NEW)은 Spring Framework에서 트랜잭션을 다룰 때 사용하는 어노테이션 중 하나이다. 이 어노테이션은 메서드를 실행할 때 새로운 트랜잭션을 시작하도록 지정하며, 메서드 실행이 완료될 때 트랜잭션을 커밋하거나 롤백한다.
예외가 발생한 경우, 트랜잭션은 롤백됩니다. 그러나 @Transactional(propagation = Propagation.REQUIRES_NEW)을 사용하여 실행된 메서드는 독립적인 트랜잭션을 사용하기 때문에, 예외가 발생해도 롤백되지 않는다.
따라서 예외가 발생하더라도 트랜잭션 외부에서 @Transactional(propagation = Propagation.REQUIRES_NEW)을 사용하여 실행된 메서드에 대한 트랜잭션은 커밋된다. 예외 처리를 위해서는 해당 메서드 내에서 예외를 처리해야 한다.