본문 바로가기

삽질

Spring Web의 두 가지 기본 Context

Context란 무엇일까요?

스프링이 관리하는 빈(Bean)을 담아두는 컨테이너라고 생각하시면 됩니다.

 

Spring 프로젝트를 만들면 기본적으로 두 가지 컨텍스트가 만들어집니다.

첫 번째는 ApplicationContext입니다.

두 번째는 WebApplicationContext입니다.

 

ApplicationContext는 주로

Service, Dao등 프로젝트 전체에서 공유하는 빈들을 저장합니다.

WebApplicationContext는 주로

Controller와 같이 특정 서블릿(DispatcherServlet)에서만 사용되는 빈들을 저장합니다.

 

Spring Web Mvc에서 빈을 참조할 때,

우선적으로 WebApplicationContext를 참조 하고 빈을 찾지 못하면 ApplicationContext를 참조합니다.

이 동작 과정이 ApplicationContext에 공유되는 빈을 저장하는 이유입니다.

 

 

Spring 프로젝트를 만들면 WEB-INF 아래에 Context 관련 세 가지 xml 파일이 만들어집니다.

1. web.xml

2. root-context.xml

3. servelt-context.xml

 

web.xml에 root-context와 servlet-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>/WEB-INF/config/root-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>

 

Spring은 이 web.xml 파일을 읽어 ApplicationContextWebApplicationContext를 만듭니다.

 

ApplicationContextroo-context.xml 파일을 통해 만들어집니다.

web.xml에 정의되어 있는 코드 중, root-context와 관련있는 코드는 아래와 같습니다.

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/config/root-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>

conetxt-param : Spring이 Context를 만들 때 사용하는 정보를 저장합니다.

    - param-name : Spring이 Context를 만들 때 참조하는 이름입니다.

    - param-value : Spring이 Context를 만들 때 참조하는 파일 위치입니다.

listener

    - listener-class : Spring이 load될 때, 컨텍스트를 만드는데 사용하는 클래스를 명시합니다.

 

WebApplicationContextservelt-context.xml 파일을 통해 만들어집니다.

web.xml에 정의되어 있는 코드 중, servlet-context와 관련있는 코드는 아래와 같습니다.

<!-- 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>

servlet

    - servlet-name : Servlet 이름을 정의합니다.

    - servlet-class : 어떤 클래스로 서블릿을 만들지 명시합니다.

    - init-param : Spring이 해당 서블릿이 사용하는 Context를 만들 때 사용하는 정보를 저장합니다.

        - param-name : Spring이 Context를 만들 때 참조하는 이름입니다.

        - param-value : Spring이 Context를 만들 때 참조하는 파일 위치입니다.

    - load-on-startup : Spring이 load될 때, 바로 서블릿을 만들도록 합니다.

servlet-mapping

    - servlet-name : 서블릿 이름을 적습니다.

    - url-pattern : 서블릿이 정의한 url과 매핑되도록 명시합니다.

 

Context를 설명하고 있었는데, 갑자기 서블릿 내용이 나왔지만 당황하셨을 것입니다.

 

위에서 아래의 말을 언급했었습니다.

WebApplicationContext는 주로 Controller와 같이 특정 서블릿(DispatcherServlet) 에서만 사용되는 빈들을 저장합니다.

 

위 코드에서 <servlet-class> 태그에 DispathcerServlet이 명시되어있는 것이 보이시나요?

이 DispatcherServlet을 만들면서, 해당 DispatcherSerlvet이 사용하는 빈들을 모아둔 것이 WebApplicationContext인 것입니다.

 

Spring Web MVC가 DispathcerServelt을 어떻게 쓰는지 궁긍하신 분들은 이 링크를 타고 가시면 됩니다.

 

즉, 아래와 같이 결론을 내릴 수 있습니다.

Spring은 ApplicationContext와 WebApplicationContext를 만든다.

ApplicationContext는 root-context.xml로 만든다.

WebApplicationContext는 servlet-context.xml로 만든다.

 

Spring은 web.xml의 정보로 Context를 만들기 때문에,

root-context와 serlvet-context의 정보는 web.xml에 명시한다.

'삽질' 카테고리의 다른 글

REST API와 HTTP Header  (0) 2023.10.31
Mybatis selectKey 사용 방법  (0) 2023.10.26
Spring Web MVC 동작 과정  (0) 2023.10.21
findAll과 findById 조회의 차이  (0) 2023.10.12
@WebMvcTest 옵션으로 특정 클래스 지정하기  (0) 2023.09.18