Programming/Spring

ApplicationEventPublisher

사랑우주인 2024. 12. 13. 14:08

ApplicationContext는 ApplicationEventPublisher 인터페이스를 구현하고, 이를 통해 스프링 애플리케이션에서 이벤트를 발행(publish)할 수 있는 기능을 제공한다.

Spring 4.2 버전 이전 버전에서는 발행되는 Event 객체가 ApplicationEvent로부터 확장되고 (extends), EventListener 객체는 ApplicationListener <발행될 Event 객체 타입>를 구현해야(implements) 했었다.

public class ExampleEvent extends ApplicationEvent {

    private int data;
    
    public ExampleEvent(Object source, int data) {
        super(source);
        this.data = data;
    }
    
    public int getData() {
        return data;
    }
}
@Component
public class ExampleEventHandler implements ApplicationListener<ExampleEvent> {

    @Override
    public void onApplicationEvent(ExampleEvent event) {
        System.out.println("이벤트 전달 받음, data = " + event.getData());
    }
}

Spring 4.2 버전 이후부터는 POJO 구조로, Spring 코드 없이 이벤트 기반 프로그래밍이 가능해졌다.

@Getter
public class MyEvent {

  private int data;
  private Object source;

  public MyEvent(Object source, int data) {
    this.source = source;
    this.data = data;
  }

}
@Component
public class MyEventHandler {

  @EventListener
  public void handle(MyEvent event) {
    System.out.println(Thread.currentThread().toString());
    System.out.println("이벤트를 받았다. 데이터는 " + event.getData());
  }
}

이와 같이 비침투성 즉, 개발자의 코드에 Spring code가 들어가지 않도록(package가 import 되지 않도록)하여 코드를 POJO형태로 만들어 유지보수와 테스트가 용이하도록 하는 것이 Spring의 철학이다.