훈훈훈

Spring boot :: Kotlin으로 Event Listener 사용하기 본문

Spring Framework/Kotlin

Spring boot :: Kotlin으로 Event Listener 사용하기

훈훈훈 2020. 7. 27. 00:22

이번에는 Spring boot에서 Event Listener를 사용하는 것에 대하여 정리해보려고 한다.

 

Event Listener를 사용하게된 계기는 Spring boot Application 시작 및 종료 시 특정 이벤트를 수행시키기 위해서 여러 방법을 찾던 중 가장 나은 방법으로 판단하게 되어 사용하게 되었다.

 

비슷한 기능으로는 @PostConstruct와 @PreDestory가 있지만 해당 기능은 Bean이 생성 시점에 실행되기 때문에 이벤트가 실행되는 시점은 내가 원하는 시점과 약간 차이가 발생한다. 따라서 해당 기능은 사용하지 않고 Event Listener를 사용하였다.  

 

 

예제 코드


@Component
class StartTest {

    private val logger = LoggerFactory.getLogger(this::class.java)

    @EventListener
    fun onApplicationEvent(event: ApplicationStartedEvent) {
        logger.info("Application Start !!")
    }
}


@Component
class CloseTest {

    private val logger = LoggerFactory.getLogger(this::class.java)

    @EventListener
    fun onApplicationEvent(event: ContextClosedEvent) {
        logger.info("Context Closed")
    }
}

 

예제 코드는 위와 같다. 

Application이 시작할때 "Application Start !!" 라는 로그를 찍는 StartTest 클래스와 종료 시 "Contexted Closed" 로그를 찍는 CloseTest 클래스 두 개를 만들었다.

 

Application 시작 시에는 ApplicationStartedEvent 클래스를 상속 받아 인자로 넘겼고, 종료 시에는 마찬가지로 ContextClosedEvent 클래스를 상속 받아 인자로 넘겼다.

 

각각의 클래스에 대한 자세한 내용은 공식 문서에서 확인할 수 있으며, 아래 링크 참고 바란다.

ApplicationStartedEvent

ContextedClosedEvent

ApplicationStartedEventApplicationStartedEventㅁ

위의 코드는 스프링 4.2에서 부터 사용할 수 있는 @EventListener 를 사용하였다.

 

이전에는 ApplicationListener를 상속 받은 후에 사용할 수 있었지만, 이제는 @EvnetListener 붙여주면 기능은 그대로 사용하면서 코드를 간결하게 작성할 수 있다.

 

이제는 @EventListener를 사용하면 간단하게 작성할 수 있지만, 그래도 코드 동작 이해를 위해 ApplicationListener를 사용하면 아래와 같이 작성할 수 있다.

 

@Component
class StartEvent: ApplicationListener<ApplicationStartedEvent> {

    private val logger = LoggerFactory.getLogger(this::class.java)

    override fun onApplicationEvent(event: ApplicationStartedEvent) {
        logger.info("started!!")
    }
}


@Component
class CloseEvent: ApplicationListener<ContextClosedEvent> {

    private val logger = LoggerFactory.getLogger(this::class.java)

    override fun onApplicationEvent(event: ContextClosedEvent) {
        logger.info("Closed!!")
    }
}

 

실행 결과


Comments