본문 바로가기
Spring

[Spring] Spring의 Event 처리 과정

by gudwnsgur 2022. 3. 15.
728x90

Event

  • Spring의 bean과 bean 사이의 데이터를 전달하는 방법 중 하나
  • Bean A 에서 이벤트를 ApplicationContext로 넘겨주고 이를 Listener에서 받아 처리
  • 이벤트를 발생시키는 publisher & 이를 받아들이는 listener & event 데이터를 담는 event모델
  • publisher와 이를 구독하는 Observer 사이의 결합도를 낮추면서 이벤트를 전달하고자 할 때 사용

 

Event Model

  • ApplicationEvent를 상속받고 객체를 전달 ( Spring 4.2부터는 상속받을 필요 X )
  • 이 내부의 Object는 일반적으로 publisher를 가지고 있는 객체를 사용
public class MemberEvent {

    private String name;
    private int age;

    public MemberEvent() {
        this("Hyoung", 26);
    }

    public MemberEvent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
}

 

Event Publisher

  • event를 생성하기 위한 bean은 ApplicationEventPublisher
  • event의 object param으로 본인 객체인 this를 주며 인스턴스를 만든 후 publishEvent의 param으로 넘기면 event가 생성

   ApplicationEventPulbisher

  • Spring에서 지원하는 ApplicationEvnetPublisher를 이용한 Event 처리 방식은 ApplicationContext를 통해서 이루어진다. ApplicationContextApplicationEventPublisher를 상속하고 있다. 즉 Publisher와 Listener는 Spring에 Bean으로 등록되어야 한다. Spring이 초기화될 때 @EventListener, @TransactionalEventListenerApplicationContext에 등록을 해두고 publishEvent()가 실행되면 등록된 Listener에 Event를 뿌려준다.
@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ApplicationEventPublisher eventPublisher;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        eventPublisher.publishEvent(new MemberEvent("Hyoung", 100));    // 이벤트 발생시키기
    }
}

 

Event Listener

  • Publisher에서 발행된 event를 사용하는 부분
  • Listener를 만들기 위해 ApplicationListener<[EVENT_NAME]>을 상속받아야 한다.
  • onApplicationEvent를 오버라이딩하여 event 소비 ( Spring 4.2부터는 구현할 필요 X )
  • @EventListener 어노테이션을 통해 이벤트 사용
@Component
public class MyEventHandler{

    @EventListener
    public void onMyEvent(MemberEvent event) {
        System.out.println("First event handling");
        System.out.println("name : " + event.getName());
        System.out.println("age : " + event.getAge());
    }
}
728x90

'Spring' 카테고리의 다른 글

Spring Batch란?  (0) 2022.03.22
Spring 면접 질문 모음  (0) 2021.11.21
스프링 핵심 원리  (0) 2021.11.11

댓글