from Dictionary - Spring Event
Spring Event
이벤트 등록
ApplicationEvent를 상속해야 한다.
이벤트 팔행
ApplicationEventPublisher를 주입받아 사용해야 함
이벤트 구독
ApplicationListener를 구현하거나 @EventListener를 사용해야 한다.
//Publisher
@RequiredArgsConstructor
public class EventPublisher {
private final ApplicationEventPublisher publisher;
public void publish() throws InterruptedException {
publisher.publishEvent(new CustomEvent("Emitted"));
}
}
//Listener
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E event);
static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) {
return event -> consumer.accept(event.getPayload());
}
}
//or
@Component
public class CustomEventListener {
@EventListener
public void listen(CustomEvent event) {
}
}
발행/ 구독
- 멀티 캐스팅으로 동작 (다수의 수신자가 존재할 수 있다.)
- 동기 방식으로 동작 (트랜잭션이 하나의 범위로 묶일 수 있다.)
- 트랜잭션과 결합이 필요하다면 다른 리스너를 사용해야 한다.(
@TransactionEventListener를 제공하므로 트랜잭션 단계에 관여할 수 있다.)TransactionPhase.BEFORE_COMMITTransactionPhase.AFTER_COMPETIONTransactionPhase.AFTER_COMMITTransactionPhase.AFTER_ROLLBACK
비동기로 이벤트 처리
@Async메소드로 비동기 구현ApplicationEventMulticaster로 비동기 구현
장/단
- 장점
- 의존성을 분리하여 두 클래스를 느슨하게 결합시킬 수 있다.
- 클래스가 독립적이므로 재사용성을 높일 수 있다.
- 추후에 별도 서비스로 분리하기 용이함
- 메세지 구독 모듈을 추가/ 삭제할 때, 다른 모듈에 영향을 주지 않은 채로 수정할 수 있다.
- 단위 테스트가 용이해짐
- 단점
- 전반적인 작업량이 많아질 수 있음
- 코드 흐름 파악이 어려움
- 메시지 구독 순서를 고려해야 하는 경우 복잡해짐
- 전체적인 인벤트의 구독/ 발행을 테스트하기 어려움
- 특정 프레임워크 API에 의존