kkkkkkkkkkkk
kkkkk
kkkkkkkkkkkk
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS & OS
    • Algorithms
    • Laguage
    • Book
      • 객체지향의 사실과 오해
      • Effective Java
      • Spring boot 와 AWS로 혼자 구현하는 ..
      • 도메인 주도 계발 시작하기
    • DB
    • Spring
    • Spring Boot
    • JPA
    • Git
    • Clean Code
    • HTTP

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 결합도
  • 역할
  • 객체지향 프로그래밍
  • 설계 원칙
  • 책임
  • 응집도

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kkkkkkkkkkkk

kkkkk

Spring

[Spring] EventPublisher 를 알아보자

2022. 9. 22. 22:24

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
    'Spring' 카테고리의 다른 글
    • REST API (RESTful API)
    • [스프링 웹 MVC 동작 원리] Dispatcher Servlet 동작 원리
    • [스프링 웹 MVC 동작 원리] Front Controller 가 무엇인가요?
    • [스프링 웹 MVC 동작 원리] Servlet 환경에서 Spring Ioc Container 활용
    kkkkkkkkkkkk
    kkkkkkkkkkkk

    티스토리툴바