스프링 빈 조회시 발생할 수 있는 몇몇 예외가 있다.
해당 내용에 대한 설명은 아래 글들을 참고하면 좋다.
https://jnsodevelop.tistory.com/53
https://jnsodevelop.tistory.com/54
1️⃣ NoSuchBeanDefinitionException
말 그대로 조회를 하려는 스프링 빈이 없을 때 발생하는 예외이다.
이 때는 내부 로직보다는 조회하는 로직 등을 바꾸면 될 것이다.
예를 들어 'TestBean' 이라는 스프링 빈을 찾으려고 했으나 'TestBean2' 를 찾는다면 당연히 예외가 발생할 것이다.
따라서 찾으려는 스프링 빈의 이름이 잘못되진 않았는지, 해당 타입의 빈이 존재하는지 다시 한번 살펴보면 된다.
Object bean = ac.getBean("TestBean2",TestBean.class); //예외 발생
Object bean2 = ac.getBean("TestBean", TestBean.class); //찾으려는 스프링 빈
2️⃣ NoUniqueBeanDefinitionException
만약 타입으로 스프링 빈 조회시 동일한 타입이 두 개 이상 있다면, 중복 오류가 발생한다.
해당 오류에 대한 예외가 바로 'NoUniqueBeanDefinitionException' 이다.
이 때 해결 방법은 타입으로 조회시 빈 이름을 정확하게 지정해주면 된다.
아래 코드를 보자.
@Configuration
class TestBeanConfig{
@Bean
public TestBean testBean1(){
return new InstanceBean();
}
@Bean
public TestBean testBean2(){
return new InstanceBean();
}
}
만약 TestBean 가 인터페이스 타입, InstanceBean 이 그 구현체라고 하자.
testBean1() 과 testBean2() 메소드 모두 'InstanceBean()' 를 반환한다.
TestBean bean = ac.getBean(TestBean.class);
위 코드는 이름 없이 TestBean 타입의 빈을 조회하는 코드이다.
그러나 동일한 타입이 두 개이기 때문에 예외가 발생할 것이다.
따라서 아래와 같이 바꿔주면 된다.
TestBean bean = ac.getBean("testBean1", TestBean.class);
또한 상속 관계에 있는 클래스를 조회할 때도 문제가 발생할 수 있다.
만약 부모 타입으로 조회시 자식이 둘 이상 있다면 중복 오류가 발생한다.
이 떄 역시 빈 이름을 지정하면 해결할 수 있다.