@ConditionalOnBean — 스프링 자동 구성에서의 조건부 빈 등록
Spring Boot에서는 환경(프로파일, 의존성 유무, 설정 상태)에 따라 특정 빈(bean) 을 자동으로 등록하거나 생략할 수 있습니다.
@ConditionalOnBean은 그중에서도 “특정 빈이 이미 존재할 때만” 새로운 빈을 등록하는 조건부 애노테이션입니다.
1. 기본 개념
@ConditionalOnBean
→ 지정한 타입(또는 이름)의 빈이 이미 컨텍스트에 존재할 때만 현재 빈을 등록한다.
즉, “A라는 빈이 등록되어 있으면 B도 등록해라”라는 의미입니다.
반대로, “A가 없을 때는 등록하지 말라”는 것입니다.
2. 예시 코드
@Component
@ConditionalOnMissingBean(ChatRealtimeGateway.class)
public class ChatNoopRealtimeGateway implements ChatRealtimeGateway {
// Redis나 STOMP 환경이 없을 때 기본 fallback
}
위 코드는 다음과 같은 의도를 가집니다:
“애플리케이션에 StringRedisTemplate이 등록되어 있다면,
Redis 기반 실시간 게이트웨이(ChatRedisRealtimeGateway)를 활성화한다.”
즉, Redis 환경에서만 동작하도록 자동 구성되는 선택적 컴포넌트입니다.
테스트나 로컬 환경처럼 Redis가 없을 경우 이 빈은 생성되지 않습니다.
3. 함께 자주 쓰는 어노테이션
@ConditionalOnMissingBean
지정한 빈이 존재하지 않을 때만 현재 빈을 등록.
@Component @ConditionalOnMissingBean(ChatRealtimeGateway.class) public class ChatNoopRealtimeGateway implements ChatRealtimeGateway { // Redis나 STOMP 환경이 없을 때 기본 fallback }
즉, “ChatRealtimeGateway 타입의 빈이 하나도 없으면 No-op 구현을 등록해라.”
이 조합 덕분에, Redis가 있으면 Redis용이 자동 활성화되고
없으면 fallback이 자동으로 선택됩니다.
4. 실제 동작 과정 (Spring Boot 자동 구성 메커니즘)
스프링 부트는 컨텍스트 초기화 시점에 아래 순서로 동작합니다.
- 모든 @Configuration / @Component를 스캔
- @ConditionalOnBean, @ConditionalOnMissingBean 등의 조건을 평가
- 조건이 true인 빈만 컨텍스트에 등록
- 이후 @Autowired / 생성자 주입으로 의존성 주입
즉, 조건에 맞지 않으면 해당 빈은 완전히 무시되어 등록되지 않으며,
의존성 주입 시점에는 존재하지 않기 때문에 다른 빈에서 주입할 수도 없습니다.
5. 대표적인 사용 패턴
상황사용 예시설명
| 특정 기술 스택이 있을 때만 기능 활성화 | @ConditionalOnBean(StringRedisTemplate.class) | Redis 연결이 있을 때만 Pub/Sub 모듈 활성화 |
| 특정 기술이 없을 때 기본 구현 제공 | @ConditionalOnMissingBean(ChatRealtimeGateway.class) | 실시간 인프라가 없을 때 No-op fallback 등록 |
| 특정 프로퍼티 기반 구성과 병행 | @ConditionalOnProperty(name = "feature.chat.enabled", havingValue = "true") | 설정값 기반 조건과 함께 사용 가능 |
'Spring' 카테고리의 다른 글
| [Spring] WebFlux · WebClient · Internal API (3) | 2025.08.26 |
|---|---|
| [Spring] JPA에서 JSON 컬럼 다루기 (1) | 2025.08.26 |
| [Spring] JPA 연관관계, “양방향”이 정답이 아니다 (1) | 2025.08.26 |
| [Spring] @MapsId 완전 정리: 언제 쓰고, 언제 피해야 할까 (1) | 2025.08.25 |
| [Spring] OncePerRequestFilter / TaskDecorator (2) | 2025.08.14 |