Kotlin

@EventListener

Hcode 2023. 2. 14.

 


 

@EventListener란

 

Kotlin에서 @EventListener 애노테이션은

  메서드를 이벤트 핸들러로 지정하기 위해 Spring Framework와 함께 사용됩니다.

    (해당 메서드를 포함하는 클래스를 bean으로 등록하여)

 

@EventListener 애노테이션이 달린 메서드는

  특정 이벤트가 publish 될 때,

    자동으로 호출됩니다.

 


 

@EventListener를 사용하는 이유

Spring Framework에서 @EventListener 애노테이션은

  애플리케이션 이벤트에 대한 응답으로 호출할 메서드를 등록하는 방법입니다.

애플리케이션 이벤트는

   어떤 일이 발생했음을, 관심 있는 그룹에 알리기 위해

    애플리케이션 컨텍스트에서 게시하는 메시지입니다.

이러한 이벤트는

  애플리케이션 자체 또는 메시지 큐, 데이터베이스 또는 웹 서버와 같은 외부 시스템에 의해 트리거 될 수 있습니다.

@EventListener를 사용하면

  특정 애플리케이션 이벤트에 대한 리스너로 메서드를 쉽게 등록할 수 있으므로

    이벤트를 생성하는 코드와 이벤트를 처리하는 코드를 긴밀하게 연결하지 않고도 이벤트에 반응할 수 있습니다.

이것은 Observer 패턴으로 알려져 있으며 코드를 모듈화하고 유연하게 유지하는 데 도움이 됩니다.

 


 

주요 이점

Decoupling

  : @EventListener는 이벤트 생산자와 이벤트 소비자를 분리하여,

    코드를 보다 모듈화하고 유지 관리하기 쉽게 만듭니다.

Customization

  : 이벤트를 비동기적으로 처리하는 @Async 또는 트랜잭션 컨텍스트에서 이벤트를 처리하는 @Transactional과 같은 추가 애노테이션을 추가하여,

    이벤트 처리를 사용자 지정할 수 있습니다.

유연성

  : 동일한 이벤트에 대해 여러 이벤트 수신기를 정의할 수 있으므로,

    복잡한 이벤트 처리 논리를 구현할 수 있습니다.

테스트 용이성

  : @EventListener를 사용하면 이벤트를 게시하고 올바른 메서드가 응답으로 호출되는지 확인하는 테스트를 작성하여,

    이벤트 처리 로직을 쉽게 테스트할 수 있습니다.

확장성: @EventListener를 사용하면 이벤트 처리를 여러 노드에 분산하여 애플리케이션을 확장할 수 있으므로,

    대량의 이벤트를 더 쉽게 처리할 수 있습니다.

 


 

예제

단건 등록 예제,

복수 등록 예제,

필터 사용 예제를 보이겠습니다.


 

단건 등록 예제

import org.springframework.context.event.EventListener
import org.springframework.stereotype.Component

@Component
class UserEventListener {

    @EventListener
    fun handleUserCreatedEvent(event: UserCreatedEvent) {

        println("Received UserCreatedEvent for user: ${event.user}")
    }
}

handleUserCreatedEvent 메서드는

  @EventListener로 애노테이션 처리됩니다.

 

UserCreatedEvent가 publish 되면,

  이 메서드가 자동으로 호출되고 이벤트를 처리할 수 있습니다.

 

@Component 애노테이션은

  이 클래스를 Spring Framework에서 관리하는 bean으로 만듭니다.

 


 

복수 등록 예제

각각 다른 이벤트 유형을 가진 @EventListener 메서드를 추가하여

  여러 @EventListener를 동일한 클래스에 등록할 수 있습니다.

 

import org.springframework.context.event.ContextStartedEvent
import org.springframework.context.event.EventListener
import org.springframework.stereotype.Component

@Component
class MyEventListener {

    @EventListener
    fun handleContextRefresh(event: ContextRefreshedEvent) {
        println("Received context refreshed event")
    }

    @EventListener
    fun handleContextStarted(event: ContextStartedEvent) {
        println("Received context started event")
    }
}

MyEventListener는

  ContextRefreshedEvent 및 ContextStartedEvent 이벤트를 모두 수신합니다.

 

두 이벤트 중 하나가 publish 되면,

  해당 메서드가 호출되고 적절한 메시지가 콘솔에 출력됩니다.

 


 

필터 사용 예제

@EventListener 애노테이션은

  메서드가 처리해야 하는 이벤트를 필터링하기 위해

    조건식과 함께 사용할 수도 있습니다.

 

예를 들어 다음 코드는

  특정 애플리케이션 컨텍스트에서 게시한 ContextRefreshedEvent 이벤트만 처리합니다.

 

import org.springframework.context.ApplicationContext
import org.springframework.context.event.ContextRefreshedEvent
import org.springframework.context.event.EventListener
import org.springframework.stereotype.Component

@Component
class MyEventListener(private val context: ApplicationContext) {

    @EventListener(condition = "#event.applicationContext == #context")
    fun handleContextRefresh(event: ContextRefreshedEvent) {
        println("Received context refreshed event from the correct context")
    }
}

MyEventListener는 현재 ApplicationContext를 주입받습니다.

handleContextRefresh 메서드는

  삽입된 인스턴스와 동일한 ApplicationContext가 있는 ContextRefreshedEvent 이벤트만 처리합니다.

 

이는 여러 애플리케이션 컨텍스트가 사용 중이고 올바른 컨텍스트에 속한 리스너만 이벤트를 처리해야 하는 상황에서 유용할 수 있습니다.


 

요약

요약하면 Kotlin의 @EventListener 애노테이션은

  메서드를 이벤트 리스너로 등록할 수 있는 Spring Framework의 기능입니다.

 

@EventListener를 사용하면,

  코드를 Decoupling하고, 이벤트 처리를 Customization하고, 복잡한 논리를 구현하고, 코드를 테스트하고, 애플리케이션을 확장할 수 있습니다.

 

이러한 리스너는

  조건식을 사용하여 유형 또는 기타 속성을 기반으로 이벤트를 필터링할 수 있습니다.

 

여러 리스너를 동일한 클래스에 등록할 수 있으므로,

  복잡한 이벤트 처리 논리를 단일 구성 요소에 캡슐화할 수 있습니다.

 


 

'Kotlin' 카테고리의 다른 글

고차 함수(higher-order functions)  (0) 2023.02.17
코루틴  (0) 2023.02.16

댓글