김영한님의 스프링 강의를 들으며 컴포넌트 스캔을 사용하는 테스트를 돌리던 중 다음과 같은 오류가 발생하였다.

 

NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

 

무서운 오류메세지....

대충 해석해보면 MemberRepository타입 중 autowire 가능한 bean이 한개도 없다는 것이었다.

 

혹시 해서 코드를 확인해보니 모두 맞게 작성하였음에도 오류가 발생하였다.

 

원인은 패키지 위치에 있었다.

 

 

@ComponentScan은 해당 애노테이션이 붙은 설정 정보 클래스의 패키지시작 위치로 하여 탐색한다

현재 AutoAppConfig의 위치가 hello.core.order이다.

따라서 내가 작성한 코드에 의하면 hello.core.order패키지부터 해당 패키지의 하위 패키지들을 탐색하는 것이다.

 

그러나 탐색하려는 MemberRepository타입의 위치는 hello.core.member이다

 

다음과 같이 AutoAppConfig파일의 위치를 상위 패키지인 hello.core로 옮겼더니 해결되었다.

(나머지 App파일과 Config파일위치도 잘못되어 있길래 함께 옮겨 정리해 주었다.)

테스트 정상통과

 

 

 

또는 AutoAppconfig 파일에서 탐색을 시작할 basePackage의 위치를 다음과 같이 지정해줘도 된다.

basePackage를 지정하면 이 패키지를 포함해서 모든 하위 페이지를 탐색한다.

 

 

 

그러나 권장하는 방법은 패키지 위치를 지정하기보단,

 

설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다.

최근 스프링 부트도 이 방법을 기본으로 제공한다.

복사했습니다!