동일한 이름의 클래스를 Bean으로 생성할 때 BeanDefinitionStoreException이 발생한다.
왜 이런 오류가 발생하고 어떻게 해결할지 정리해보자.
공식문서를 확인해보면 Spring에서 Bean을 생성할 때 Bean의 이름이 별도로 지정되어있지 않다면 클래스명을 특정 규칙을 통해 변환하여 지정한다고 한다.
Bean Naming Conventions를 보면 시작하는 단어는 소문자인 camel-case를 사용한다고 한다.
만약 지정된 이름이 없는 Bean의 Defult Naming 전략을 변경하고싶다면 BeannameGenerator
를 상속하여 custom하게 구현할 수 있다.
Spring 5.2.3부터는 FullyQualifiedAnnotationBeanNameGenerator Class 를 이용하여 다른 패키지에 있는 동일한 이름의 클래스에 대해 이름을 다르게 지을 수 있다고 한다.
CustomBeanNameGenertor
Class를 생성하여 BeannameGenerator를 구현한다.
public class CustomBeanNameGenerator implements BeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
final String result;
result = generateFullBeanName((AnnotatedBeanDefinition) beanDefinition);
return result;
}
private String generateFullBeanName(final AnnotatedBeanDefinition definition) {
return definition.getMetadata().getClassName();
}
}
Applciation 구동부에 @ConponentScan의 옵션을 설정해줌으로써 defualt 전략이 CustomBeannameGenerator
를 참고하도록 한다.
...
@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
}
}
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html