Application Context

  • 전체 계층구조에서 최상단에 위치한 컨텍스트
  • 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean들을 등록해놓고 사용할 수 있다.
  • 웹 애플리케이션 전체에 적용 가능한 프로퍼티, DB 연결, 로깅 기능 등에 이용한다.
  • Servlet Context에 등록된 Bean은 이용할 수 없다.
  • Servlet Context에 동일한 Bean이 있을 경우 Servlet Context Bean이 우선된다.
  • 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다.
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:egovframework/spring/com/applicationContext-*.xml</param-value>
  </context-param>

Servlet Context

  • 서블릿에서만 이용되는 컨텍스트
  • 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다.
  • DispatcherServlet은 자신만의 컨텍스트를 생성, 초기화하고 동시에 Application Context를 찾아서 자신의 부모 컨텍스트로 사용한다.
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/egovframework/springmvc/*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

IoC 컨테이너 구성방법

  1. Application Context만 이용
  2. Servlet Context만 이용
  3. Application ContextServlet Context 하나씩 이용
  4. Application ContextServlet Context여러 개 이용
  5. 여러 Application ContextServlet Context 하나 이용
    • Application Context 설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)

Component Scan 사용시 컨텍스트 설정 방법

  • Application Context에 Service, Repository, Servlet Context에 Controller만 등록해야한다.
  • Application Context 설정

    • Service와 Repository는 Include 하고 Controller는 Exclude 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      </context:component-scan>
  • Servlet Context 설정

    • Service와 Repository는 Exclude 하고 Controller는 Include 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
      </context:component-scan>
  • 이렇게 설정하는 이유는 스프링이 Transaction을 적용하기 위해서이다.
  • 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래 @Service(또는 @Transactional) 어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service가 붙은 bean으로 대치된다.
  • 만약 Application ContextServlet Context가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context에만 적용되어 있기 때문에 Application Context의 @Service는 트랜잭션이 적용이 되지만 Servlet Context의 @Service는 트랜잭션이 적용이 안된다.
  • Bean 객체는 Servlet Context가 우선되므로 @Controller가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.

+ Recent posts