Web/Spring

[Spring] org.springframework.beans.factory.BeanCreationException, org.springframework.beans.factory.NoSuchBeanDefinitionException 해결하기

메바동 2022. 2. 4. 15:08
728x90

회사에 입사 후 처음으로 Spring Framework를 알게 되었고, 그 이후로도 제대로 Spring Framework를 공부한 적 없는 나에게는 가끔 이런 문제 같지도 않은 문제를 만나게 된다.

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name '클래스명': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private 클래스경로; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [클래스명] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [클래스명] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

 

의존성 주입을 위해 @Autowired를 사용했을 때 해당 bean을 찾을 수 없다는 에러다.

 

@Autowired를 사용하기 위해서는 bean이 등록되어있어야 하는데 나는 해당 설정을 하나도 건들지 않고 뜬금없는 경로에 생성한 클래스를 @Autowired로 주입하려고 하니 위의 에러가 발생한 것이다.

 

 

 

처음에는 단순하게 @Component나 @Service 어노테이션을 주면 ComponentScan이 자동으로 되는 줄 알았는데 @ComponentScan 어노테이션을 이용한 뭔가를 설정해줘야 하는 것 같았다.

이에 해당하는 부분은 다음에 자세하게 찾아봐야 할 것 같다.

 

회사에서 사용하는 프로젝트는 xml 파일에 <context:component-scan>에 경로가 지정되어 있었다. xml에 bean을 직접 추가하거나 해도 되지만 xml은 최대한 건들지 않기 위해 설정된 경로에 해당 클래스를 옮겨주는 것으로 @Autowired 사용 시 발생하는 문제를 해결할 수 있었다.

 

 

 

여담이지만 찾아보는 과정에서 @Autowired를 사용하는 것보다 생성자 주입 방식을 사용하는 것이 더 안전하다는 내용을 보았다.

아무래도 Spring Framework를 공부해야 할 때가 다가온 것 같다.

728x90