framework/spring

SpringContainer와 ApplicationContext

wooweee 2024. 8. 17. 16:47
728x90
  • 목표
    • Contaienr와 Contex의 개념 확립

  • 알면 좋은 점
    • Contaienr와 Context는 Servlet과 Spring에서 정말 자주 사용되는 용어로 둘의 차이점을 알아두면 학습 및 개발 이해도를 높일 수 있다.

  • 사전 지식

 

1. Spring Container

  • Servlet Container의 web.xml의 설정을 통해서 생성

  • Spring Container는 WAS 내부에 존재하고 ServletContainer 위에(논리적으로) 존재하여 servletContainer와 협력적인 관계를 가짐

  • Spring Container 는 BeanFactory혹은 ApplicationContext를 구현한 객체를 의미한다.

 

2. ApplicationContext

  • Spring Container == ApplicationContext 객체
    • cf) WAS의 경우 WebContainer객체를 생성하고 webContainer내부에서 webContext를 생성하고 동작

  • ApplicationContext 에서 bean의 생명 주기 및 의존성 관리를 수행한다.

  • 실제 프로젝트 시, 설정 xml 파일을 여러개로 분리를 해두지만 실제로 SpringContainer는 1개만 올라간다.

 

3. ApplicationContext 와 ServletContext 계층 구조

  • springContainer(=ApplicationContext)는 1개만 생성된다고 했는데 관련 블로그들을 찾아보면 항상 나오는 내용인 계층 구조가 존재
    • 예) RootContext(=Application)는 servletContext를 참조 못하지만 ServletContext는 RootContext까지 참조하여 필요한 객체를 찾아낼 수 있다.

  • 이 부분은 web.xml 설정을 같이 보아야 이해를 할 수 있다.
    • WAS가 올라면선 webContainer가 web.xml을 읽으면서 생성이 되는데 이 때 WebContainer 안에서 전역변수로 ApplicationContext를 등록하고 ServletContext 객체에는 Spring이 제공하는 dispatcherServlet을 등록한다.

    • 결론적으로 dispatcherSerlvet이 원래 ApplicationContext를 부모로 받는 것이 아닌 web.xml 설정인 context-param이란 전역 처리 설정을 통해서 만들어 둔 것

    • 참고 : web.xml
	<!-- trigger 역할, web.xml에서 1순위로 읽는다. - load-on-startup 보다 우선권을 가진다.-->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	
	<!-- ApplicationContext 들의 위치를 읽어서 SpringContainer 1개를 띄운다.-->
	<!--context-param : WAS 안에서 전역변수 역할 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:/spring/context-*.xml</param-value>
	</context-param>    
        
    
	<!-- 스프링에서 제공하는 서블릿을 등록, Servlet 정보를 토대로 ServletContext가 생성 됨 -->
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		
		<!-- init-param : servlet-context에 등록 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/springmvc/dispatcher-servlet.xml</param-value>
		</init-param>
 		<load-on-startup>1</load-on-startup>
	</servlet>

 

 

4. 정리

  • WAS와 웹 컨테이너
    • WAS는 웹 애플리케이션을 실행하고 관리하는 전체적인 환경을 제공하는 서버
    • 웹 컨테이너는 WAS의 일부로, 서블릿, JSP 등 웹 컴포넌트의 생명주기를 관리하고, HTTP 요청을 처리하는 역할
    • web.xml은 웹 컨테이너가 웹 애플리케이션을 시작할 때 읽는 설정 파일로, 서블릿 매핑, 초기화 파라미터 등을 정의
    • 웹 컨텍스트는 웹 컨테이너가 web.xml의 정보를 바탕으로 생성하는 객체로, 서블릿과 서블릿 컨테이너와 서블릿이 통신하기 위해 사용하는 메소드를 지원하는 인터페이스

  • 스프링 컨테이너와 애플리케이션 컨텍스트
    • 스프링 컨테이너는 스프링 프레임워크의 핵심으로, Bean(객체)를 생성, 관리, 연결하는 역할
    • 스프링 컨텍스트는 스프링 컨테이너의 구체적인 구현체로, Bean을 찾고, 생성하고, 관리하는 기능을 제공
    • 스프링 컨텍스트는 일반적으로 XML, Java Config, Annotation 등 다양한 방법으로 설정

  • ServletContext와 ApplicationContext
    • 각자의 목적이 존재
    • web.xml 설정 방법에 따라서 계층 구조를 가질 수 있다.

  • 구조도
    • WAS 안에 webContainer 와 SpringContainer
    • webContainer 안에 ServletContext
    • SpringContainer 안에 Bean
    • webContainer와 SpringContainer는 서로 협력 관계

  • TODO 그림은 나중에

 

참고 자료 : 

 

다음 포스팅 :