개요
스프링 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() 메서드를 통해 스프링 컨테이너에 빈으로 등록할지 여부를 판단
참고
인프런 토비의 스프링 부트 - 이해와 원리
'Spring' 카테고리의 다른 글
@Transactional 동작 원리 (0) | 2023.03.29 |
---|---|
Springboot 동작 방식 및 분석하는 방법 (0) | 2023.03.15 |
[Spring Boot] AutoConfiguration (0) | 2023.03.06 |
[Spring Boot] 메타 애노테이션과 합성 애노테이션 (0) | 2023.03.06 |
Spring 지원 없이 Servlet을 통해 Front Controller 구현 (0) | 2023.03.02 |