@Conditional
SpringBoot App을 빌드할 때 어떤 조건이 충족되는 경우에만 Application Context에 로드하고 싶다.
테스트 중일 때는 비활성화되어 있거나 런타임 환경에 특정 조건일 때만 충족해야할 경우에 사용한다.
Spring은 특정한 경우에만 사용자가 커스텀하게 정의하여 사용할 수 있도록 Conditional 어노테이션을 도입했다.
(도입한지는 꽤 됐다)
Spring4부터 사용이 가능하다.
Conditional @Bean
@Configuration
class ConditionalBeanConfiguration {
@Bean
@Conditional... // <--
ConditionalBean conditionalBean(){
return new ConditionalBean();
};
}
Conditional @Configuration
@Configuration
@Conditional... // <--
class ConditionalConfiguration {
@Bean
Bean bean(){
...
};
}
Configuration과 함께 Conditional이 쓰이면 여기에 포함된 모든 Bean들은 조건을 충족했을때 등록됐다.
Conditional @Component
@Component
@Conditional... // <--
class ConditionalComponent {
}
Controller, Service, Repository, Component와 같은 스테레오 어노테이션에도 추가해서 빈으로 등록할 수 있다.
@ConditionalOnProperty
@Configuration
@ConditionalOnProperty(
value="module.enabled",
havingValue = "true",
matchIfMissing = true)
class CrossCuttingConcernModule {
...
}
ConditionalOnProperty는 환경설정에 따라 빈이 로드된다.
위의 예에서 보면 CrossCuttingConcernModule은 module.enabled가 true일 때 빈으로 등록된다.
matchIfMissing 이 true로 되어있어서 속성이 정의되어 있지 않아도 로드된다고 한다.
@ConditionalOnExpression
@Configuration
@ConditionalOnExpression(
"${module.enabled:true} and ${module.submodule.enabled:true}"
)
class SubModule {
...
}
여러 속성을 기반으로 하는 복잡한 설정이 필요한 경우 사용한다.
SubModule은 module.enabled와 module.submodule.enabled가 모두 true일때 로드된다.
속성값이 없을 경우 true가 default이다.
@ConditionalOnBean
@Configuration
@ConditionalOnBean(OtherModule.class)
class DependantModule {
...
}
다른 Bean이 Application Context에 로드되서 사용가능할 때 로드한다.
@ConditionalOnMissingBean
@Configuration
class OnMissingBeanModule {
@Bean
@ConditionalOnMissingBean
DataSource dataSource() {
return new InMemoryDataSource();
}
}
특정 Bean이 Application Context에 없는 경우 로드된다.
위 예제는 사용가능한 데이터소스가 없을 경우에만 인메모리 데이터소스를 주입한다.
@ConditionalOnResource
@Configuration
@ConditionalOnResource(resources = "/logback.xml")
class LogbackModule {
...
}
클래스패스에서 특정 리소스를 사용할 수 있을 때 로드된다.
예를 들면, logback.xml을 클래스패스에서 찾았을 경우 LogbackModule이 로드된다.
@ConditionalOnClass
@Configuration
@ConditionalOnClass(name = "this.clazz.does.not.Exist")
class OnClassModule {
...
}
특정 클래스가 경로에 있을 경우에 로드된다.
@ConditionalOnMissingClass
@Configuration
@ConditionalOnMissingClass(value = "this.clazz.does.not.Exist")
class OnMissingClassModule {
...
}
특정 클래스가 경로에 없을 경우에 빈이 로드된다.
@ConditionalOnJndi
@Configuration
@ConditionalOnJndi("java:comp/env/foo")
class OnJndiModule {
...
}
특정자원이 JNDI를 통해 사용가능할 경우 로드된다.
@ConditionalOnJava
@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
class OnJavaModule {
...
}
특정 JAVA버전에서 로드된다
@ConditionalOnSingleCandidate
@Configuration
@ConditionalOnSingleCandidate(DataSource.class)
class OnSingleCandidateModule {
...
}
@ConditionalOnBean와 유사하다.
주어진 클래스에 대해 단일 후보가 결정된 경우에 로드된다.
@ConditionalOnWebApplication
@Configuration
@ConditionalOnWebApplication
class OnWebApplicationModule {
...
}
WebApplication 내에서 실행 중인 경우에만 로드된다.
@ConditionalOnNotWebApplication
@Configuration
@ConditionalOnNotWebApplication
class OnNotWebApplicationModule {
...
}
웹어플리케이션 내에서 실행되지 않는 경우에만 로드된다.
@ConditionalOnCloudPlatform
@Configuration
@ConditionalOnCloudPlatform(CloudPlatform.CLOUD_FOUNDRY)
class OnCloudPlatformModule {
...
}
특정 클라우드 플랫폼이 실행된 경우에만 로드된다.
출처는 여기
reflectoring.io/spring-boot-conditionals/
'Spring' 카테고리의 다른 글
SpringBoot 외부 프로퍼티 파일로 실행하기 (application.properties) (0) | 2021.01.27 |
---|---|
Netflix Zuul Gateway Filter (0) | 2021.01.16 |
SpringBoot @EnableEncryptableProperties 스프링에서 암호화를 써보자 (0) | 2021.01.08 |
SpringBoot CORS설정 (0) | 2021.01.08 |
SpringBootServletInitializer 란 무엇일까? 왜쓰지? (0) | 2021.01.07 |