티스토리 뷰
최근에 사용자가 로그만 보고 어플리케이션이 언제 종료되었는지 알고 싶다는 요구사항이 있었다.
이처럼 어플리케이션이 시작할 때, 종료될 때, 실패했을 때 등과 같이 어떤 이벤트가 있을 때, 특정 작업을 수행하게 하는건 언제든지 필요할 수 있으므로, 이번 기회를 통해 종료 상황에 특정 작업을 수행하는 샘플 코드를 작성해보려고 한다.
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!");
}
}
결과
리스너를 추가하여 어플리케이션이 종료되는 시점에 별도의 로그 메세지를 남길 수 있게 되었다.
요구사항은 단순히 로깅을 남기는 것에 그쳤지만, 리스너 메소드에 다른 로직을 넣어서 처리하거나 대상 이벤트 자체를 변경한다면 다양한 상황에 맞춰 특정 작업을 수행할 수 있을 것이다.
샘플 코드 🤓
참고 자료 🙇♂️
'스프링' 카테고리의 다른 글
[Spring] 어플리케이션 종료 시 들어온 요청은 처리하고 마치기(graceful shutdown) (0) | 2023.11.05 |
---|---|
[Spring] @SpringBootApplication가 없는 상황에서 @SpringBootTest 수행하기 (0) | 2023.08.05 |
[Spring] 초기 데이터 로딩(data.sql, schema.sql) (0) | 2023.06.02 |
[Spring] 주기적인 작업 구현하기(feat. Scheduling Tasks) (0) | 2023.04.01 |
[Spring Integration] 소개 및 튜토리얼 (0) | 2023.03.18 |