스프링 부트는 다음과 같은 종류의 @Conditional 애너테이션과 Condition을 제공
스프링 부트의 자동 구성은 이 @Conditional을 이용
Conditions
Class Conditions
- @ConditionalOnClass
- 클래스의 full name을 지정하면 이게 프로젝트 클래스 패스에 포함되어있는지 라이브러리로 등록했는지 확인해보고 존재하면 Configuration 클래스나 빈 메서드를 사용
- @ConditionalOnMissingClass
주의) @Bean 메서드에도 적용이 가능하지만 클래스레벨에 존재하지 않고 @Bean 메서드에만 적용하게 되면 클래스 레벨의 기술을 사용하지 않거나 해당하는 클래스를 구현하지 않은 경우 Bean Factory Method에의해서 만들어지는 오브젝트는 빈으로 등록이 안되는데 클래스 레벨에 조건을 아무것도 안붙인경우 Configuration 클래스 전체가 빈으로 등록되버림 → 기능에는 문제가 없을 테지만 불필요하기 때문에 클래스 레벨 사용을 우선시 해야 함
Bean Conditions
- @ConditionalOnBean
- @ConditionalOnMissingBean
- 사용자 구성정보 레벨에서 커스텀 빈 설정을 했다면 자동 구성에 미리 만들어져 있던 빈 구성 정보를 사용하지 않음
- 빈의 타입이나 이름을 element로 직접 지정할 수 있으며 생략한 경우 return 타입을 기준으로 빈의 존재를 확인
- @ConditionalOnMissingBean을 체크하는 시점에 Spring Container의 빈 구성 정보로 등록되어진 빈들에서만 체크를 하는 것. 자동 구성 Configuration을 여러개 만들어 둔 경우 그중 하나에서 @ConditionalOnMissingBean을 체크하는데 사실 그 빈이 뒤에 등록될 어떤 Configuration에서 등록이 될 것(자동 구성 Configuration 리턴 타입이 동일할 때)인데 먼저 체크를 해보기 때문에 아직까지 등록되지 않은 것을 알 수 있고 사용하겠다는 상황이 발생할 수 있음 ⇒ 순서를 신경 쓸 것
- 유저 구성정보에서는 사용하지 않는 것이 안전
Property Conditions
@ConditionalOnProperty는 스프링의 환경 프로퍼티 정보를 이용함
지정된 프로퍼티가 존재하고 값이 false가 아니면 포함 대상이 됨
특정 값을 가진 경우를 확인하거나 프로퍼티가 존재하지 않을 때 조건을 만족하게 할 수 도 있음
Resource Conditions
@ConditionalOnResource는 지정된 리소스(파일)의 존재를 확인하는 조건
Web Application Conditions
- @ConditionalOnWebApplication
- @ConditionalOnNotWebApplication
웹 애플리케이션 여부를 확인함