Spring Framework

@ConditionalOnMissingBean 알아보기

Junuuu 2023. 12. 29. 00:01

개요

Spring Bean 충돌을 해소하기 위해 @ConditionalOnMissingBean을 사용해 보다가 조금 더 자세하게 알아보고 싶어 정리해보고자 합니다.

 

 

@ConditionalOnMissingBean이란?

이름으로도 유추해 볼 수 있듯이 BeanFactory에 Class의 Type 혹은 동일한 이름의 Bean이 존재하지 않는 조건인 경우에만 Bean을 등록합니다.

 

Spring 환경에서 동일한 이름의 Bean이 존재하는 경우에는 해당 Bean을 등록하지 않으며 이미 등록된 Bean을 사용하게끔 할 수 있습니다.

Spring Boot와 같이 자동구성을 지원하기 위한 클래스에 사용이 추천됩니다.

 

JacksonAutoConfiguration 예제

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
	static class JacksonObjectMapperConfiguration {

		@Bean
		@Primary
		@ConditionalOnMissingBean
		ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
			return builder.createXmlMapper(false).build();
		}

	}

SpringBoot에서 지원하는 JacksonAutoConfiguration 클래스의 예시를 보면 @ConditionalOnMissingBean이 선언되어 있습니다.

 

Spring의 빈 등록과정은 다음과 같습니다.

1. 사용자가 @Component등으로 등록한 빈들이 등록됨

2. AutoConfiguration에 의한 빈들이 등록됨

 

즉, 사용자가 ObjectMapper 클래스를 Bean으로 등록하면 SpringBoot는 @ConditionalOnMissingBean에 의해 자동설정을 지원하지 않습니다.

 

실제로 디버깅포인트를 찍어보면 AutoConfiguration에 의한 ObjectMapper가 등록됩니다.

 

JacksonCustomConfig 클래스 등록

@Configuration
class JacksonCustomConfig {

    @Bean
    fun customObjectMapper(): ObjectMapper{
        return ObjectMapper()
    }
}

사용자에 의해 ObjectMapper클래스가 빈으로 등록된 이후에는 디버깅포인트에 JacksonAutoConfiguration의 설정이 잡히지 않습니다.

 

 

 

 

참고자료

https://zion830.tistory.com/112