스프링을 공부하면서 Context란 용어를 많이 봤는데 정확히 어떤 것을 나타내는지 알고 싶어서 공부해보았다.
1. Context란?
Bean을 다루기 위한 Container라는 공간 안에 Context라는 공간이 존재한다.
Bean들은 모두 Context에서 있기 때문에, 개념적으로 Bean들이 담겨있는 공간이라고 할 수 있다. 그리고 그외 여러 기능들도 있다고 한다. 즉 Context란, Bean들을 포함하여 여러 기능을 가진 공간이다.
2. 종류
자바에는 서블릿이란 객체가 존재한다. 모든 객체는 Bean으로 관리되니, 서블릿 또한 Bean으로 존재한다.
이러한 서블릿 Bean들도 각자 공통적인 부분이 있을 것이다. 예를 들면 DB 연결, 트랜잭션 처리, AOP 관련설정을 생각할 수 있다. DB 연결은 어떤 서블릿이건 꼭 갖고 있어야 하는 작업이다.
그런데 서블릿은 모두 독립적인 객체로 서로 간섭(공유)이 불가능하다.
그럼 모든 서블릿 Bean마다 공통 부분인 DB 연결이 들어갈 것인데, 이것은 심각히 비효율적이다.
따라서 스프링의 컨텍스트는 이러한 공통 부분을 서블릿에서 분리시켜 총 2가지의 Context가 있다.
2-1. Root-Context
모든 서블릿이 공유할 수 있는 Bean들이 모인 공간을 말한다.
DB와 관련된 Repository나, Service 등이 있다.
servlet-context 내 빈들은 이용이 불가능하다.
< web.xml 파일에서 Root-Context 설정하기 >
ContextLoaderListener를 이용하여 root-context를 생성한다.
1) <context-param> 을 이용하여 root-context 설정을 해준다.
<!-- contextConfigLocation : 설정 xml문서 로딩시 설정문서의 경로를 작성하기 위한 부분 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:root-context.xml
/WEB-INF/spring/spring-security.xml</param-value>
</context-param>
- contextConfigLocation은 IoC Container의 설정 파일의 위치를 의미한다.
- root-context.xml 파일이 root-context가 된다.
2) <listener> 태그의 ContextLoaderListener 클래스를 이용해 contextConfigLocation에 있는 root-context들을 불러온다.
<!-- web.xml에 있는 설정 문서 중 가장 먼저 로딩되어야 하는 xml문서를 읽어주기 위한 리스너 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2. Servlet-Context
서블릿에 대한 context 설정을 작성하며, 서블릿 각자의 Bean들이 모인 공간이다.
이 컨텍스트 내의 Bean들은 서로 공유될 수 없는 독자적인 context를 가지며, root-context 내 빈 사용이 가능하다.
웹 앱마다 한개씩 존재하므로, 웹 앱 그 자체를 의미하기도 한다.
MVC의 Controller(서블릿)를 담당한다.
< web.xml 파일에서 Servlet-Context 설정하기 >
DispatcherServlet를 이용하여 servlet-context를 생성한다.
<!-- DispatcherServlet : 스프링에서 제공, 사용자의 요청을 받아주는 용도의 객체로 아래 경로를 읽어들여 IOC 컨테이너 생성
servlet-context.xml : DispatcherServlet 객체 생성 시 읽어들일 문서로 각 요청에 처리하는 컨트롤러를 지정하는
핸들러 매핑과 요청 처리 후 뷰를 지정하는 뷰 리졸버의 정보들을 저장하고 있는 xml 문서
-->
<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>
<!-- default만 오버라이드 된 것, 모든 경로 다 받아줄 필요없다.(/* 안함) .jsp는 디스패처서블릿이 해줄 필요 없다.
.me , .do 일일히 다 적어주지 않고 모든 요청 받아들이겠다.
servelt-context.xml에서 정적 파일들은 경로를 지정해줘서 resources 안에 있다고 명시해줌-->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1) 클라이언트의 요청을 받으면 <servlet> 태그 안에 있는 설정들이 작동하면서 servlet-context(sertvlet-context.xml)을 불러옴과 동시에 root-context도 같이 불러온다.
출처 및 참고: https://velog.io/@seculoper235/Spring-Core-Context-1%ED%8E%B8
https://kingofbackend.tistory.com/77
'spring' 카테고리의 다른 글
[spring] POJO (0) | 2022.01.09 |
---|---|
[spring] DispatcherServlet (0) | 2021.10.23 |
[spring] annotation 이용한 DI (0) | 2021.10.20 |
[spring] 느슨한 결합력과 인터페이스(DI 이해에 도움) (0) | 2021.10.15 |
[spring] AOP (0) | 2021.10.15 |