EventPublisher를 사용하여 알림 서비스를 만들 수 있다.
알림 서비스를 만들기 전에 EventPulisher에 대해 간단히 알아보자.
ApplicationEventPublisher 는 ApplicationContext가 상속 받고 있는 인터페이스다.
해당 인터페이스를 사용하여 알림을 받는 간단 예제 코드를 만들어 볼 것이다.
ApplicationEventPublisher
회원 가입이라는 이벤트가 발생 할 때 해당 이벤트를 받아 올 수 있다.
MyEvent 클래스를 생성
이벤트 데이터로 가입자명 을 받을 것이다.
public class MyEvent {
private String createName;
public MyEvent() {}
public MyEvent(String createName) {
this.createName = createName;
}
public String getCreateName() {
return createName;
}
}
EventHandler 클래스를 생성하여 해당 이벤트가 발생할 때 이벤트 데이터인 가입자명 을 출력한다.
이 클래스는 Spring Container 에 등록이 되어야 한다.
다음 해당 메서드가 리스너가 알 수 있도록 @EventListener 를 붙여준다.
@Component
public class MyEventHandler {
@EventListener
public void eventHandle(MyEvent event) {
System.out.println("이벤트 받았습니다. " + event.getCreateName());
}
}
create() 메서드가 호출 되고 비지니스 로직처리를 끝낸 다음 ApplicationPubliser 가 이벤트를 호출한다.
@Service
@RequiredArgsConstructor
public class MemberService{
private final MemberRepository memberRepository;
private final ApplicationEventPublisher applicationEventPublisher;
public String create(String name) {
String memberName = memberRepository.save(name);
applicationEventPublisher.publishEvent(new MyEvent(memberName));
return memberName;
}
}
@Repository
public class MemberRepository{
private static final Map<Long, String> map= new HashMap<>();
private static Longsequence= 0L;
public String save(String memberName) {
map.put(sequence++, memberName);
return memberName;
}
}
테스트를 해봅시다.
@Test
@DisplayName("Event Test")
void eventTest() {
// given
String name = "spring";
// when & then
String memberName = memberService.create(name);
// 실행 결과 : 이벤트 받았습니다. spring
}
이벤트가 잘 발생하였음을 알 수 있다,
또한 Event 는 서로 다른 Thread 에서 실행 되는것이 아니라 한 Thread 에서 순차적으로 실행되는(동기식) 특징을 가진다.
@Order 애노테이션으로 순서를 매겨서 순서를 설정 하여 Handler 에 Thread 이름을 같이 출력해보겠습니다.
@Component
public class MyEventHandler {
@EventListener
@Order(Ordered.HIGHEST_PRECEDENCE)
public void eventHandle(MyEvent event) {
System.out.println(Thread.currentThread().getName());
System.out.println("이벤트 받았습니다. " + event.getCreateName());
}
}
@Component
public class AnotherEventHandler {
@EventListener
@Order(Ordered.HIGHEST_PRECEDENCE+ 2)
public void anotherHandler(MyEvent event) {
System.out.println(Thread.currentThread().getName());
System.out.println("Another Event Handler " + event.getCreateName());
}
}
// 실행 결과
// main
// 이벤트 받았습니다. spring
// main
// Another Event Handler spring
Thread 를 비동기식 실행되길 원하면 @Async 애노테이션을 Handler 메서드에 붙여주고 클라이언트에 main에 @EnableAsync 애노테이션을 붙이면 비동기식으로 실행이 된다.
'Spring' 카테고리의 다른 글
REST API (RESTful API) (0) | 2023.01.19 |
---|---|
[스프링 웹 MVC 동작 원리] Dispatcher Servlet 동작 원리 (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] Front Controller 가 무엇인가요? (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] Servlet 환경에서 Spring Ioc Container 활용 (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] ServletFilter 동작 원리 (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] ServletListener 동작 원리 (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] Servlet 동작 원리 (0) | 2022.03.28 |
[스프링 웹 MVC 동작 원리] DispatcherServlet (0) | 2022.01.28 |