이벤트 발생시키기!!

반응형
반응형

만약, 로또에 당첨되었다고 생각해보자.
근데, 당첨된줄 모른다면 무슨 의미가 있을까?
다른 사람은 몰라도 당첨된 사람은 알고 있어야 되지 않을까?

그러면 무슨 의미인지는 모르겠지만... ㅜㅜ
이럴때 사용하는것이 옵저버 패턴이라고 한다.
여기서 디자인 패턴을 설명하지는 않겠지만, 옵저버 패턴을 사용하면 당첨내용을 알 수 있다는 것만은 분명하다.

코드는 최대한 간단하게 작성하였다.

먼저 당첨 번호를 발생시키는 코드

public class Lotto extends ApplicationEvent {

    private String data;

    public Lotto(Object source, String data) {
        super(source);
        this.data = data;
    }

    public String getData() {
        return data;
    }
}

특정 데이터를 발신자에서 수신하게 만들어주었다.
아래는 발신자

@Component
public class LottoService implements ApplicationEventPublisherAware {

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        publisher.publishEvent(new Lotto("번호: " ,"2,3,4,10,16"));
    }
}

번호는 2,3,4,10,16번이 나왔다.
이것을 알려주러 가자.

@Component
public class LottoListener implements ApplicationListener<Lotto> {
    @Override
    public void onApplicationEvent(Lotto event) {
        System.out.println(event.getSource()+" "+event.getData());
    }

}

수신자가 적절하게 받았다.

발신자 쪽에서 랜덤한 코드를 생성하게 만들 수 도 있다.
그렇다면 수신자 쪽에서는 무엇을 할 수 있을까?
단순히 어떻게 보여줄지만 결정할 수 있다.

추후에 옵저버 패턴을 학습해보야 겠다는 생각이 들었다.

스프링 4.2부터는 어노테이션으로 이벤트를 만드는 방법을 제공하고 있다.
위와 비슷한 코드를 어노테이션 기반으로 수정해보자.

public class Lotto {

    private String data;
    private Object source;
    public Lotto(Object source, String data) {
        this.source = source;
        this.data = data;
    }

    public Object getSource() {
        return source;
    }

    public String getData() {
        return data;
    }
}

가장 눈에 띄이는건 extends ApplicationEvent가 사라졌다는 것을 알 수 있다.
그리고...

@Component
public class LottoListener  {
    @EventListener
    public void handle(Lotto event) {
        System.out.println(event.getData());
    }

}

@EventLister이라는 어노테이션을 추가함으로 이벤트를 실행이 가능해졌다.
하지만 이제 "ApplicationEventPublisherAware"에서는 실행이 어려워졌다.(방법이야 찾으면 있겠지만, 그냥 실행시 아무것도 등장하지 나오지 않는다.)

결국 발송지를 수정해야 될것 같다.

@Component
public class Application implements ApplicationRunner {

    @Autowired
    ApplicationEventPublisher publisher;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        publisher.publishEvent(new Lotto(this ," 번호는 2,3,4,10,16"));
    }
}

임시방편으로 ApplicationRunner에서 실행하게 해주었다.

스프링에서는 다양한 기본 이벤트들을 제공하고 있다.


스프링이 제공하는 기본 이벤트
●  ContextRefreshedEvent: ApplicationContext를 초기화 했더나 리프래시 했을 때 발생.
●  ContextStartedEvent: ApplicationContext를 start()하여 라이프사이클 빈들이 시작신호를 받은 시점에 발생.
●  ContextStoppedEvent: ApplicationContext를 stop()하여 라이프사이클 빈들이 정지신호를 받은 시점에 발생.
●  ContextClosedEvent: ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에발생.
●  RequestHandledEvent: HTTP 요청을 처리했을 때 발생.

- 백기선의 스프링 프레임워크 핵심기술 中

이들은 발신자쪽에서 작성되는 것이 아닌 수신자 쪽에서 작성되는 것이라고 한다.

만약에 받는 이벤트가 여러개라면?
@Order을 추가해서 우선순위(사용자가 강제로 순서)를 지정할 수 있다.

반응형

'SPRING START!' 카테고리의 다른 글

AOP  (0) 2021.08.25
DI 와 IOC  (0) 2021.08.14
스프링은 환경을 어떻게 조성할 수 있을까?(프로파일, 프로퍼티, 국제화)  (0) 2021.01.10
의존성 주입  (0) 2021.01.08
스프링과 bean  (0) 2021.01.07

댓글

Designed by JB FACTORY