스프링 핵심 기술-07.ApplicationEventPublisher


IoC 컨테이너 8부 : ApplicationEventPublisher

ApplicationEventPublisher?
이벤트 프로그래밍에 필요한 인터페이스를 제공하기 때문에,
이벤트 기반의 프로그래밍을 할 때 유용한 인터페이스이며, 옵저버 패턴 구현체입니다.

옵저버 패턴?

옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들,
즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.
마찬가지로
ApplicationEventPublisher도 마찬가지로 ApplicationContext가 상속받습니다.
(ApplicationContext extends ApplicationEventPublisher)

이벤트 만들기

(스프링 4.2 이전)

이벤트로 만들기 위해서는 ApplicationEvent를 상속받아야 했습니다.
하지만 스프링 4.2부터는 상속받지 않더라도 이벤트로 사용이 가능해졌습니다.

이벤트 클래스

// ApplicationEvent 상속받아 이벤트로 만들기 , 스프링 4.2부터는 상속받지 않아도 이벤트로 사용 가능
public class MyEvent extends ApplicationEvent {

    private int data;

    // 이벤트를 발생시킨 소스를 전달 가능
    public MyEvent(Object source) {
        super(source);
    }

    // 만약 원하는 데이터가 있다면, 데이터도 같이 실어서 전달 가능
    public MyEvent(Object source, int data) {
        super(source);
        this.data = data;
    }

    public int getData() {
        return data;
    }
}

이벤트 핸들러 클래스

@Component
// 마찬가지로 스프링 4.2부터는 ApplicationListener 구현하지 않아도 된다.
public class MyEventHandler implements ApplicationListener<MyEvent> {

    @Override
    public void onApplicationEvent(MyEvent event){
        System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    }
}

(4.2버전 이후)

이벤트 핸들러 클래스

@Component
public class MyEventHandler {

    @EventListener // 상속 대신에 어노테이션 기반
    public void handle(MyEvent event){
        System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    }
}

이벤트 클래스

public class MyEvent{

    private int data;

    // 이벤트를 발생시킨 소스를 가지고 싶다면.
    private Object source;

    // 만약 원하는 데이터가 있다면, 데이터도 같이 실어서 전달 가능
    public MyEvent(Object source, int data) {
        this.source = source;
        this.data = data;
    }

    public Object getSource() {
        return source;
    }

    public int getData() {
        return data;
    }
}

바뀐 이벤트 클래스를 보면,
이게 바로 스프링이 지향하는 철학인데.

비침투성
지금 이 코드에는 스프링 패키지가 전혀 들어가 있지 않습니다..
스프링 프레임웍이 추구하는,
사실 비침투성, POJO 등 다 비슷한 말인데,
내 코드에 스프링 코드 (프레임워크의 코드가 노출되지 않는 것)
POJO 기반의 프로그래밍인 것을 볼 수 있습니다.
이게 더 테스트가 편하고 유지보수도 편해집니다.

POJO가 뭔지, 왜 테스트와 유지보수가 더 편해지는지..
POJO, EJB 등 자세한 대한 내용은 다시 정리 예정입니다.(Java)