sql문을 커스텀 하다가 위와 같은 에러 발생
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 어노테이션이 없어서 일수도 있으니 이 부분도 체크하자
만약 에러가 service단에서 발생하고 있다면 service 어노테이션이 없는 지 체크하자(상단에 @Service or @Component 추가하면 된다.)
위 경우는 repository 어노테이션이 없는 지 체크하자
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