<context:component-scan base-package="org.zerock.service"></context:component-scan>

나같은 경우는 위의 코드처럼 root-context.xml 안에 pakage경로를 설정 해주지 않아서 에러가 떴다.





+)에러 구글링을 해보다가 도움이 되는 자료이기에 추가


@Inject 어노테이션은 자바 표준입니다..@Autowired나 @Resource 같이 Bean 주입하는 기능을 구현할때 저 Inject 어노테이션을 사용하는거죠..만약 누군가가 스프링이 아닌 새로운 프레임워크를 만들었고 Bean 주입하는 기능을 구현했을때 별도로 만든 어노테이션이 없다면 @Inject 어노테이션을 사용했을때 해당 기능이 구현이 되도록 해야 합니다..@Inject 어노테이션이 문제가 있어서 이 문제가 발생한게 아니에요..

문제는..

<context:component-scan base-package="com.comtrue.controller" />

이 부분입니다..

spring이 Bean을 등록할때 클래스를 검색해서 클래스에 특정 어노테이션(@Controller, @Service, @Repository, @Component 등)이 붙어 있으면 이를 Spring Bean 클래스라고 인식하고 등록하게 됩니다..

이때 클래스를 검색하는 기능이 저 component-scan 인데 base-package에 명시된 package를 기준으로 해서 그 하위를 검색하는거에요..

근데 보죠..controller를 기준으로 클래스를 검색하면 지금 구조에서는 HomeController 클래스 하나만 Spring Bean 클래스로 등록되고 다른 클래스들은 검색 기능으로 인한 등록이 되질 않습니다..

그렇기 땜에 TestService를 주입받고 싶어도 그 클래스가 Spring Bean으로 등록이 되어 있지 않기 때문에 주입을 못받아서 에러가 발생하는거에요..

이 부분을 그래서 다음과 같이 고쳐야 합니다

<context:component-scan base-package="com.comtrue" />

이렇게 하면 comtrue 밑에서부터 검색하기 때문에 그 하위 패키지은 controller 패키지는 물론 service 패키지도 포함해서 검색하는거죠..

Spring에서 Bean 주입을 받을려면 주입 받고자 하는 Bean 도 Spring 에 등록되어 있어야 한다..

이 원칙을 잘 기억하고 있어야 합니다..이걸 의외로 까먹고 접근하는 사람들이 많아요..단지 클래스만 있다고 주입이 되는게 아니에요..







출처:https://okky.kr/article/291232 '제타건담'님

+ Recent posts