본문 바로가기

Java/Spring

"NoSuchBeanDefinitionException" Bean과 관련해서 자주 발생하는 오류

이 문서의 내용

    테스트 환경 및 주요 아젠다

    더보기

    이 프로젝트의 개발 환경

    • 개발 언어 및 환경
      • OpenJDK 12
      • Spring: spring-context 5.0.2.RELEASE
      • Gradle 7.3

    특정 Bean 객체에 엑세스하면 NoSuchBeanDefinitionException: No bean named '<Bean 이름>' available 오류가 발생합니다.

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '<Bean 이름>' available

    Bean은 컴포넌트 스캔을 사용해 자동 등록하고 있습니다.

    Step 1: ApplicationContext에서 등록된 Bean 확인

    getBeanDefinitionNames()을 사용하면 ApplicationContext에 등록된 Bean 이름을 확인 할 수 있습니다.

    /**
     * Return the names of all beans defined in this factory.
     * <p>Does not consider any hierarchy this factory may participate in,
     * and ignores any singleton beans that have been registered by
     * other means than bean definitions.
     * @return the names of all beans defined in this factory,
     * or an empty array if none defined
     */
    String[] getBeanDefinitionNames();

    문제의 Bean 객체가 실제로 Bean에 등록되지 않았습니다.

    • Bean에 등록되어 있다면 엑세스 코드에서 Bean 이름을 잘못 등록했는지 확인합니다.
    • Bean에 등록되어 있지 않다면 Bean 등록 코드를 확인합니다.

    문제의 Bean 클래스에서 @Component 대신 @ComponentScan이 등록되어 있습니다.

    코드 스니펫에서 자동 입력된 것으로 보이며, @Component으로 수정하니 정상 동작합니다.

    @ComponentScan
    public class XXX
    {
    
    }

    Bean 타입을 잘못 지정했을 때 오류

    Bean 객체에 엑세스 할 때 Bean 타입을 잘못 지정하면 다음 오류가 발생합니다.

    Bean named '<Bean 이름>' is expected to be of type '<타입 이름>' but was actually of type '<타입 이름>' 오류

    엑세스하는 Bean 타입과 할당하는 변수의 타입이 일치시킵니다.

    엑세스 하는 Bean이 모호할 때

    Bean 객체에 엑세스 할 때 어떤 Bean을 리턴해야하는지 모호하면 다음 오류가 발생합니다. 동일한 타입에 대해서 여러 개의 Bean이 등록되어 있습니다.

    No qualifying bean of type '<Bean 타입>' available: expected single matching bean but found '<Bean 개수>': '<Bean 이름>, <Bean 이름>, ...'

    동일한 Bean 타입에 대해서 Bean 이름을 구분하여 등록합니다.

    Bean 객체에 엑세스 할 때는 Bean 타입과 Bean 이름을 함께 사용합니다.