본문 바로가기

스프링/스프링 핵심 기술

7. IoC 컨테이너: ApplicationEventPublisher

ApplicationEventPublisher

  • 이벤트 프로그래밍에 필요한 인터페이스 제공. 옵저버 패턴 구현체로 이벤트 기반의 프로그래밍에 유용한 인터페이스이다.
  • ApplicationContext은 EventPublisher를 상속받고 있다.​

옵저버 패턴 참고

예제

  • MyEvent 클래스를 만들고 ApplicationEvent를 상속받은 후 data를 하나 추가하고 data가 포함된 생성자를 만든다.
  • 이 이벤트를 빈으로 만들지 않는다. 이 이벤트를 받을 핸들러를 빈으로 하여야 한다.

 

  • AppRunner에서 ApplicationEventPublisher를 이용해 이벤트를 생성할 수 있다.
  • 생성된 이벤트를 받을 핸들러를 만들어야 한다.

 

  • 이전에는 ApplicationListener를 상속받아 이벤트를 핸들링해야 했지만 현재는 annotation만 붙이면 된다.

ApplicationEvent 상속 제거(POJO)

  • 스프링 4.2 이후 에는 MyEvent를 상속받지 않고 이렇게 구현하여도 정상적으로 이벤트가 생성된다.
  • 이것이 스프링이 주요하게 생각하는 전력 중 하나인 POJO(Plain Old Java Object)이다.
  • POJO란 객체지향 원리에 충실하면서, 특정한 환경이나 규약에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 객체이며 이것을 통해 개발자는 테스트 코드 작성이 간결해지며 유지보수성이 좋아진다.

EventHandler가 두 개일 때

  • EvnetHanler가 여러 개 일 때는 실행 순서를 알 수 없다. 그렇기 때문에 따로 순서를 정할 수도 있다.**

@Order

  • @Order로 순서를 정해줄 수 있으며 숫자가 더 높은 Another가 늦게 실행되는 것을 확인할 수 있다.
  • 물론 스레드는 같은 main 스레드에서 실행(동기) 되는 것이다.
  • 비동기로 이벤트를 핸들링하고 싶으면 @Order대신 @Async를 붙이고 MainApplication에 @EnableAsync를 붙이면 제각기의 스레드에서 실행되어 비동기로 핸들링된다.

참고 자료