티스토리 뷰

ApplicationEventPublisher


ApplicationEventPublisher는 무엇인가?!

  • ApplicationEventPublisher는 이벤트 기반의 프로그래밍을 할 때 필요한 기능을 제공해준다!
  • ApplicationContext가 상속 받고 있다!
  • 이벤트 프로그래밍 이라고 얘기하니까 느낌이 잘 안온다! 한번 직접 이벤트를 다뤄보자!
  • 일단 이벤트와 이벤트를 다뤄줄 이벤트 핸들러를 만들어보자!

Event 와 EventHandler 클래스!

  • 이벤트를 만들었으니 AppRunner에서 Event를 가져와 실행시켜보자!
  • 이 때 중요한게 있는데 Event는 Bean이 아니다!! 
  • EventHandler만 빈으로 등록된다!! 헷갈리지말자

  • ApplicationEventPublisher를 주입받아서 publishEvent를 통해 MyEvent를 발생시킨다! 실행해보자!!

잘 실행된다..!

  • 다음과 같이 이벤트핸들러를 통해 이벤트를 가져와 실행시킬 수 있다!
  • 추가로 4.2 이후에는 이벤트와 이벤트핸들러를 다음과 같이 쓸 수 있다
  •  
  • 근데 만약 여러개의 핸들러에서 이벤트를 발생시키면 순서는 어떻게될까.!?

  • 더 이상 다른 상속 받을 클래스가 없다
  • 또한 이벤트를 다뤄주는 함수에 @EventListener를 달아서 이벤트를 처리하게 해준다!
  • 이벤트의 코드는 다음과 같이 바뀌었다

  • 똑같이 상속받던 클래스가 사라졌다
  • 또다른 특징은 더 이상 스프링의 코드가 없다..!!
  • 이런 코드를 스프링에서는 추구한다고 한다. 비침투성이라고 표현하는데 스프링 코드가 침투 안한다는 뜻인가..!
  • 이렇게 코드를 짜면 테스트가 편하고 유지보수가 더욱 쉽다고 한다!

@Order를 이용해 이벤트 순서 결정

  • 만약 핸들러가 1개가 아니라 2개라면 어떤 핸들러의 이벤트부터 발생할까?
  • 이벤트는 순차적으로 실행된다. 하지만 순서가 보장되는건 아니다
  • 그럴때 @Order를 이용해 순서를 결정할 수 있다
  • 다음과 같이 2개의 핸들러가 있다고 하자

  • 그럼 실행될때는 어떤게 더 먼저 실행될지는 알 수 없다
  • 이럴때 @Order를 이용해 순위를 줄 수 있다!
  • 다음 그림처럼 @Order로 순위를 넣어주고 뒤에 실행되기 원하는 것은 +2정도 더해주자!

  • 그리고 실행을 해보면 ? 

  • 우선순위가 가장 높은것부터 실행된다! 순위를 바꾸면 당연히 결과도 순위에 맞게 따라간다..!

@Async를 이용한 이벤트 비동기 실행

  • 이벤트는 기본적으로 sync로 처리된다
  • 이 때 비동기로 처리하고 싶다면 @Async를 이용해서 처리할 수 있다!
  • 먼저 기본적인 상태로 실행을 시켜보자!

  • 현재 이상태로 실행시키면 처리하는 쓰레드를 출력할 수 있다! 결과는?!

  • 다음과 같이 출력된다. 동일한 main 쓰레드가 처리한다!
  • 기본적으로 동기화가 되는 상태기 때문에 그런 것 같다
  • 그럼 이번에는 Async로 한번 실행시켜보자! @Async를 이벤트 리스너에 추가해주고
  • 추가로 application에 @EnableAsync를 붙여줘야한다  그렇지 않으면 비동기로 실행되지 않는다!
  • 이 부분은 조금 더 자세하게 공부하고 또 써야겠다...!

  • 핸들러를 다음과 같이 바꿨다. @Async를 넣어줬다

  • 그리고 다음과 같이 @EnableAsync를 넣어줬다. 이제 실행하면 어떻게 나올까?!

  • 다음과 같이 두개의 이벤트가 다른 쓰레드에 의해 처리된다..! 비동기적으로!
  • 사용방법은 알았으니 사용해야할 때 잘 써야겠다..! 추가로 동기 비동기도 항상 헷갈리는 개념이니 공부해야지

스프링이 제공하는 기본 이벤트

  • 스프링에서 기본적으로 다음과 같이 있다!
  • ContextRefreshedEvent: ApplicationContext를 초기화 했더나 리프래시 했을 때 발생.
  • ContextStartedEvent: ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생.
  • ContextStoppedEvent: ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생.
  • ContextClosedEvent: ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생.
  • RequestHandledEvent: HTTP 요청을 처리했을 때 발생.
  • 상황에 맞게 이벤트를 처리해야한다면 유용할 것 같다..!

 

오늘은 스프링의 이벤트에 대해 공부해봤는데

사실 어디서 써본적이 없어서 쏙쏙 몸에 들어오지는 않았따..!

나중에 이벤트 처리할때 바로 써먹어버려야지 ㅎㅎ

댓글
댓글쓰기 폼
공지사항
Total
50,925
Today
33
Yesterday
42
링크
TAG
more
«   2021/02   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28            
글 보관함