본문 바로가기
IT/Java

@EventListener 란? (ApplicationEventPublisher, publishEvent)

by 성준하이 2023. 11. 12.
반응형

현재는 다른 좋은 방법들이 많아서 잘 사용되지 않지만 개념에 대해서 알고 가고자 포스팅을 남긴다.

 

기존에 아래 사진과 같은 비지니스가 있다고 하면

하나의 비지니스가 너무 길고 간단하게 봐야 이정도지 서로 물리고 엮여있는게 많다면 그 비지니스 하나는 엄청나게 커지고

유지보수 측면에서도 어렵고 복잡할 것이다.

 

그래서 요즘엔 MSA 로도 많이 나오지만 비지니스 관점에서 보면 아래 그림과 같이 바뀌고 있다.

event 발생 여부에 따라 어떤 메서드를 동작 시킬지에 대해 이런 방식으로 흘러간다.

 

요즘엔 AOP로 설정을 해두거나 Kafka, MQ 등으로 설정을 하곤 한다.(참고 포스팅 참고)

 

 

그럼 자바에서는 이 이벤트를 구현하기 위해서는 

  • ApplicationEventPublisher 
  • @EventListener

이 두가지를 사용한다.

 

예시 코드는 아래와 같다.

 

private final ApplicationEventPublisher applicationEventPublisher

public void eventlistener() {
     applicationEventPublisher.publishEvent("hello");
     TestDto d = new TestDto();
     d.setDataId("IDID");
     applicationEventPublisher.publishEvent(d);
     applicationEventPublisher.publishEvent(10L);
}

일단 ApplicationEventPublisher 를 bean 주입 받고 publishEvent메서드를 호출한다.

그리고 Handler 쪽은 오버로딩 해서 여러 메서드를 만들어둘수 있다.

아래와같이 만들어준다.

@Component
public class MyEventHandler {

     @EventListener
     @Async
     public void firstEventListener(String event) {
         String id = event;
         System.out.println("11111");
          System.out.println(id);
     }

     @EventListener
     @Async
     public void ㄴecondEventListener(TestDto dto) {
         String id = event.getId();
          System.out.println("22222");
          System.out.println(id);
     }

     @EventListener
     @Async
     public void thirdEventListener(Long event) {
         Long id = event;
         System.out.println("33333");
         System.out.println(id);
     }
}

@Component 를 통해서 bean 으로 역시 등록하였고,

이렇게 되면 publishEvent 에서 인자 타입에 따라 각각에 맞는 event 가 동작을 하게 된다.


참고 포스팅

https://thenicesj.tistory.com/259

 

Apache Kafka 란?

Apache Kafka 에 대해서 알아보려고 한다. 카프카(Kafka)는 2011년 미국 링크드인(Linkedin)에서 개발했다. 카프카 이전에는 다음 그림과 같이 모든 것들이 서로 연관되어서 결합력이 높았다. 하지만 결합

thenicesj.tistory.com

 

반응형

댓글