Condition Evaluation Report 소개
spring-boot-autoconfigure
를 사용하면 여러 조건에 따라 제공되는 AutoConfiguration 설정들이 활성화 또는 비활성화된다.
예를 들어 DataSource를 사용할 때 DataSource 관련 properties나 bean 설정을 하고 DataSource 관련 jar를 참조하는 경우 DataSourceAutoConfiguration에서 활성화 조건들에 대해 체크한 후 활성화되어 사용자가 일일이 설정하지 않아도 기본적인 설정들을 제공해 준다.
Spring Boot는 어떤 AutoConfiguration이 활성화되고 어떤 AutoConfiguration이 비활성화되었는지 확인할 수 있도록 Condition Evaluation Report
를 제공한다.
Condition Evaluation Report 활성화하기
간단하게 다음처럼 debug
설정을 true
로 활성화하거나 java 실행 시 --debug
argument를 추가하면 Condition Evaluation Report
를 로그에서 확인할 수 있게 된다.
debug=true
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
Condition Evaluation Report는 다음과 같은 항목을 안내해 준다.
- Positive matches : 현재 활성화된 AutoConfiguration 목록
- Negative matches : 현재 비활성화된 AutoConfiguration 목록
- Exclusions : 예외처리 한 AutoConfiguration 목록
- Unconditional classes : conditional 조건이 없는 AutoConfiguration 목록 (활성화된 것으로 보면 됨)
로그에 출력되는 Condition Evaluation Report
전체가 너무 길기 때문에 간략하게 앞에 몇 개만 출력한 예를 들면 다음과 같다.
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches:
-----------------
AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
AopAutoConfiguration.AspectJAutoProxyingConfiguration matched:
- @ConditionalOnClass found required class 'org.aspectj.weaver.Advice' (OnClassCondition)
AopAutoConfiguration.AspectJAutoProxyingConfiguration.CglibAutoProxyConfiguration matched:
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
ApplicationAvailabilityAutoConfiguration#applicationAvailability matched:
- @ConditionalOnMissingBean (types: org.springframework.boot.availability.ApplicationAvailability; SearchStrategy: all) did not find any beans (OnBeanCondition)
// 이하 생략
Negative matches:
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition)
AopAutoConfiguration.AspectJAutoProxyingConfiguration.JdkDynamicAutoProxyConfiguration:
Did not match:
- @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 'proxy-target-class' (OnPropertyCondition)
AopAutoConfiguration.ClassProxyingConfiguration:
Did not match:
- @ConditionalOnMissingClass found unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
AppOpticsMetricsExportAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'io.micrometer.appoptics.AppOpticsMeterRegistry' (OnClassCondition)
// 이하 생략
Exclusions:
-----------
None
Unconditional classes:
----------------------
org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration
org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
// 이하 생략
출력되는 Condition Evaluation Report
에는 Spring Boot가 제공하는 AutoConfiguration
뿐만 아니라 사용자가 직접 작성한 AutoConfiguration
도 포함된다.
이 글에서는 이 부분에 대해 설명을 하진 않지만 Spring Boot AutoConfiguration 기반 application을 개발하고자 하는 경우 해당 문서를 참고하면 된다.
FailureAnalyzers 소개
만약 Spring Boot를 사용하면서 application이 올바르게 startup 하지 않거나 또는 의도한 대로 동작을 하지 않는 경우 FailureAnalyzers
로그가 출력되어 문제가 되는 지점을 확인할 수 있다.
이런 경우엔 FailureAnalyzers
를 통해 등록된 문제가 출력된다.
대략 다음과 같은 형태이다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Embedded servlet container failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that is listening on port 8080 or configure this application to listen on another port.
위의 예에서는 application이 사용하려는 8080 port가 이미 사용중이어서 startup에 실패하였다고 설명하고 있다.
Spring Boot를 사용한 application이 startup 되지 않으면 FailureAnalyzers
의 내용을 확인하고 AutoConfiguration
의 설정 문제는 Condition Evaluation Report
를 통해 확인하면 된다.
'Study > Java' 카테고리의 다른 글
JDK 18 ~ JDK 21 사이 추가된 Feature (0) | 2023.10.05 |
---|---|
JDK 21 New Features (0) | 2023.10.04 |
vaadin 사용해 보기 (0) | 2023.09.19 |
[troubleshooting] Spring Boot 테스트 코드 실행 시 java.lang.NoClassDefFoundError: io/micrometer/context/ThreadLocalAccessor 에러 (0) | 2023.08.18 |
annotation 을 가진 class 검색에 reflection util 대신 Spring TypeFilter 사용으로 대체하기 (0) | 2023.07.31 |
STS Newer patch version of Spring Boot available warning disable 처리하기 (0) | 2023.07.10 |
Jackson ObjectMapper 특정 요청에 대해서만 jsonIgnore 처리하여 응답하기 (0) | 2023.07.05 |
Spring Cloud DataFlow 사용해 보기 (0) | 2023.07.03 |
[troubleshooting] Spring Boot 3.1.0에서 hibernate cannot be cast 오류 발생 (0) | 2023.06.21 |
STS 4.19.0 Release 소식 및 Windows 11에서 Windows Defender 예외 처리 하기 (0) | 2023.06.16 |