티스토리 뷰

최근에 사용자가 로그만 보고 어플리케이션이 언제 종료되었는지 알고 싶다는 요구사항이 있었다.

 

이처럼 어플리케이션이 시작할 때, 종료될 때, 실패했을 때 등과 같이 어떤 이벤트가 있을 때, 특정 작업을 수행하게 하는건 언제든지 필요할 수 있으므로, 이번 기회를 통해 종료 상황에 특정 작업을 수행하는 샘플 코드를 작성해보려고 한다.

 

요구사항에 필요한 존재다

 

 

1. 샘플 프로젝트 준비

어떤 이벤트가 발생했을 때 특정 작업을 수행하기 위해 ApplicationListener 인터페이스를 사용할 예정이고, 샘플 코드에서는 ShutdownEventListener가 구현체가 될 예정이다. 그리고 어플리케이션을 기동하고 바로 종료되지 않도록 spring-boot-starter-web을 의존성으로 추가했다.

 

아래에 링크로 달아둔 샘플 코드를 보면 알 수 있겠지만, 크게 복잡할 것 없는 내용이다.

 

 

 

2. 리스너 추가 전

리스너(ShutdownEventListener)가 없는 상황에서 어플리케이션을 종료하면 몇 가지 로그가 남긴하지만, 유저 친화적인 메세지는 남지 않는다.

 

 

 

3. 리스너 추가 후

요구사항대로 유저가 직관적으로 어플리케이션이 종료되었음을 알 수 있도록 리스너를 생성하여 로그 메세지를 출력한다. 단, 어플리케이션이 종료되는 시점에 메세지를 출력해야 하므로 어플리케이션 이벤트는 ContextClosedEvent로 설정한다.

 

 

ShutdownEventListener

@Slf4j
@Component
public class ShutdownEventListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        log.info("application shutdown!");
    }
}

 

 

결과

 

 

리스너를 추가하여 어플리케이션이 종료되는 시점에 별도의 로그 메세지를 남길 수 있게 되었다.

 

요구사항은 단순히 로깅을 남기는 것에 그쳤지만, 리스너 메소드에 다른 로직을 넣어서 처리하거나 대상 이벤트 자체를 변경한다면 다양한 상황에 맞춰 특정 작업을 수행할 수 있을 것이다.

 

 


샘플 코드 🤓

 

참고 자료 🙇‍♂️

댓글