로켓🐾
article thumbnail

 

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


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


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

 

따라서 이 관계들을 아래와 같이 그림화해보았습니다.

 

스프링 내에서의 context 구조

 


 

# 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를 이용한 몇가지 빈 생애 주기 스코프가 추가 되기도 합니다.

 

 

읽어주셔서 감사합니다.

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

 

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

profile on loading

Loading...