본문 바로가기
Spring/인프런 토비의 Spring Boot

섹션 7-6 [조건부 자동구성] 스프링 부트의 @Conditional

by include_hoany 2024. 6. 27.

스프링 부트의 @Conditional

더보기
더보기

💡Tip
스프링의 프레임워크의 @Profile도 @Conditional 애노테이션이다.

@Conditional(ProfileCondition.class)
public @interface Profile {}

 

스프링 부트는 다음과 같은 종류의 @Conditional 애노테이션과 Condition을 제공한다 스프링 부트의 자동 구성은 @Conditional을 이용한다.

Class Conditions

  • @ConditionalOnClass
  • @ConditionalOnMissingClass

지정한 클래스의 프로젝트내 존재를 확인해서 포함 여부를 결정한다.

주로 @Configuration 클래스 레벨에서 사용하지만 @Bean 메소드에서도 적용 가능하다. 단 클래스 레벨의 검증 없이 @Bean 메소드에만 적용하면 불필요하게 @Configuration클래스가 빈으로 등록되기 때문에 클래스 레벨 사용을 우선시해야한다.

 

Bean Conditions

  • @ConditionalOnBean
  • @ConditionalOnMissingBean

빈의 존재 여부를 기준으로 포함여부를 결정한다. 빈의 타입 도는 이름을 지정할 수 있다. 지정된 빈 정보가 없으면 메소드의 리턴 타입을 기준으로 빈의 존재여부를 체크한다.

컨테이너에 등록된 빈 정보를 기준으로 체크하기 때문에 자동 구성 사이에 적용하려면 @Configuration 클래스의 적용 순서가 중요하다. 개발자가 직접 정의한 커스텀 빈 구성 정보가 자동 구성 정보 처리보다 우선하기 때문에 이 관계에 적용하는 것은 안전하다. 반대로 커스텀 빈 구성 정보에 적용하는 건 피해야 한다.

 

더보기
더보기

💡Tip @Configuration 클래스 레벨의 @ConditionalOnClass와 @Bean 메소드 레벨의@ConditionalOnMissingBean조합은 가장 대표적으로 사용되는 방식이다.
클래스의 존재로 해당 기술의 사용 여부를 확인하고, 직접 추가한 커스텀 빈 구성의 존재를 확인해서 자동 구성의 빈 오브젝트를 이용할지 최종 결정한다.

Property Conditions

@ConditionalOnProperty는 스프링의 환경 프로퍼티 정보를 이용한다. 지정된 프로퍼티가 존재하고 값이 false가 아니면 포함 대상이 된디ㅏ. 특정 값을 가진 경우를 확인하거나 프로퍼티가 존재하지 않을 때 조건을 만족하게 할 수도 있다.
프로퍼티의 존재를 확인해서 빈 오브젝트를 추가하고, 해당 빈 오브젝트에서 프로퍼티 값을 이용해서 세밀하게 빈 구성을 할 수도 있다.

 

Resource Conditions

@ConditionalOnResource는 지정된 리소스(파일)의 존재를 확인하는 조건이다.

 

Web Application Conditions

  • @ConditionalOnWebApplication
  • @ConditionalOnNotWebApplication

웹 애플리케이션 여부를 확인한다. 모든 스프링 부트 프로젝트가 웹 기술을 사용해야 하는 것은 아니다.

 

SpEL Expression Conditions

@ConditionalOnExpression은 스프링 SpEL(스프링 표현식)의 처리 결과를 기준으로 판단한다. 매우 상세한 조건 설정이 가능하다.