Spring-legacy로 개발하다가 보면 root-context와 servlet-context 둘중 어디에서 빈을 scan 할지 혼동이 온다.
그래서 찾아본 결과는 아래와 같다.
그래서 찾아본 결과... 기본적으로 세팅은 아래와 같이 되었다.
servlet-context
<context:component-scan base-package="com.example" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
servlet-context에서는 프로젝트 패키지 안에서의 Controller 어노테이션만 스캔하게끔 변경했다.
root-context.xml
<context:component-scan base-package="com.chb">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
또한 마찬가지로 root-context.xml에서는 패키지안에서의 Controller 어노테이션만 제외하고 스캔하게끔 했다.
여기서!
그러면 Service가 스캔되기 전에 Controller가 먼저 스캔되는데 Controller에서 Service를 호출하면 아직 빈이 스캔되지 않은 Service에서 오류가 나지 않을까? 했다...
그러나 servlet-context에 정의된 Bean은 root-context에 정의된 Bean을 사용할 수가 있다! 그렇기 때문에 오류는 발생하지 않았다. 하지만 반대로 root-context에서 servlet-context에 정의된 Bean은 사용할 수가 없다.
이 부분을 잘 알고 넘어가면 좋을것 같다.