ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @ConditionalOnMissingBean 알아보기
    Spring Framework 2023. 12. 29. 00:01
    728x90

    개요

    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

     

    댓글

Designed by Tistory.