-
@ConditionalOnMissingBean 알아보기Spring Framework 2023. 12. 29. 00:01728x90
개요
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
'Spring Framework' 카테고리의 다른 글
Spring 단일 Endpoint에 여러 요청 처리하기 (0) 2024.02.13 Spring Boot 2.x 프로젝트 만들기 (0) 2024.02.07 ObjectMppaer ParameterNamesModule 알아보기 (0) 2023.12.24 FeignClient dismiss404 동작원리 (0) 2023.12.22 SpringBoot ObjectMapper customize 하는 방법 (0) 2023.12.21