아이엠 !나이롱맨😎
article thumbnail
Published 2021. 1. 20. 23:03
[Spring] root-context와 servlet-context ...
반응형

 

이 글은 제가 이해한 개념을 바탕으로 작성하였기에 틀린 부분이 있을 수 있습니다. 틀린 부분 있다면 지적해주세요 :)

 

스프링에서 말하는 컨텍스트(context)스프링이 관리하는 빈들이 담겨 있는 컨테이너 라고 생각하시면 됩니다.

 

스프링을 계속 공부중이지만 엄청 헷갈렸던 부분이 WebApplicationContext와 ApplicationContext의 관계, web.xml에서의 servlet-context와 root-context의 관계 그리고 ContextLoaderListenter와 dispatcher-servlet의 관계 총 이 3개의 관계가 볼때마다 헷갈렸습니다. 

 

스프링 내에서의 context 구조

 


# root-context 와 sevlet-context 흐름

 

이 글은 WAC와 AC 관련 글이 아니므로 root-context와 servlet-context에 대해서만 알아보겠습니다.

 

STS을 활용하여 스프링 프로젝트를 생성하면 web.xml이라는 파일이 있습니다.

 

<?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/action-mybatis.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>

 

<context-param> 태그 안에 있는 설정이 root-context 관련한 것들이고 <servelet> 태그 안에 있는 설정이 servlet-context 관련 설정입니다.

 

흐름을 정리해보겠습니다.

 

  1. <context-param>을 이용하여 root-context 설정을 해줍니다.(action-mybatis가 root-context)
  2. <listener>태그의 ContextLoaderListener 클래스를 이용하여 contextConfigLocation에 있는 root-context들을 불러옵니다.
  3. 클라이언트의 요청을 받으면 <servlet> 태그 안에 있는 설정들이 작동하면서 servlet-context(sertvlet-context.xml)을 불러옴과 동시에 root-context와 같이 불러옵니다. 이때 DispatcherServlet 클래스를 실행시킵니다.

 


# root-context와 servlet-context 비교

 

위에 흐름도를 간단하게 설명하자면 web.xml에서 ContextLoaderListener를 이용하여 root-context를, DispatcherServlet를 이용하여 servlet-context를 생성합니다.

 

ㅣ root-context 

  • root-context에 등록되는 빈들은 모든 컨텍스트에서 사용할 수 있습니다. (공유 가능)
  • service나 dao를 포함한, 웹 환경에 독립적인 빈들을 담아둡니다.
  • 서로 다른 servlet-context에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있습니다.
  • servlet-context 내 빈들은 이용이 불가능합니다.

 

ㅣ servlet-context

  • servlet-context에 등록되는 빈들은 해당 컨테스트에서만 사용할 수 있습니다.
  • DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는 데 사용합니다.
  • 독자적인 컨텍스트들을 가지며, root-context 내 빈 사용이 가능합니다.

 

root-context는 공유가 가능한 반면 servlet-context는 해당 컨텍스트 내에 있는 빈만 사용이 가능하므로 

root-context 같은 경우 Service와 Repository(Dao) servlet-context 같은 경우 Controller를 담당합니다.

 

만약 겹치는 빈이 생길 경우 servlet-context의 빈을 우선시 합니다.

 

이상 root-context와 servlet-context에 대해 알아보았습니다.

 

읽어주셔서 감사합니다.

질문은 언제나 환영합니다.

 

"난 반드시 백엔드 왕이 될거야"

 

반응형

article prev thumbnail
article next thumbnail
profile on loading

Loading...