Spring을 이용해 개발하다보면, 모듈간 결합도를 낮추기 위해 Spring Event를 활용하는 케이스가 있다. Spring Event를 편리하게 사용하고 있다 문득 내부 동작 원리가 궁금해 코드를 살펴봤다.
이번글은 Spring Event 동작 방식에 대해 설명하는 글이다.
크게 2가지 동작의 원리를 살펴보겠다.
1. @EventListener 애노테이션을 통한 Handler 등록 과정
2. ApplicationEventPublisher를 이용해 Event를 발행할 때 Event가 Listener로 전송되는 과정
@EventListener 애노테이션을 통한 Handler 등록 과정
Flow
ApplicationContext Refresh 과정에 EventListenerMethodProcessor 부터 @EventListener 애노테이션이 붙은 method들을 가져와, EventListenerFactory를 이용해 Listener 객체를 생성한 후에 EventListener로 등록한다.
각 과정을 자세히 살펴보면 아래와 같다.
AbstactApplicationContext
Application Context Refresh 과정에서 DefaultListableBeanFactory를 이용해 Singleton Bean을 초기화한다.
DefaultListableBeanFactory
preInstantiateSingletons method에서 싱글톤들을 초기화하고, post-initialization callback을 호출한다.
EventListenerMethodProcessor
afterSingletonInstantiated method에서 processBean을 호출
processBean method에서 @EventListener 애노테이션이 붙은 메서드들을 가져와, EventListenerFactory를 이용해 EventListener 객체를 생성 후 context에 리스너들을 등록한다.
ApplicationEventPublisher를 이용해 Event를 발행할 때 Event가 Listener로 전송되는 과정
Flow
ApplicationEventPublisher(기본 구현체가 AbstractApplicationContext)의 publishEvent 메서드가 실행되면, 내부적으로 ApplicationEventMutlicaster(기본 구현체가 SimpleApplicationEventMutlicaster)에게 이벤트 처리를 위임한다.
ApplicationEventMulticaster에선 자신이 갖고 있는 ApplicationListener를 이용해 Event를 처리한다.
AbstractApplicationContext
publishEvent method에서 ApplicationEventMulticaster에게 이벤트 처리 위임한다.
SimpleApplicationEventMulticaster
multicastEvent method에서 ApplicationListener를 이용해 Event를 처리한다.
'Spring' 카테고리의 다른 글
Spring @Transactional 동작원리 완벽 정리 (0) | 2024.03.02 |
---|---|
Spring MVC에서 MappingJacksonValue 활용하기 (0) | 2024.03.01 |
Spring Data Redis Pub/Sub 파헤치기 (0) | 2023.06.28 |
Spring's STOMP support 파헤치기 (0) | 2023.06.02 |
Spring Websocket Trobleshooting!! (feat. Decorator Pattern) (0) | 2023.05.21 |