Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section1_7부

whyWhale 2020. 11. 19.

ApplicationEventPublisher   ※주석을 꼭 참고 해 주시기 바랍니다.

 

이벤트 프로그래밍에 필요한 인터페이스 제공. (옵저버 패턴 구현체)

 

ApplicationContext extends ApplicationEventPublisher

 

이벤트 만들기

4.2 스프링 부터 상속받지 않아도 이벤트 사용 가능.

 

(빈 등록 x)상속을 받지 않아도 실행 가능한 4.2 이후버젼 주석처리 부분은 이제 없어도 됩니다.

 

(이 부분은 빈등록!)이벤트를 퍼블리시 하기 위한 클래스 입니다. @EventListner 라는 어노테이션을 추가하고 메소드 명을 바꾸어도 된다.

이벤트 방법

  • ApplicationEventPublisher.publishEvent();

AppRunnser 작성 부분입니다 ApplicationContext에 상속박고 있으므로 사용이 가능하다.

이번에는 또다른 handler 를 구현 해보고 실행을 하게 되면 어떤것이 먼저 실행 될지는 모르지만 둘 다 실행되는 것을 보시수 있습니다.

또 다른 핸들러 (빈 등록 !)

추가적으로 각 매소드 handle 안에 System.out.println(Thread.currentThread().toString()); 을 넣고 출력 결과를 보시면 순서는 따로 정하지 않고 랜덤으로 둘중 하나가 먼저 출력되며 같은 스레드에서 발생하는 것을 알 수 있습니다.

 

 

 

 

이벤트 처리 방법

  • ApplicationListener<이벤트> 구현한 클래스 만들어서 빈으로 등록
  • 4.2부터 @EventListner 사용해서 빈의 메소드에 사용가능
  • 기본적으로 동기화.(Syncronized)
  • 순서 정하려면 @Order 사용  ->  @Order(Ordered.HIGHEST_PRECEDENC) <괄호 안에 +1 을 더해주면 늦게 실행.>
  • 비동기적 실행을 원한다면 @Async 사용 (각 스레드 풀에서 따로 놀고 스케쥴링에 따라 다르기 때문에 order의미가 없음. <이거 하나만 어노테이션한다 해서 (한 스레드에서 동작) asyn처럼 동작하는 것이 아닙니다.> )
  • => main 메소드로 가서 @SpringBootApplication 밑에 @EnableAsyn 라고 작성합니다. 그러면 각 서로 다른 스레드에서 실행이 되는 것을 확인 할 수 있습니다.

 

스프링이 제공하는 기본 이벤트 (ApplicationCotext -> ctx )

  • ContextRefreshedEvent : ctx를 초기화 했더니 리프레시 했을 때 발생.
  • ContextSharedEvent : ctx를 start() 하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생.
  • ContextStoppedEvet : ctx를 stop() 하여 라이프사이클 빈들이 정지 신호 받은 시점에 발생.
  • ContextClosedEvent :  ctx를 colse() 하여 싱글톤 빈 소멸되는 시점에 발생.
  • RequestHandlerEvent : HTTP 요청을 처리했을 때 발생.

ContextRefreshedEventContextClosedEvent 사용은 여러 myhandler 만들고 안에 이렇게 사용 가능합니다.

 

 ApplicationContext applicationContext=event.getApplicationContext();
 var applicationContext=event.getApplicationContext();

 sout(applicationContext)

 

각 해당 출력의 결과는 먼저 refresh 가 시작되고 마지막에 closed 가 찍히는 것을 알 수 있습니다.

 

 

 

댓글