DevBoi

[DDD] EventListener들은 어디에 저장되고 어떻게 호출될까? 본문

Develop/[DDD]

[DDD] EventListener들은 어디에 저장되고 어떻게 호출될까?

HiSmith 2023. 6. 19. 18:03
반응형

EventListener가 어떻게 등록이되고 캐치가 될까?

applicationEventPublisher는 Event를 받아, 리스너들에게 Event를 Publish해준다.

도대체 어떻게 무슨 원리로 Publish 되는걸까

 

ApplicationEventPublisher 인터페이스는 아래 4개의 곳에서 재 정의한다.

그리고, 보통은 AbstarctApplicatonContext에서 정의한 걸 따라간다.

 

AbstractApplicationContext - publishEvent

 

중요한 부분은 아래이다.

Multicaster에게 작업을 위임한다.

SimpleApplicationEventMulticaster의 내용이다.

보면 알다싶이, 이벤트 타입을 받아오고, getApplicationListeners를 통해서, 리스너들을 받아온다.

그리고, 해당 Executor를 통해, 해당 리스너에게 이벤트를 InvokeListner라는 메소드로 작동시킨다.

getApplicationListeners는 아래와 같다.

리스너 캐시키를 생성하고, 캐시키에 대한 객체를 생성한다.

이때 Retriever의 캐시가 빈값이면, 새로 캐시에 값을 넣어준다.

물론 캐시에 있다면, 이작업은 하지 않는다.

해당 캐시에 넣고나서, existingRetriever에서 getApplicationListeners를 통해, 리스너 리스트를 가져온다.

처음 보는 자료형이 있다. volatile 이라는 자료형이고, 해당은 메모리에 저장하겠다는 명시인데 무튼, 이걸 보면 어플리케이션 리스너들은 메모리에 저장이 된걸로 보일 수 있다.

무튼 아래 부분에 답이 나와있다.

해당 ApplicationListener라는 클래스로 ListenrBeanName을 빈 팩토리에서 가져와서, 리스너 전체 리스트에 넣고,

해당 내용을 정렬후 Return 한다.

 

무튼 핵심은 multicastEvent 이다.

다시한번 보자

해당 등록된 리스너의 리스트들을 동작 시킨다.

지정된 이벤트들만 동작하는건, type으로 이벤트에 대한 걸 정의 하고 getApplicationListners로 해당하는 정보만 캐시에서 가져오기 때문이다.

무튼 이렇게 호출하는 원리이다.

 

너무 복잡하다. 그냥 짧게 캐시를 사용하고, 메모리를 사용해서 이벤트의타입을 기준으로 아니..이래도 복잡하다..

그냥 누가 알려달라고 하거나 물어보면 모른다고하자...ㅋ

 

 

 

반응형