ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 부트 - 실패 분석기
    Web/환경설정 관련 2024. 5. 14. 12:59

     

    실패 분석기란 

    • 애플리케이션에서 발생한 실패/예외를 감지하고 해당 이슈를 이해하는 데 도움이 되는 정보 제공 

    장점

    • 에러에 대한 상세한 메시지를 제공해서 문제의 근본 원인과 해결책을 결정할 수 있게 돕는다.
    • 애플리케이션 시작 시점에 검증을 수행해서 발생할 수 있는 에러를 가능한 빨리 파악할 수 있다. 

     


    1. 실패 분석 시나리오 

     

    요구 사항

    • 의존하고 있는 외부 REST 서비스를 사용할 수 있는지 애플리케이션 시작 시점에 확인
    • 서비스 사용 불가 시 상세한 내용 확인

    시나리오

    • 애플리케이션이 강아지의 상세 정보를 외부 API https://dog.ceo/dog-api/에서 가져온다.
    • 해당 API가 제대로 작동하지 않으면, 애플리케이션을 실행할 수 없음으로 API상태를 점검해야한다. 

    작업 절차 

    • ContextRefreshedEnvent를 사용해서 검증 프로세스를 구동한다. (애플리케이션 시작 시점)
    • API가 사용할 수 없는 상태라면, 런타임 에러를 던진다. (UrlNotAccessibleException - 사용자 지정 예외)
    • 해당 예외가 발생하면, 호출되는 UrlNotAccessibleFailureAnalyzer를 작성한다.
    • 마지막으로, spring.factories 파일에 위 클래스를 이용하여 작업을 수행한다.
      • spring.factories는 src/main/java/META-INF 디렉터리에 있는 파일로 애플리케이션 시작 시점에 스프링으로 로딩하는 특수 파일이다. 여러 가지 설정 클래스에 대한 참조가 포함돼 있다.

     


    2. 커스텀 실패 분석기 생성 

    • 먼저 간단한 RuntimeException을 하나 만들자 
    • 아래 예외는 url이 접근 불가능할 때 발생하는 예외이다.
    import lombok.Getter;
    
    @Getter
    public class UrlNotAccessibleException extends RuntimeException{
        private String url;
    
        public UrlNotAccessibleException(String url){
            this(url,null);
        }
    
        public UrlNotAccessibleException(String url, Throwable cause){
            super("URL "+url+"is not accessible",cause);
            this.url = url;
        }
    }
    • 다음으로 애플리케이션 시작 혹은 재시작에 작동하는 핸들러를 작성하자 
    • 임의로 작성한 url은 접근 불가능하다. 따라서 예외를 던진다.
    @Component
    public class UrlAccessibleHandler {
        @Value("${api.url:https://dog.ceo/}")
        private String url;
    
        @EventListener(classes = ContextRefreshedEvent.class)
        public void listen(){
            //외부 API URL에 접근 할 수 없는 상태이다.
            throw  new UrlNotAccessibleException(url);
        }
    }
    • UrlNotAccessibleException예외에 대한 실패 분석기 클래스를 만들자 
    • AbstractFailureAnalyzer 클래스를 상속하고, analyze 메서드를 작성하면 된다. 
    • 해당 메서드는 FailureAnlysis 클래스를 return한다. 해당 클래스 생성자에는 에러메시지, 해야할 행동, 예외클래스 순서로 파라미터를 넣으면 된다.
    public class UrlNotAccessibleFailureAnalyzer extends AbstractFailureAnalyzer<UrlNotAccessibleException> {
    
        @Override
        protected FailureAnalysis analyze(Throwable rootFailure, UrlNotAccessibleException cause) {
    
            //에러 메시지, 행동, 발생한 예외로 이루어짐
            return new FailureAnalysis("Unable to access URL ="+cause.getUrl(),
                    "Validate the URL and ensure it is accessible",cause);
        }
    }
    • 마지막으로, scr/main/resources/META-INF/spring.factories 파일에 다음을 작성하면 등록이 완료된다.
    • 해당 파일과 경로가 없다면, 만들면 된다.
    org.springframework.boot.diagnostics.FailureAnalyzer=\
    com.example.manyConfig.config.failure.UrlNotAccessibleFailureAnalyzer
    
    //여러개의 실패분석기를 등록하고 싶으면, 해당 실패분석기 구현체에 전체 경로를 ,로 구분해서 넣으면 된다.
    • org.springframework.boot.diagnostics.FailureAnalyzer가 키 값이 구현체 전체 경로이다. 
    • \은 그냥 띄어쓰기 이어쓰기 용도로 삽입한 것 -> Linux나 git cli에서 \ 넣어서 명령어 여러개 적는 거랑 같은 용도임

    • 결론적으로 다음과 같이 잘 정리된 에러 로그를 확인할 수 있다.

    참고자료

    https://www.baeldung.com/spring-boot-failure-analyzer

     

    https://www.yes24.com/Product/Goods/122002340

Designed by Tistory.