Spring Web MVC 3
๐ฟ Application Context ๊ณผ Servlet Context
Application Context
- Web Application ์ต์๋จ์ ์์นํ๊ณ ์๋ Context
- Spring์์ ApplicationContext๋ BeanFactory๋ฅผ ์์๋ฐ๊ณ ์๋ Context
- Spring์์ root-context.xml, applicationContext.xml ํ์ผ์ ApplicationContext ์์ฑ ์ ํ์ํ ์ค์ ์ ๋ณด๋ฅผ ๋ด์ ํ์ผ (Bean ์ ์ธ ๋ฑ..)
- Spring์์ ์์ฑ๋๋ Bean์ ๋ํ IoC Container (๋๋ Bean Container) ํน์ Servlet์ค์ ๊ณผ ๊ด๊ณ ์๋ ์ค์ ์ ํ๋ค (@Service, @Repository, @Configuration, @Component)
- ์๋ก ๋ค๋ฅธ ์ฌ๋ฌ Servlet์์ ๊ณตํต์ ์ผ๋ก ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋ Bean์ ์ ์ธํ๋ค.
- Application Context์ ์ ์๋ Bean์ Servlet Context์ ์ ์ ๋ Bean์ ์ฌ์ฉํ ์ ์๋ค.
Servlet-Context (servlet-context.xml)
- Servlet ๋จ์๋ก ์์ฑ๋๋ context
- Spring์์ servlet-context.xml ํ์ผ์ DispatcherServlet ์์ฑ ์์ ํ์ํ ์ค์ ์ ๋ณด๋ฅผ ๋ด์ ํ์ผ (Interceptor, Bean์์ฑ, ViewResolver๋ฑ..)
- URL์ค์ ์ด ์๋ Bean์ ์์ฑ (@Controller, Interceptor)
- Application Context๋ฅผ ์์ ์ ๋ถ๋ชจ Context๋ก ์ฌ์ฉํ๋ค.
- Application Context์ Servlet Context์ ๊ฐ์ id๋ก ๋ Bean์ด ๋ฑ๋ก ๋๋ ๊ฒฝ์ฐ, Servlet Context์ ์ ์ธ๋ Bean์ ์ฌ์ฉํ๋ค.
- Bean ์ฐพ๋ ์์
- Servlet Context์์ ๋จผ์ ์ฐพ๋๋ค.
- ๋ง์ฝ Servlet Context์์ bean์ ๋ชป์ฐพ๋ ๊ฒฝ์ฐ Application Context์ ์ ์๋ bean์ ์ฐพ๋๋ค.
- Servlet Context์ ์ ์๋ Bean์ Application Context์ Bean์ ์ฌ์ฉํ ์ ์๋ค.
๋๋๋ ๊ธฐ์ค
- Application Context
- ๊ณตํต ๊ธฐ๋ฅ์ ํ ์ ์๋ Bean ์ค์ (Datasource, Service)
- ๊ฐ Servlet์์ ๊ณต์ ํ ์ ์๋ Bean
- Servlet Context
- Servlet ๊ตฌ์ฑ์ ํ์ํ Bean ์ค์ (Controller, Interceptor, MappingHandler๋ฑโฆ)
์ฆ Servlet Context๋ Application Context์ ์ฑ์ง์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฌ๋ AC๊ฐ SC์ ํ์ ์ปจํ ์คํธ๋ก ํ์ ์ ์ญํ์ ๋ถ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค ์ปจํ ์คํธ ์ด๋ฏ๋ก ์ ์ฅ๋๋ ๊ฒ์ ๊ฒฐ๊ตญ java Object์์ ํ๋ฆผ์๋ค.
- SC๋ AC๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ์ง๊ณ getServletContext()๊ฐ ์ถ๊ฐ๋ Interface์ธ๋ฐ SC์์ ํธ์ถ ํ ์ ํด๋น๋๋ Servlet์ผ๋ก ๋ณํ๋๋ค.
- ์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋จ๊ณผ ๋์์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ฅผ ์ด์ฉํ ๋ช๊ฐ์ง ๋น ์์ ์ฃผ๊ธฐ ์ค์ฝํ(์ ํ๋ฆฌ์ผ์ด์ , ๋ฆฌํ์คํธ, ์ธ์ ๋ฑ)๊ฐ ์ถ๊ฐ๋๊ธฐ๋ ํฉ๋๋ค.
___
๐ฟ web.xml
์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ ๊ณณ์ ์ด๋ฆ์ web application deployment descriptor ๋ผ๊ณ ํ๋๋ฐ ์ด ์ญํ ์ ํ๋ ๊ฒ์ด web.xml
- WAS ๊ตฌ๋ tl /WEB-INF ๋๋ ํ ๋ฆฌ์ web.xml์ ์ฝ์ด ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?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 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<!-- applicationContext.xml์์ ์ค์ ํ Bean์ ๋ชจ๋ ์๋ธ๋ฆฟ, ํํฐ์์ ๊ณต์ -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.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>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- dispatcherServlet ์์ฑ ์, ์๋ธ๋ฆฟ ์ค์ ํ์ผ ๋ก๋ -->
/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- dispatcherServlet ๋ํ url-pattern์ ์ ์
/๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ DispatcherServlet์์ ์ฒ๋ฆฌ -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
์ ๋ฆฌํ์๋ฉดโฆ
- ์์ฒญ์ด ๋ค์ด์จ๋ค.(Servlet Container ์ฆ tomcat ๊ฐ์ WAS์)
- Servlet Container๊ฐ ์ฐ๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ๋ค์ด์จ ์์ฒญ์ ์๋ง์ ์ฐ๋ ๋์ ๋ฐฐ์ ํ๋ค.
- ์ฌ๊ธฐ์ DispatcherServlet์ doService()๊ฐ ์ผ์ ํ๋๋ฐ DispatcherServlet๋ ํ๋๋ง ์กด์ฌํ๊ณ doService()๋ง ๊ฐ ์ฐ๋ ๋์์ ์๋ํ๋ค.
- doService๋ฅผ ํตํด ์คํ๋ ์๋ธ๋ฆฟ์ ์ดํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ผ์ ์ฒ๋ฆฌํ๋ค.
- Application Context๋ ์ฐ๋ ๋ ๋ณ๋ก ์์ฑ๋๋ ๊ฒ์ด ์๋ ํ๋๋ง ์๊ณ ๊ฐ ์ฐ๋ ๋๊ฐ ์ด๋ฅผ ์ฐธ๊ณ ํ๋ ๋ฏ ํ๋ค.
- Application Context๊ฐ Bean์ Life-Cycle์ ๊ด๋ฆฌํ๋๋ฐ Bean์ ์ค์ฝํ์ ๋ฐ๋ผ ๊ด๋ฆฌํ๋ค.
๐ฟ Thread ์ ๋น
๊ทธ๋ ๋ค๋ฉด ํ๋์ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋๋ ๋น๋ค์ Thread Safe ํ ๊น? ๋ง์ฝ ์ฐ๋ ๋ ๋ณ๋ก ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค๋ฉด ๊ทธ๋ฌํ ๊ฒ์ด๋ค. ํ์ง๋ง ํ๋์ ์ปจํ ์คํธ๋ฅผ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๊ณ ์์ผ๋ฉฐ ์ปจํ ์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Singleton์ ์ฌ์ฉํ๋ค.
์ฆ ๊ณต์ ๋๋ Singleton Bean์ ๊ธฐ๋ณธ์ ์ผ๋ก Thread-Safe ํ์ง ์๋ค๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค.
๊ทธ์ ๊ดํ Stack Overflow ๋ต๋ณ
1
2
3
4
5
6
7
8
Are Spring Beans Thread Safe?
No.
Spring has different bean scopes (e.g. Prototype, Singleton, etc.) but all these scopes enforce is when the bean is created. For example a "prototype" scoped bean will be created each time this bean is "injected", whereas a "singleton" scoped bean will be created once and shared within the application context. There are other scopes but they just define a time span (e.g. a "scope") of when a new instance will be created.
The above has little, if anything to do with being thread safe, since if several threads have access to a bean (no matter the scope), it would only depend on the design of that bean to be or not to be "thread safe".
The reason I said "little, if anything" is because it might depend on the problem you are trying to solve. For example if you are concerned whether 2 or more HTTP requests may create a problem for the same bean, there is a "request" scope that will create a new instance of a bean for each HTTP request, hence you can "think" of a particular bean as being "safe" in the context of multiple HTTP requests. But it is still not truly thread safe by Spring since if several threads use this bean within the same HTTP request, it goes back to a bean design (your design of a bean backing class).
https://stackoverflow.com/questions/15745140/are-spring-objects-thread-safe
์ ๋ฆฌํ์๋ฉดโฆ
์์ ๊ทธ๋ฆผ์ฒ๋ผ DispatcherServlet ๊ณผ Application Context๋ ํฌํจ๊ด๊ณ์ ์๋ ๊ฒ์ด ๋ง๋ค. ๋ค๋ง ํจ์ ์คํ์ Thread Pool์์ ์คํ๋๋ค.