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
반응형
'IT 정보 > Spring' 카테고리의 다른 글
[Spring] REST API가 무엇인가? (0) | 2025.04.29 |
---|---|
[Spring] 스프링에서 주기적 일정(Scheduler) 설정하고 실행하는 방법 (14) | 2025.04.16 |
[Spring] 스프링 AOP (Spring AOP)란 무엇인가? 프록시 기반 AOP, @AOP (4) | 2025.04.15 |
[Spring] @RestControllerAdvice & @ControllerAdvice (1) | 2024.12.12 |
[Spring] application.yml 설정 (1) | 2022.08.18 |