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
를 통해서 이루어진다.ApplicationContext
가ApplicationEventPublisher
를 상속하고 있다. 즉 Publisher와 Listener는 Spring에 Bean으로 등록되어야 한다. Spring이 초기화될 때@EventListener
,@TransactionalEventListener
를ApplicationContext
에 등록을 해두고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 |