스프링에서 제공하는 이벤트 메커니즘을 사용하면 의존성이 강한 로직들의 레이어를 분리가 가능하다. 이렇게 되면 느슨한 결합 형태로 만들 수 있다. 예를 들어 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 어노테이션을 사용 가능)
정리
- 이벤트를 사용할 서비스 로직에서 ApplicationEventPublisher를 주입 받는다
- ApplicationEventPublisher의 publishEvent 메서드을 이용해 이벤트를 발행한다
- 이때 publishEvent 메서드의 파라미터로 이벤트 객체를 전달한다
- @EventListener 어노테이션의 선언된 이벤트 객체가 전달되며 해당 서비스 로직이 실행되게 된다.
비동기 처리
추가적으로 해당 이벤트가 비동기로 처리되어야 할 경우에는 해당 서비스 메서드에 @Async 어노테이션을 선언해주고 Application 클래스에 @EnableAsync를 같이 선언해준다.
'Spring' 카테고리의 다른 글
스프링부트에서 톰캣이 어떻게 자동으로 설정되어 실행되는가 (0) | 2023.01.16 |
---|---|
스프링 트랜잭션 @Transactional(readOnly=true) (0) | 2022.12.09 |
@RestControllerAdvice를 활용한 예외처리 (0) | 2022.09.06 |
Spring - 서블릿과 디스패쳐서블릿 (0) | 2022.09.04 |
@NotFound 어노테이션 (0) | 2022.08.03 |
댓글