개요
CI/CD 환경에서 애플리케이션을 배포할 때는, 수동 배포와 달리 애플리케이션 기동 중 발생하는 에러를 즉각적으로 파악하기 어려울 수 있습니다. 수동 배포의 경우, 직접 로그를 확인하며 에러를 바로 인지할 수 있지만 CI/CD 파이프라인을 통해 자동화된 배포가 이루어질 때는 이를 실시간으로 감지하고 대응하기가 쉽지 않습니다.
이러한 상황을 해결하기 위해, 애플리케이션이 기동 중에 에러가 발생하면 즉시 알림을 받을 수 있도록 설정할 수 있습니다. ( 물론 다양한 방법이 있지만 그중에 하나 입니다. ), 이를 위해 Spring의 ApplicationListener와 ApplicationFailedEvent를 활용할 수 있습니다. ApplicationFailedEvent는 애플리케이션 로딩 중 예외가 발생했을 때 트리거되는 이벤트로, 이를 감지해 이메일이나 슬랙 등의 알림을 전송하는 로직을 구현하면, 애플리케이션 기동 중 발생한 에러에 대해 신속하게 대응할 수 있습니다.
이를 통해 CI/CD 배포 중 애플리케이션 기동 시 발생하는 문제를 자동으로 감지하고, 필요한 알림을 받을 수 있는 환경을 구축할 수 있습니다.
목표
애플리케이션 기동 중 에러가 발생했을 때 텔레그램 알림을 전송하여 신속하게 에러를 확인하고 대응할 수 있는 시스템을 구축하는 것을 목표로 합니다.
onApplicationEvent
onApplicationEvent 메서드는 Spring에서 특정 이벤트가 발생했을 때 호출되는 메서드입니다. 이 메서드를 구현한 클래스는 Spring 애플리케이션의 다양한 이벤트에 반응하여 특정 로직을 처리할 수 있습니다. Spring은 애플리케이션의 라이프사이클 동안 여러 이벤트를 발생시키며, 이 이벤트들이 발생하는 시점에 맞춰 onApplicationEvent가 호출됩니다.
주요 Spring 이벤트 및 호출되는 상황
- ContextRefreshedEvent:
- 호출 시점: 애플리케이션 컨텍스트가 초기화되거나 리프레시될 때.
- 사용 예시: 애플리케이션이 정상적으로 시작된 후, 초기화 작업을 처리할 때.
- ContextStartedEvent:
- 호출 시점: 애플리케이션 컨텍스트가 시작될 때 (start() 메서드 호출 시).
- 사용 예시: 백그라운드 작업이 시작되었을 때 필요한 로직을 처리할 때.
- ContextStoppedEvent:
- 호출 시점: 애플리케이션 컨텍스트가 중지될 때 (stop() 메서드 호출 시).
- 사용 예시: 애플리케이션 중지 전 백그라운드 작업을 종료하거나 정리할 때.
- ContextClosedEvent:
- 호출 시점: 애플리케이션 컨텍스트가 닫힐 때 (close() 메서드 호출 시).
- 사용 예시: 리소스를 정리하거나 애플리케이션 종료 시 필요한 작업을 처리할 때.
- ApplicationFailedEvent:
- 호출 시점: 애플리케이션이 시작 중 실패했을 때.
- 사용 예시: 애플리케이션이 기동 중 예외가 발생했을 때, 알림을 보내거나 로그를 남기는 후속 작업을 처리할 때.
- ApplicationReadyEvent:
- 호출 시점: 애플리케이션이 완전히 시작된 후.
- 사용 예시: 애플리케이션이 준비된 후 최종 초기화 작업을 처리하거나 외부 시스템과 상호작용할 때.
- ApplicationStartedEvent:
- 호출 시점: 애플리케이션이 실행을 시작할 때.
- 사용 예시: 애플리케이션 시작 시 필요한 초기화 작업을 처리할 때.
- ApplicationEnvironmentPreparedEvent:
- 호출 시점: 애플리케이션 컨텍스트가 생성되기 전에 환경이 준비된 후.
- 사용 예시: 애플리케이션의 환경 설정이나 프로파일에 대해 작업이 필요할 때.
코드
ApplicationFailedEvent는 애플리케이션이 로딩 중 예외가 발생할 때 호출되는 이벤트로, 이를 감지해 텔레그램 알림을 전송하도록 설정할 수 있습니다. 이 방법을 사용하면 애플리케이션 기동 중 발생한 문제를 즉시 감지하고 알림을 받을 수 있습니다.
import ??.TelegramUtil;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class ApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {
/**
* 애플리케이션 로딩 중 에러가 발생했을 때 실행
*/
@Override
public void onApplicationEvent(ApplicationFailedEvent event) {
Throwable exception = event.getException();
sendErrorNotification(exception);
}
/**
* 에러 알림 전송
*/
private void sendErrorNotification(Throwable ex) {
String title = "✅ Application 실행중 에러가 발생했습니다.";
String message = ex.getMessage();
TelegramUtil.sendMessage(title, message);
}
}
결론
CI/CD 환경에서 자동화된 배포 중 애플리케이션 기동 시 발생하는 에러를 실시간으로 감지하고, 텔레그램 등의 알림 서비스를 통해 즉시 통지받을 수 있도록 설정할 수 있습니다. 이를 통해 문제를 신속하게 파악하고 대응하여 시스템의 안정성을 높일 수 있습니다. ApplicationFailedEvent와 같은 Spring 이벤트를 활용하면 쉽게 이러한 알림 시스템을 구현할 수 있습니다.
'개발중 > Spring Boot' 카테고리의 다른 글
Mono와 Flux의 차이점과 활용법 - Spring WebFlux (0) | 2024.06.11 |
---|---|
Spring Boot 3와 WebClient: 비동기식 HTTP 요청을 쉽게 구현하기 (0) | 2024.06.11 |