본문 바로가기

카테고리 없음

@EventListener는 뭐에 쓰는 물건인고?

간단 설명:

도메인 간 의존성을 약화하기 위해 Event 객체를 전달하는 방식으로 구조를 짤 때, ApplicationListener, ApplicationEvent를 상속하지 않고도 이벤트를 수신하고 처리하는 handler 메서드를 만들 수 있다

도메인 간 의존성이 강하고, 한 클래스, 코드 영역에 역할 책임이 혼재되어 있다면 유지 보수가 어려울 것이다

(솔직히 아직 그정도로 복잡한 코드를 짤 일은 없었긴 하지만...그냥 그렇다고 하나보다 하는 중. 나중엔 실감할테니 공부해 두자)

그래서 도메인 간 의존성을 줄이기 위해, Event를 사용해서 정보를 전달하고 책임을 나누는 것이다

하단에 링크를 걸어 둔 블로그에 설명이 정말 잘 되어 있다. 주문을 담당하는 코드에 결제 로직이 혼재 되어 있는건 의존성이 강하지만,

주문 코드에서 이벤트를 결제 코드로 전달하고 책임을 위임하면 깔끔한 분리가 이뤄진다는게 주 요지인 듯 하다.

 

이벤트를 통해 도메인 간 소통을 할 때 4가지의 요소가 있다

source: 이벤트 pulishing을 하는 주체. ApplicationEventPublisher 객체의 publishEvent 메서드를 호출하여 이벤트를 전달한다

event: 도메인 간 전달될 정보를 담고 있으며, 4.2 버전 아래에서는 ApplicationEvent를 상속하여 이용했다.

listener: 스프링에서는 IOC 컨테이너가 event 생성을 감지? 하고 handler에 전송하는 역할을 한다

handler: 전달받은 이벤트를 처리하는 주체이다. 4.2버전 아래에서는 ApplicationListener 인터페이스를 구현하고, onApplicationEvent 메서드를 상속받아서 이벤트를 처리해야 했다

스프링에서 쓰이는 개념 답게 이벤트의 전달 자체를 개발자가 아니라, 제어 역전의 방식으로 스프링 컨테이너에 위임을 한다는 것을 알 수 있다. 

PublishEvent 메서드가 바로 handler의 onApplicationEvent 메서드에 전달하는 것이 아니라. 

그리고 스프링 4.2버전 부터 등장한 @EventListener를 메서드에 추가하면, ApplicationListener, ApplicationEvent를 상속하고 구현하지 않아도 handler 메서드에서 이벤트를 처리할 수 있다. 

 

개인 생각:

사실 개인 생각이라기 보단 당연한? 이야기겠지만, (틀릴 수도 있다) MSA 구조에서 많이 사용될 듯 싶다.

도메인이 아예 다른 서버, 노드로 분리된 환경에서, 위에 말한 주문, 결제 도메인 간에 통신을 하기 위해서 쓰이는게 일반적인 용례이지 않을까

@EventListener 가 추가된 handler 메서드에서 api 콜을 할 수도 있을 것이고,

급증하는 트래픽에 버퍼링 역할을 하고자 카프카에 전송하기 위해 Producer Client를 해당 메서드에서 정의하고 produce 메서드를 호출 할 수도 있을 것이다

사실 한달 반 전인가 Confluent 채널에서 Spring Kafka로 라이브 코딩을 하던 중 @EventListener 애너테이션을 처음 보게 되었는데

이것의 역할이 무엇이고 왜 애너테이션을 메서드에 넣은 걸까 하고 궁금해서 이리저리 찾아 보다 정리하게 되었다.

참고 자료:

https://brunch.co.kr/@springboot/422

 

Spring @EventListener

스프링부트 이벤트 구현 | 이 글은, 스프링부트에서 제공하는 @EventListener에 대해서 소개한다. 목차 1. Overview : 글 소개 2. Spring Event(1) : 스프링 4.2 이전 버전에서의 이벤트 3. Spring Event(2) : 스프링 

brunch.co.kr

https://www.youtube.com/watch?v=XjiEoVOOsRg&t=6s