본문 바로가기

Spring

SpringBoot @Conditional 에 대해 알아보자

728x90
반응형

@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/

 

Conditional Beans with Spring Boot

An overview of Spring Boot's @ConditionalOn... annotations and when it makes sense to use them.

reflectoring.io

 

728x90
반응형