본문 바로가기

개발중/Spring Boot

ApplicationListener 를 이용해서 어플리케이션 기동시 에러날 경우에 대처하기.

728x90
반응형

개요

CI/CD 환경에서 애플리케이션을 배포할 때는, 수동 배포와 달리 애플리케이션 기동 중 발생하는 에러를 즉각적으로 파악하기 어려울 수 있습니다. 수동 배포의 경우, 직접 로그를 확인하며 에러를 바로 인지할 수 있지만 CI/CD 파이프라인을 통해 자동화된 배포가 이루어질 때는 이를 실시간으로 감지하고 대응하기가 쉽지 않습니다.

 

이러한 상황을 해결하기 위해, 애플리케이션이 기동 중에 에러가 발생하면 즉시 알림을 받을 수 있도록 설정할 수 있습니다. ( 물론 다양한 방법이 있지만 그중에 하나 입니다. ),  이를 위해 Spring의 ApplicationListener와 ApplicationFailedEvent를 활용할 수 있습니다. ApplicationFailedEvent는 애플리케이션 로딩 중 예외가 발생했을 때 트리거되는 이벤트로, 이를 감지해 이메일이나 슬랙 등의 알림을 전송하는 로직을 구현하면, 애플리케이션 기동 중 발생한 에러에 대해 신속하게 대응할 수 있습니다.

 

이를 통해 CI/CD 배포 중 애플리케이션 기동 시 발생하는 문제를 자동으로 감지하고, 필요한 알림을 받을 수 있는 환경을 구축할 수 있습니다.

 

목표

애플리케이션 기동 중 에러가 발생했을 때 텔레그램 알림을 전송하여 신속하게 에러를 확인하고 대응할 수 있는 시스템을 구축하는 것을 목표로 합니다.

 

onApplicationEvent 

onApplicationEvent 메서드는 Spring에서 특정 이벤트가 발생했을 때 호출되는 메서드입니다. 이 메서드를 구현한 클래스는 Spring 애플리케이션의 다양한 이벤트에 반응하여 특정 로직을 처리할 수 있습니다. Spring은 애플리케이션의 라이프사이클 동안 여러 이벤트를 발생시키며, 이 이벤트들이 발생하는 시점에 맞춰 onApplicationEvent가 호출됩니다.

 

주요 Spring 이벤트 및 호출되는 상황

  1. ContextRefreshedEvent:
    • 호출 시점: 애플리케이션 컨텍스트가 초기화되거나 리프레시될 때.
    • 사용 예시: 애플리케이션이 정상적으로 시작된 후, 초기화 작업을 처리할 때.
  2. ContextStartedEvent:
    • 호출 시점: 애플리케이션 컨텍스트가 시작될 때 (start() 메서드 호출 시).
    • 사용 예시: 백그라운드 작업이 시작되었을 때 필요한 로직을 처리할 때.
  3. ContextStoppedEvent:
    • 호출 시점: 애플리케이션 컨텍스트가 중지될 때 (stop() 메서드 호출 시).
    • 사용 예시: 애플리케이션 중지 전 백그라운드 작업을 종료하거나 정리할 때.
  4. ContextClosedEvent:
    • 호출 시점: 애플리케이션 컨텍스트가 닫힐 때 (close() 메서드 호출 시).
    • 사용 예시: 리소스를 정리하거나 애플리케이션 종료 시 필요한 작업을 처리할 때.
  5. ApplicationFailedEvent:
    • 호출 시점: 애플리케이션이 시작 중 실패했을 때.
    • 사용 예시: 애플리케이션이 기동 중 예외가 발생했을 때, 알림을 보내거나 로그를 남기는 후속 작업을 처리할 때.
  6. ApplicationReadyEvent:
    • 호출 시점: 애플리케이션이 완전히 시작된 후.
    • 사용 예시: 애플리케이션이 준비된 후 최종 초기화 작업을 처리하거나 외부 시스템과 상호작용할 때.
  7. ApplicationStartedEvent:
    • 호출 시점: 애플리케이션이 실행을 시작할 때.
    • 사용 예시: 애플리케이션 시작 시 필요한 초기화 작업을 처리할 때.
  8. 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 이벤트를 활용하면 쉽게 이러한 알림 시스템을 구현할 수 있습니다.

728x90
반응형