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 컨테이너 구성방법
Application Context
만 이용
Servlet Context
만 이용
Application Context
와 Servlet Context
하나씩 이용
Application Context
와 Servlet Context
여러 개 이용
- 여러
Application Context
와 Servlet Context
하나 이용
- 각
Application Context
설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)
Component Scan 사용시 컨텍스트 설정 방법
Application Context
에 Service, Repository, Servlet Context
에 Controller만 등록해야한다.
Application Context
설정
Servlet Context
설정
- 이렇게 설정하는 이유는 스프링이
Transaction
을 적용하기 위해서이다.
- 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래
@Service(또는 @Transactional)
어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service
가 붙은 bean으로 대치된다.
- 만약
Application Context
와 Servlet Context
가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context
에만 적용되어 있기 때문에 Application Context
의 @Service는 트랜잭션이 적용이 되지만 Servlet Context
의 @Service는 트랜잭션이 적용이 안된다.
- Bean 객체는
Servlet Context
가 우선되므로 @Controller
가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service
가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service
가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.