Spring

[Spring] @Conditional 정리

꾸준함. 2023. 3. 7. 17:14

개요

스프링 4.0부터 추가된 Conditional 애노테이션에 대해 간단히 정리해 보겠습니다.

 

@Conditional & Condition 인터페이스

앞서 언급했듯이 @Conditional은 Spring 4.0부터 추가가 되었고 이름 뜻대로 모든 조건을 충족해야지만 스프링 컨테이너에 Bean으로 등록시키는 역할을 수행합니다.

@Conditional은 @Configuration 클래스와 @Bean 메서드에 적용이 가능하기 때문에 Target이 타입과 메서드 모두 적용되며 클래스 조건을 만족하지 못하는 경우 메서드는 무시가 됩니다.

스프링 부트가 사용하는 @Conditional의 가장 대표적인 방법은 클래스의 존재를 확인할 때이며 이를 위해 @ConditionalOnClass와 @ConditionalOnMissingClass 애노테이션이 별도로 제공이 됩니다.

 

* 주의: 클래스에 @Conditional을 붙이지 않고 메서드에만 붙일 경우 조건이 충족되지 않더라도 불필요한 클래스가 빈으로 등록될 수가 있습니다.

 

 

조건을 충족하는지 여부는 Condition 인터페이스 구현체 내 matches 메서드를 통해 판별합니다.

 

 

@Conditional 종류

스프링 부트는 아래와 같은 종류의 @Conditional 애노테이션과 Condition 인터페이스 구현체를 제공하며 AutoConfiguration 적용 시 해당 @Conditional을 사용합니다.

  • Profile Conditions
  • Class Conditions
  • Bean Conditions
  • Property Conditions
  • Resource Conditions
  • Web Application Conditions

 

Profile Conditions

 

Active Profiles 정보를 기준으로 스프링 컨테이너에 빈으로 등록할지 판단합니다.

@Profile은 @Conditional을 적용한 메타 애노테인션입니다.

 

Class Conditions

 

프로젝트 내 지정한 클래스의 존재 여부를 확인한 뒤 스프링 컨테이너에 빈으로 등록할지 판단합니다.

주로 @Configuration 클래스 레벨에서 사용하지만 @Bean 메서드에서도 적용이 가능합니다.

앞서 설명했듯이 클래스 레벨의 검증 없이 @Bean 메서드에만 적용할 경우 불필요하게 @Configuration 클래스가 빈으로 등록되기 때문에 클래스 레벨 검증을 우선하는 것을 추천합니다.

ex) @ConditionalOnClass, @ConditionalOnMissingClass

 

Bean Conditions

 

프로젝트 내 지정한 빈의 존재 여부를 확인한 뒤 스프링 컨테이너에 빈으로 등록할지 판단합니다.

Bean으로 확인할 때는 적용 순서가 중요한데 그 이유는 개발자가 직접 정의한 Custom Bean 구성 정보가 AutoConfiguration으로 등록된 구성 정보보다 우선순위가 높기 때문에 해당 관계를 고려하여 애노테이션을 부여해야 합니다.

즉, Custom Bean Configuration에 해당 @Conditional을 적용하는 것은 피해야 합니다.

 

ex) @ConditionalOnBean, @ConditionalOnMissingBean

 

Property Conditions

 

스프링의 properties 혹은 yml 파일에 적용된 프로퍼티 정보를 확인한 뒤 스프링 컨테이너에 빈으로 등록할지 판단합니다.

 

ex) @ConditionalOnProperty

 

Resource Conditions

 

지정된 리소스의 존재를 확인한 뒤 스프링 컨테이너에 빈으로 등록할지 판단합니다.

 

ex) @ConditionalOnResource

 

Web Application Conditions

 

모든 스프링 부트 프로젝트가 반드시 웹 기술을 사용하는 것은 아닙니다.

따라서, 해당 애노테이션은 웹 애플리케이션인지 여부를 확인한 뒤 스프링 컨테이너에 빈으로 등록할지 판단합니다.

 

ex) @ConditionalOnWebApplication, @ConditionalOnNotWebApplication

 

SpEL Expression Conditions

 

스프링 표현식인 SpEL의 처리 결과를 기준으로 스프링 컨테이너에 빈으로 등록할지 판단합니다.

상세한 조건 설정에 사용됩니다.

 

ex) @ConditionalOnExpression

 

커스텀 @Conditional

커스텀 Conditional 애노테이션 동작 방식은 아래와 같습니다.

  • 커스텀 Conditional 애노테이션을 선언하고 스프링에서 제공하는 @Conditional을 적용하여 메타 애노테이션으로 지정
  • 적용한 @Conditional에 Condition 인터페이스 구현체를 넘겨 matches() 메서드를 통해 스프링 컨테이너에 빈으로 등록할지 여부를 판단

 

 

참고

인프런 토비의 스프링 부트 - 이해와 원리 

반응형