스프링 부트의 @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(스프링 표현식)의 처리 결과를 기준으로 판단한다. 매우 상세한 조건 설정이 가능하다.
'Spring > 인프런 토비의 Spring Boot' 카테고리의 다른 글
섹션 8-2 [외부 설정을 이용한 자동 구성] 자동 구성에 Enviroment 프로퍼티 적용 (0) | 2024.07.26 |
---|---|
섹션 8-1 [외부 설정을 이용한 자동 구성] Enviroment 추상화와 프로퍼티 (0) | 2024.07.26 |
섹션 7-5 [조건부 자동구성] 자동 구성 정보 대체하기 (0) | 2024.06.27 |
섹션 7-4 [조건부 자동구성] 커스텀 @Conditional (0) | 2024.06.27 |
섹션 7-3 [조건부 자동구성] @Conditional, Condition 학습 테스트 (0) | 2024.06.27 |