[Error]org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name

Astin·2024년 2월 13일
0

📢 문제 발생

sql문을 커스텀 하다가 위와 같은 에러 발생

🔔 문제 원인

1. Bean에서 에러가 나는 경우

1.1 Error creating bean with name "XXXController"

servlet(서블릿)이 문제의 원인

💯 스프링의 흐름

요청 -> servlet -> controller-> service-> repository
servlet : Controller에 Mapping을 확인 한 뒤, 해당 Mapping의 코드로 전달

주로 빈 생성 에러는 서버를 새로 시작할 때 에러가 발생 할텐데 서버가 시작하고 / 혹은 index.do 와 같은 메인 페이지에 요청을 보내고 이 때 Servlet이 요청을 받고 Controller 에 있는  Mapping을 확인해야 하는데 Controller 자체를 찾을 수 없으면 위와 같은 문제가 발생한다.

따라서 이때는 Servlet의 properties.. 즉, 설정값 세팅 에서 에러가 발생했을 확률이 높다.

그러므로 servlet-context.xml 같은 servlet을 확인해서   <context:component-scan base-package="패키지명" />에 현재 작업중인 프로젝트의 패키지명.. 즉 컨트롤러가 포함된 패키지의 위치를 정확하게 기재 하자

그리고 @Controller 어노테이션이 없어서 일수도 있으니 이 부분도 체크하자

1.2 Unsatisfied dependency expressed through field 'XXXService';

만약 에러가 service단에서 발생하고 있다면 service 어노테이션이 없는 지 체크하자(상단에 @Service or @Component 추가하면 된다.)

1.3 Unsatisfied dependency expressed through field 'XXXServiceImpl';

위 경우는 repository 어노테이션이 없는 지 체크하자

2. DB 설정이나 쿼리문이 잘못된 경우

2.1 작성한 sql이 담긴 mybatis (xml파일) 확인 (작성한 SQL 오타 혹은 에러) 

mybatis에서 SQL문을 담고있는 mapper xml에서 쿼리에 오타가 발생했거나 에러가 발생하면 빈 에러가 발생하기도 한다고 한다. 

또한 jpa를 사용할 경우 repository에서 jpa문법에 맞춰서 작성했는지 확인해보자

💡문제 해결

나의 경우 repository에서 코드 개선을 위해 임시적으로 @query부분만 주석 처리하고 실행한 것이 원인이었다.

public interface DiscussionRepository extends JpaRepository<Discussion, Long> {
//Before
	@Query("SELECT t from Discussion t where t.closed = :closed")
    List<Discussion> findAllByClosed(boolean closed);
//After
    List<Discussion> findAllByClosed(boolean closed);

}

따라서 주석을 제거하고 jpa 문법에 맞춰 쿼리를 작성해서 문제를 해결하였다.

🎁 참고

https://liante0904.tistory.com/113
https://beagle-dev.tistory.com/122

0개의 댓글

관련 채용 정보