IT 정보/Spring

[Spring] Spring Bean의 조건부 활성화/비활성화 방법 5가지

개발하는 동그리 2025. 4. 16. 11:00
728x90
반응형
왜? 조건부로 활성화/비활성화가 필요한가?

외부 라이브러리는 가져다 사용하는 경우 특정 조건에만 적용해야 할 때가 있다. 예를 들면 운영에서만 사용되는 라이브러리의 Bean이 있는 경우에 내부 개발환경에서 문제가 발생할 수 있기 때문이다. 이와 같이 여러 상황에서 Bean 등록을 통제하고 싶다면 아래와 같은 조건부 활성화/비활성화 방법을 활용하여 내가 사용할 수 있는 방법을 찾아 적용하면 된다. 

 

Spring Bean의 조건부 활성화/비활성화 방법 5가지
  • @Profile : 프로파일 기반 조건
  • @Conditinal : 조건부 설정의 기본
  • @ConditionalOnProperty: 특정 프로퍼티 값 조건
  • @ConditionalOnMissingBean, @ConditionalOnBean: Bean 존재 유무 기반
  • @ConditionalOnMissingClass, @ConditionalOnClass : 클래스 존재 유무 조건

 

@Profile : 프로파일 기반 조건
  • 용도 : 설정 파일(application.yml)에 정의된 활성 프로파일에 따라 빈 등록 여부 결정
// 활성화 방법
// application.yml: spring.profiles.active=prod
// 시스템 프로퍼티: -Dspring.profiles.active=prod
// 환경 변수: SPRING_PROFILES_ACTIVE=prod

@Configuration
@Profile("prod")
public class ProdConfig {}

 

 

@Conditinal : 조건부 설정의 기본
  • 용도 : Condition 인터페이스를 구현하여, 복잡한 논리 기반 조건에 따라 빈 활성화
@Configuration
@Conditional(MyCustomCondition.class)
public class ConditionalConfig {}


public class MyCustomCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("env.mode");
        return "prod".equals(env);
    }
}

 

 

@ConditionalOnProperty: 특정 프로퍼티 값 조건
  • application.yml 의 설정 값에 따라 빈을 활성화/비활성화
@Configuration
@ConditionalOnProperty(name = "feature.new-ui", havingValue = "true")
public class NewUIConfig {}


feature:
  new-ui: true

 

 

@ConditionalOnMissingBean, @ConditionalOnBean: Bean 존재 유무 기반
  • 용도 : 특정 빈이 존재할 때만, 혹은 존재하지 않을 때만 다른 빈을 등록
// 특정빈이 존재하지 않을 때 빈 등록

@Bean
@ConditionalOnMissingBean
public MyService defaultMyService() {
    return new DefaultMyService();
}


// 특정빈이 존재할 때 빈 등록

Bean
@ConditionalOnBean(DataSource.class)
public MyRepository repo() {
    return new MyRepositoryImpl();
}

 

 

@ConditionalOnMissingClass, @ConditionalOnClass : 클래스 존재 유무 조건
  • 용도 : 클래스패스(classpath)에 특정 클래스가 있는지 여부로 조건 분기
@Configuration
@ConditionalOnClass(name = "com.example.ExternalLibrary")
public class ExternalLibraryConfig {}

 

 

Spring은 단순한 환경 분기부터 복잡한 런타임 조건까지 유연하게 Bean을 제어할 수 있는 여러 가지 조건부 애노테이션을 제공하고 있습니다.

@Profile, @Conditional 기반 애노테이션을 활용하면 환경에 따라
자동으로 최적화된 설정을 구성할 수 있습니다.

 

728x90
반응형