Web/환경설정 관련

스프링 부트 - 실패 분석기

now0204 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