본문 바로가기
Spring

Spring - Event Publisher Listener (1) 정의

by devLog by Ronnie's 2022. 10. 19.

스프링에서 제공하는 이벤트 메커니즘을 사용하면 의존성이 강한 로직들의 레이어를 분리가 가능하다. 이렇게 되면 느슨한 결합 형태로 만들 있다. 예를 들어 A 서비스 로직에서 B 서비스 로직을 실행해야하는 경우 이벤트 발행을 통해 분리할 있는 것이다. 이때 사용하는 이벤트에 관련한 정보를 정리한다.

 

 

Spring - Event Publisher Listener (1) 정의

 

스프링에서의 일반적 상황과 이벤트를 이용한 상황


스프링에서는 내부에 이벤트라는 메커니즘을 가지고 있다. 여기서 말하는 이벤트란 스프링의 빈과 빈 사이에 데이터를 전달하는 방법 중 하나를 의미한다.

 

스프링에서는 일반적으로 데이터 전달 DI 통해서 이루어진다. A 클래스에서 B 클래스에 대한 의존성을 주입을 받아 A클래스에서 B 대한 메서드를 호출해서 본인의 클래스에서 사용을 있게 된다. 하지만 이벤트는 이와는 다른 메커니즘으로 동작한다. A에서 이벤트를 ApplicationContext 넘겨주고 이를 Listener에서 받아 처리하게 된다.

 

이벤트는 이벤트를 발생시키는 publisher 이것을 받아들이는 listener 있다. 그리고 Event에서 데이터를 담는 Event 모델로 이루어져 있다.

 

 

Event


이벤트 객체는 아래와 같이 Event Publisher에서 사용되며 사용되는 형태는 아래와 같이 두가지 형태로 이용가능하다.

ApplicationEvent 클래스를 상속 받아서 사용할 수도 있고 이벤트 객체를 직접 만들어서도 사용 가능하다.

 

Event Publisher


이벤트를 사용하기 위해서는 ApplicationEventPublisher 주입 받고 publishEvent 메서드를 이용하면 이벤트 객체를 파라미터로 넘기면 이벤트가 생성되게 된다.

 

Event Listener


이렇게 발생된 이벤트를 받아주는 역할을 하는 것이 Event Listener이다.  Event Publisher에서 발행된 이벤트를 사용하는 부분이 Event Listener이며 Event Listener 사용하기 위해서는 @EventListener 어노테이션을 통해 사용 가능하다. (기존에는 이벤트 핸들러인ApplicationListener 구현해야 됐지만 스프링 4 버전 이상으로 올라오면서 @EventListener 어노테이션을 사용 가능)

 

 

정리


  1. 이벤트를 사용할 서비스 로직에서 ApplicationEventPublisher를 주입 받는다
  2. ApplicationEventPublisher의 publishEvent 메서드을 이용해 이벤트를 발행한다
  3. 이때 publishEvent 메서드의 파라미터로 이벤트 객체를 전달한다
  4. @EventListener 어노테이션의 선언된 이벤트 객체가 전달되며 해당 서비스 로직이 실행되게 된다.

 

비동기 처리


추가적으로 해당 이벤트가 비동기로 처리되어야 경우에는 해당 서비스 메서드에 @Async 어노테이션을 선언해주고 Application 클래스에 @EnableAsync 같이 선언해준다.

 

댓글