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