이 글은 제가 이해한 개념을 바탕으로 작성하였기에 틀린 부분이 있을 수 있습니다. 틀린 부분 있다면 지적해주세요 :)
스프링에서 말하는 컨텍스트(context)는 스프링이 관리하는 빈들이 담겨 있는 컨테이너 라고 생각하시면 됩니다.
스프링을 계속 공부중이지만 엄청 헷갈렸던 부분이 WebApplicationContext와 ApplicationContext의 관계, web.xml에서의 servlet-context와 root-context의 관계 그리고 ContextLoaderListenter와 dispatcher-servlet의 관계 총 이 3개의 관계가 볼때마다 헷갈렸습니다.
따라서 이 관계들을 아래와 같이 그림화해보았습니다.
# web.xml에서의 Context
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/context-*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
ApplicationContext는 ContextLoaderListener 클래스에 의해 만들어지고,
WebApplicationContext는 DispatcherSerlvet 클래스에 의해 만들어집니다.
ㅣ ApplicationContext
- 최상위 컨텍스트 입니다.
- root-context에 등록되는 빈들은 모든 컨텍스트에서 사용할 수 있습니다. (공유 가능)
- service나 dao를 포함한, 웹 환경에 독립적인 빈들을 담아둡니다.
- 서로 다른 servlet-context에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있습니다.
- servlet-context 내 빈들은 이용이 불가능합니다.
ㅣ WebApplicationContext
- servlet-context에 등록되는 빈들은 해당 컨테스트에서만 사용할 수 있습니다.
- DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는 데 사용합니다.
- 독자적인 컨텍스트들을 가지며, root-context 내 빈 사용이 가능합니다.
# 스프링에서 WebApplicataionContext 객체 얻어내기
public class A {
@Autowired
WebApplicationContext applicationContext;
//Container 내에 객체얻기
public method() {
B b = context.getBean(B.class);
}
}
public class A implements ApplicationContextAware {
private ApplicationContext context;
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}
}
# WebApplicationContext vs ApplicationContext
스프링 안에는 여러 종류의 ApplicationContext 구현체가 있습니다. WebApplicationContext는 ApplicationContext를 확장한 WebApplicationContext 인터페이스의 구현체를 말합니다. WebApplicationContext는 ApplicationContext에 getServletContext() 메서드가 추가된 인터페이스입니다. 이 메서드를 호출하면 ServletContext를 반환합니다. 결국 WebApplicationContext는 ApplicationContext의 자식이면서 ServletContext와 연관 관계에 있다는 정도로 정리가 됩니다. 이 메서드가 추가되면 ServletContext를 이용한 몇가지 빈 생애 주기 스코프가 추가 되기도 합니다.
읽어주셔서 감사합니다.
질문은 언제나 환영합니다.
"난 반드시 백엔드 왕이 될거야"
'...' 카테고리의 다른 글
[JS] 제이쿼리 id, class, name 속성 값 가져오기 (0) | 2021.01.21 |
---|---|
[Js] 자바스크립트 한글, 영어, 숫자 체크하기 (0) | 2021.01.21 |
[Spring] root-context와 servlet-context (2) | 2021.01.20 |
[tomcat] Not allowed to load local resource 에러 (1) | 2021.01.20 |
[Spring] @RestController 란? (0) | 2021.01.18 |