@Conditional 로 특정 빈 등록 조건 만들기

TIL/Java|2025. 3. 21. 16:09

 

테스트 환경에서는 실행되지 않아야 하는 파일이 있을 수 있다.

그럴 때? @Conditional 어노테이션을 사용하면 쉽게 조건을 만들어서 구현할 수 있다.

 

@Conditional 어노테이션은 정의된 조건에 맞춰 빈 등록을 할 지 말지 정해준다.

예를 들어서, 개발 환경에서만 따로 로그를 찍는 빈이 있다고 해 보자.

 

간단히 Condition을 구현해서, matches 함수를 오버라이드하면 커스텀 조건을 작성할 수 있다.

true를 리턴하는 조건에서 Conditional 조건을 만족하여 작동하게 된다.

아래는 실행시 지정한 프로파일이 dev 일 때만 true를 리턴한다.

public class LoggingCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        final Environment environment = context.getEnvironment();
        return environment.acceptsProfiles("dev");
    }
}

 

지정한 조건을 사용하는 건 이렇게!

@Service
@Conditional(value = {LoggingCondition.class})
public class DevEnvLoggingService {
...
}

 

이것 외에도 자바 버전에서 한정하는 @ConditionalOnJava(JavaVersion.EIGHT),

특정 클래스가 존재할 때만으로 한정하는 @ConditionalOnClass(SomeClass.class),

반대로 특정 클래스가 없을 때만 한정하는 @ConditionalOnMissingClass(NoClass.class),

특정 빈이 등록되어야만 하는 @ConditionalOnBean(BeanClass.class) 등등 다양한 조건을 지정할 수 있다.

 

Baeldung - Spring Conditional Annotations