본문 바로가기
SPRING

[SPRIING] component-scan 사용법 (available: expected at least 1 bean which qualifies as autowire candidate. 에러)

by madinthe90 2022. 3. 31.
반응형

 

expected at least 1 bean which qualifies as autowire candidate.

=> autowire 할 bean이 최소 1개는 필요하다.

 

스프링을 설정하며 발생했던 오류다.

 

- 클래스에 어노테이션 확인

오류 내용 처럼 Autowired를 할 수 없다는 오류이고,

클래스에 @Autowired, @Service, @Repository가 잘 붙었나 봐야한다!

 

- dispatcher servlet 의 base-package 경로 확인

<context:component-scan base-package="패키지명">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>

내 경우엔 이거였다!

component-scan의 base-package 경로가 잘못되어있어 수정해 주니 바로 해결됐다.

 

에러를 해결하며 component-scan에 대해 알아봤고

component-scan 개념에 대해 정리해본다!


- component-scan 이란?

어노테이션을 클래스에 선언하면 스프링이 Bean으로 등록 될 준비를 마친 클래스들을 스캔하여

디폴트로 @Component @Controller @Service @Repository 를 Bean으로 등록해준다.

 

- component-scan 사용법

<context:component-scan base-package="패키지명"/>

위와 같이 설정하고 base package를 적으면 base package를 기준으로 클래스를 스캔해 빈으로 생성한다.

 

exclude-filter

: 필터를 통해 해당 어노테이션 스캔 제외, 나머지는 디폴트로 스캔

<context:component-scan base-package="패키지명">
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

위와 같이 설정시 @Controller를 스캔에서 제외하고, 다른 어노테이션들은 디폴트로 스캔하게 된다.

 

include-filter

: 필터를 통해 포함시키고자 하는 어노테이션, 디폴트 어노테이션을 스캔 제외하고 include-filter의 어노테이션만 스캔

<context:component-scan base-package="패키지명">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

위와 같이 설정시 @Controller만 스캔하고, 다른 어노테이션들은 스캔대상에서 제외된다.

 

- component-scan 동작 과정

ConfigurationClassParser 가 Configuration 클래스를 파싱한다.
@Configuration 어노테이션 클래스를 파싱하는 것이다.
                   ⬇
ComponentScan 설정을 파싱한다.
base-package 에 설정한 패키지를 기준으로
ComponentScanAnnotationParser가 스캔하기 위한 설정을 파싱한다.
                   ⬇
base-package 설정을 바탕으로 모든 클래스를 로딩한다.
                   ⬇
ClassLoader가 로딩한 클래스들을 BeanDefinition으로 정의한다.
생성할 빈의 대한 정의를 하는 것이다.
                   ⬇
생성할 빈에 대한 정의를 토대로 빈을 생성한다.


References

https://velog.io/@hyun-jii/%EC%8A%A4%ED%94%84%EB%A7%81-component-scan-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

https://rnrudxo2872.github.io/%EA%B0%9C%EC%9D%B8%EA%B3%B5%EB%B6%80/spring/Component-Scan/

https://zorba91.tistory.com/249

 

반응형

댓글