root-context와 servlet-context 에서의 component scan의 방법

코딩하는범이·2021년 1월 28일
1

Spring-legacy로 개발하다가 보면 root-context와 servlet-context 둘중 어디에서 빈을 scan 할지 혼동이 온다.

그래서 찾아본 결과는 아래와 같다.

  1. servlet-context.xml
    이름에서 보듯이 서블릿 요청과 관련된 객체를 정의해야한다.
    주로 View 관련된, Controller 같은 bean을 설정한다고 한다.
  1. root-context.xml
    root-context 또는 application-context는 view와 관련되지 않은 객체를 정의한다. 그러니까 결국은 Service, Repository 등 비지니스 로직 관련 bean을 설정하면 될것 같다.

그래서 찾아본 결과... 기본적으로 세팅은 아래와 같이 되었다.

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은 사용할 수가 없다.

이 부분을 잘 알고 넘어가면 좋을것 같다.

profile
기록 그리고 기억

0개의 댓글