본문 바로가기
[ Error ]/JAVA

[ Java ] UnsatisfiedDependencyException / NoSuchBeanDefinitionException

by 환이s 2023. 6. 7.


Spring Security 코드 작업 하던 중.. UnsatisfiedDependencyException 에러가 발생하면서

에러 내용을 확인해보니 콘솔창에 다음과 같은 내용을 전송해 줬다..

 

Error creating bean with name 'org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name

 

에러 내용을 보면 빈 관련해서 에러가 발생했다고 알려주는데, 

더 자세히는 의존성을 주입하려는 'UserRepository'를 찾을 수 없기 때문에 발생한 것으로 보인다고 한다.

'UserRepository' 클래스에 '@Repository' 어노테이션이 지정되지 않아 Spring이 해당 클래스를 빈으로 인식하지 못하는 

것일 수도 있다는 것이다.

 

이 에러를 해결하기 위해서는 다음과 같은 점을 확인해야 한다고 합니다.

 

1. 'UserRepository' 클래스에 '@Repository' 애노테이션이 있는지 확인해야 한다.

'@Repository' 애노테이션은 데이터 액세스 레이어의 구성 요소를 나타내는 데 사용됩니다.

이 애노테이션이 없으면 Spring은 해당 클래스를 빈으로 인식하지 않습니다.

 

2. 'UserRepository'를 정의하는 Bean이 Spring 구성 파일 또는 Java 구성 클래스에 등록되어 있는지 확인해야한다.

'UserRepository' 클래스에 대한  Bean 정의가 필요합니다.

이를 위해 '@Repository' 애노테이션이 지정된 'UserRepository' 클래스를 Spring 컴포넌트 스캔 대상으로 설정하거나,

XML 또는 Java 구성 클래스에서 명시적으로 Bean으로 정의해야 합니다.

 

3. Spring 콘텍스트에서 'UserRepository' 를 찾을 수 있는지 확인하세요. 다른 Bean이나 구성 클래스에서 'UserRepository'에 대한 주입을 시도하기 전에 해당 Bean이 Spring 컨텍스트에 존재하는지 확인해야 합니다.

Bean 이름이나 주입하는 위치를 확인하여 의존성을 올바르게 설정했는지 확인하세요.

 

문제점은 뭔지 알겠다. 스프링 풀에 현재 UserRepository 클래스가 빈으로 인식이 안된다고 알려주는데,

 

 

현재 내 코드에는 @Repository 애노테이션이 있는 상태인데도 빈으로 정의가 안 되는 상태이다.

그래서 현재 에러만으로는 도저히 감이 안 잡혀서 다음 에러를 참고하기로 했다.

 

다음 에러는 NoSuchBeanDefinitionException이 발생했다.

이 에러가 발생한 이유는 스프링 컨테이너에서 해당 빈을 찾을 수 없다는 의미라고 한다.

가능한 원인과 해결 방법은 다음과 같다.

 

1. 'UserRepository' 인터페이스를 구현하는 구현체 클래스가 존재하는지 확인해야 한다.

'UserRepository' 인터페이스는 'UserRepositoryImpl' 또는 다른 클래스에서 구현되어야 합니다.

해당 구현체 클래스에는 '@Repository' 어노테이션이 없어야 합니다. '@Repository' 어노테이션은

구현체 클래스가 아닌 인터페이스에 적용되어야 합니다.

 

2. 'UserRepository' 인터페이스를 사용하는 곳에서 '@Autowired' 어노테이션을 사용하여 의존성 주입을

수행하고 있는지 확인해야 한다.

'@Autowired' 어노테이션이 사용되지 않으면 스프링이 해당 빈을 찾아서 주입해주지 않습니다.

 

3. 프로젝트의 컴포넌트 스캔 설정을 확인하십시오.

스프링이 'UserRepository' 인터페이스를 스캔하여 빈으로 등록하려면 해당 인터페이스가 컴포넌트 스캔의 대상으로 설정되어야 합니다. 일반적으로 '@ComponentScan' 또는 '@SpringBootApplication' 어노테이션이 포함된  설정 클래스에서 컴포넌트 스캔을 수행합니다.

 

해결 방법을 알고 코드에 구현체 클래스를 생성해서 Mybatis에 연결해 주는 기능으로 해보니 에러가 사라졌습니다.

 

 

하지만 위처럼 구현체 클래스를 생성해서 하는 건 내가 추구하던 코드 방식이 아니었다.

 

하지만... 에러가 해결되었기 때문에 어쩔 수 없지만, 코드의 가독성 및 클린 코드를 추구하는 개발자로서

앞으로 더 성장해서 구현체 클래스를 생성하지 않고 유동적인 코드 흐름을 유지할 수 있도록 

개발 공부를 해야 할 거 같다..^^

 


마치며

 

오늘은 UnsatisfiedDependencyException / NoSuchBeanDefinitionException 에러에 대해서 알아봤습니다.

Spring 프레임워크 프로젝트를 진행하면서 의존성 문제로 계속 충돌이 발생하는데.. 이 또한 성장하는 과정이라고 생각합니다..ㅎ

 

다음 포스팅에서 뵙겠습니다.

 

 

728x90