또한 스프링 부트는 자주 사용되는 조건부 애노테이션을 재사용성을 위해 미리 정의(Pre-Defined)하여 제공하고 있다.
이러한 애노테이션은 @Conditional이라는 이름으로 시작한다.
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {}
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {}
autoconfigure 모듈 내부의 ConditionalOn으로 시작하는 애노테이션
클래스가 존재하는 경우에만 동작하거나 이와 반대로 클래스가 존재하지 않는 경우에만 동작한다.
@ConditionalOnClass, @ConditionalOnMissingClass
빈이 애플리케이션 컨텍스트에 존재하는 경우에만 동작하거나 이와 반대로 빈이 애플리케이션 컨텍스트에 존재하지 않은 경우에만 동작한다.
@ConditionalOnBean, @ConditionalOnMissingBean
미리 정의된 조건부 애노테이션이 어떤 식으로 사용되는지 알기 위해 스프링의 핵심 기능 중 하나인 AOP 자동 설정 클래스인 AopAutoConfiguration과 @ConditionalOnProperty를 예로 들어 설명한다.
프로퍼티가 존재하는 경우에만 동작하는 ConditionalOnProperty가 적용된 자동 설정 클래스 AopAutoConfiguration
@AutoConfiguration
@ConditionalOnProperty(prefix= = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration
@ConditionalOnProperty의 첫번째 값인 prefix는 spring.aop로 시작하는 프로퍼티가 있는지를 검사하고 name은 prefix 뒤에 들어가는 프로퍼티의 이름
havingValue는 프로퍼티의 값이 일치하면 동작
그러므로 AopAutoConfiguration 클래스는 프로퍼티가 아래와 같을 경우에 동작한다.
application.properties 코드 확인
spring.aop.auto=true
하지만 스프링은 기본적으로 aop 기반으로 동작하는데, 그 이유는 해당 프로퍼티를 항상 선언하지 않더라도 필수적인 설정이라면 자동으로 설정을 로드하는 방법으로 마지막에 선언된 matchIfMissing = true 때문이다.
matchIfMissing은 기본 값이 false이다. false인 경우에는 prefix, name, havingValue가 일치하는 경우에만 동작하지만, true인 경우에는 해당 프로퍼티가 없더라도 동작하게 된다.
스프링 부트 자동 설정
자동 설정이란
자동 설정(Auto-configuration)
은 스프링 부트를 말할 때 빠질 수 없는 핵심 기술이다.자동 설정 뜯어보기
autoconfiguration
모듈 내부의 META-INF 하위에 있는 메타데이터 파일을 우선적으로 검색한다.META-INF/spring.factories
였으나 현재에는META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
이다.후보(Candidate)
클래스들의 목록이 등록되어 있다.jpa.HibernateJpaAutoConfiguration
,redis.RedisRepositoriesAutoConfiguration
)@EnableAutoConfiguration
애노테이션이 존재하면 자동 설정 클래스를 검색하고조건에 따라서
자동 설정 클래스를 로드한다.@SpringBootApplication
애노테이션에 포함되어 있기 때문에 따로 선언할 필요가 없지만 직접 사용할 수도 있다.조건부 애노테이션
조건부 애노테이션(Conditional Annotation)
인@Conditional
을 사용해 조건에 따라 자동 설정 클래스를 로드한다.미리 정의(Pre-Defined)
하여 제공하고 있다.@Conditional
이라는 이름으로 시작한다.@ConditionalOnClass
,@ConditionalOnMissingClass
@ConditionalOnBean
,@ConditionalOnMissingBean
@ConditionalOnProperty
를 예로 들어 설명한다.ConditionalOnProperty
가 적용된 자동 설정 클래스AopAutoConfiguration
@ConditionalOnProperty
의 첫번째 값인prefix
는 spring.aop로 시작하는 프로퍼티가 있는지를 검사하고name
은 prefix 뒤에 들어가는 프로퍼티의 이름havingValue
는 프로퍼티의 값이 일치하면 동작matchIfMissing = true
때문이다.matchIfMissing
은 기본 값이false
이다. false인 경우에는 prefix, name, havingValue가 일치하는 경우에만 동작하지만,true인 경우에는 해당 프로퍼티가 없더라도
동작하게 된다.