Spring์ Dispatcher Servlet
๐Dispatcher Servlet๐
๋งค๋ฒ ์๋ธ๋ฆฟ ๊ด๋ จ์ด ๋์ค๋ฉด ์ใ ... ์... ๊ทธ๋ ์๋ธ๋ฆฟ ๋๋ฌด ๋ง์ด ๋ค์ด๋ดค๋๋ฐ... ๊ทผ๋ฐ ์ ํํ๊ฒ ๋ญ์ง๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค!!! ๋ต๋ตํ๋ค!!!!์ถ์๋ค.
๊ทธ๋ ์ค๋์ด ๋ฐ๋ก ๊ทธ๋ ์ด๋ค....
์๋ธ๋ฆฟ์ ์กฐ์ ธ๋ฒ๋ฆฌ๋๋ ~..~
๊ฐ๋จํ ๊ฑธ ๋งค์ผ ๋ฏธ๋ค๋ฒ๋ ค ์ค๋์ ๊ผญ ํฉ์ด์ ธ์๋ ์ง์๋ค์ ํค์ณ๋ชจ์ฌ ์์ผ์ ํฉ์ฒด์์ผ์ ์ดํดํด์ผ๊ฒ ๋ค.
1. what's Dispatcher Servlet?
: HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์ํด์ฃผ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ด๋ค.
๋ง์ฝ, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ์ค๋ฉด > ํฐ์บฃ๊ณผ ๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ๋ฐ๋๋ค. > ์ด ๋ชจ๋ ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒ ๋๋ค > ์ด์น๊ตฌ๊ฐ ๊ณตํต์ ์ธ ์์ ์ ๋จผ์ ์ฒ๋ฆฌํ ํ, ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์์ ์ ์์ํ๋ค.
์ ์ฝ๊ฒ ์๊ฐํ๋ฉด
์ ์๋์ด >> ๋ฐ์ฅ์๊ฒ ์์ฒญ (์ฐ๋ฆฌ๋ฐ ๋๊ตฌ๋๊ตฌ ์ค๋ฌธ์กฐ์ฌ ํด์๋ผ) >> ํ๋ฉด ๋ฐ์ฅ์ >> ์ฐ๋ฆฌ๋ฐ ๋๊ตฌ๋๊ตฌ์๊ฒ ๊ฐ์ ๊ทธ ์์ฒญ์ ์ ๋ฌํ๊ณ >> ๋ค์ ์ค๋ฌธ์กฐ์ฌ ๋ฐ์์์ >> ๋ค์ ์ ์๋๊ป ์ ๋ฌ.
์ด๋ฐ ๊ณผ์ ์์ ๋ฐ์ฅ์ด ๋ฐ๋ก Dispatcher Servlet์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์ด๋ป๊ฒ ์ ์ ์์ ์์ฒญ(V)๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ(C)์ ๊ตฌ๋ถํ ๊น?
Dispatcher Servlet์ด ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ๋จผ์ ์ฐพ์๋ณด๋๋ฐ, ์ด ์์ฒญ์ ๋ํ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ > 2์ฐจ๋ก Resource ๊ฒฝ๋ก๋ฅผ ํ์ํ์ฌ ์ ์ ์์์ ํ์ํ๊ฒ ๋๋ค.
- ๋ฐ์ ๊ณผ์
1) ๊ฐ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ธ๋ฆฟ ๋ฑ๋ก ๋ฐ ๋งคํ
์๋ ๊ณผ๊ฑฐ์๋ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ธ๋ฆฟ์ด ์กด์ฌํ๊ณ , ์ด ์๋ธ๋ฆฟ์ ๋ชจ๋ web.xml์ url ๋งคํํ์ฌ ๋ฑ๋กํด์ฃผ์ด์ผ ํ๋ค.
ex) /myurl ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ธ๋ฆฟ ๋ฑ๋ก ๋ฐ ๋งคํ + ๋ง์ฝ ๋ค๋ฅธ url์ด๋ค? ๊ทธ๋ผ ๋ ์๋ก ๋งคํํด์ฃผ์ด์ผ ํจ. ใ ใ กใ ๊ท์ฐฎ์!!
<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>MyWebApp</display-name>
<!-- Servlet Configuration -->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<!-- Servlet Mapping -->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myurl</url-pattern>
</servlet-mapping>
</web-app>
2) Spring MVC์ Dispatcher Servlet ๋ฑ์ฅ & web.xml์ ๋งคํ
์ด๋ฌํ ๋ถํธํจ์ ํด๊ฒฐํ ๊ฒ์ด "dispatcher servlet"์ด๋ค. (์๊ฐ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋งํ๊ณ , ๊ณตํต ์์ ์ ์ฒ๋ฆฌํด์ฃผ๊ณ , ์์ฒญ์ ๋๋ ์ฃผ๋ ์ญํ ์ธ ๊ฒ!!!)
ex) dispatcher๋ฅผ ์ค์ ๋ฐ ๋งคํ
// web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>MySpringApp</display-name>
<!-- Configuring the Dispatcher Servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3) ์คํ๋ง ๋ถํธ ๋ฑ์ฅ & ์๋์ผ๋ก Dispatcher Servlet ๋ฑ๋ก
๊ทธ๋ฆฌ๊ณ ์คํ๋ง ๋ถํธ์์๋ ์ด๋ฌํ "web.xml" ํ์ผ ์์ด๋ ์๋์ผ๋ก Dispatcher Servlet์ด ์ค์ ๋๊ฒ ๋์๋ค. @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์ธ ํด๋์ค์์ ์๋์ผ๋ก ์ค์ ๋๋ค!!
public class DispatcherServlet
extends FrameworkServlet {...}
public abstract class FrameworkServlet
extends HttpServletBean
implements ApplicationContextAware {...}
public abstract class HttpServletBean
extends HttpServlet
implements EnvironmentCapable, EnvironmentAware {...}
public abstract class HttpServlet
extends GenericServlet {...}
>> ์์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด DispatcherServlet์ ๊ฒฐ๊ตญ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ฉด HttpServlet์ ์์๋ฐ๋๋ค.
2. Dispatcher Servlet์ ๋์ ๊ณผ์
1) ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ฐ๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ(์น ์ปจํ ์คํธ)์์ ~ ํํฐ๋ค์ ์ง๋ ~ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์์ฒญ์ ๋ฐ๊ฒ ๋๋ค. (์ค์ ๋ก๋ ์ธํฐ์ ํฐ๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์์ํ์ง๋ ์๋๋ค. ๊ทธ๋ฆผ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋์ํํ ๊ฒ)
2) ์์ฒญ ์ ๋ณด๋ฅผ ํตํด ์์ฒญ์ ์์ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
- ์ด๋ ๊ฐ์ฅ ๋จผ์ ์ด๋ ์ปจํธ๋กค๋ฌ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋์ง ์ฐพ์์ผ ํ๋๋ฐ, ์ด ์ญํ ์ HandlerMapping์ด ํด์ค๋ค. ๊ทธ๋์ ์คํ๋ง์ HandlerMapping ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ , ๋ค์ํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์์ฒญ์ ์ฒ๋ฆฌํ ๋์์ ์ฐพ๋๋ก ๋์ด์๋ค.
- ์ด HandlerMapping ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด RequestMappingHandlerMapping์ด๋ค.
: ์ปจํธ๋กค๋ฌ ํด๋์ค์์ @RequestMapping ์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ ค์๋ ๋ฉ์๋์ RequestMappingInfo ์ธ์คํด์ค๋ฅผ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฅผ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ค๋ณด๋ฉด AbstractHandlerMapping์ด ๋์ค๋๋ฐ, ์ฌ๊ธฐ์์ given request์ ๋ํ Handler๋ฅผ ์ฐพ๋ ๋ฉ์๋๊ฐ ์๋ค.
- ์ฌ๊ธฐ์ HandlerExecutionChain์ผ๋ก ๊ฐ์ธ์ ๋ฐํํ๊ฒ ๋๋ค. (์ด์ ๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ๋๊ฒจ์ฃผ๊ธฐ ์ ์ ์ฒ๋ฆฌํด์ผํ๋ ์ธํฐ์ ํฐ ๋ฑ์ ํฌํจํ๊ธฐ ์ํด์)
3) ์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ์์ํ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์์ ์ ๋ฌํ๋ค.
์ด์ ์์ฒญ์ ๋ฐ๋ก ์ปจํธ๋กค๋ฌ๋ก ์์ํ๋ ๊ฒ์ด ์๋๋ผ HandlerAdapter๋ฅผ ํตํด ์์ํ๊ฒ ๋๋ค.
- ์ด์น๊ตฌ๊ฐ ๊ฐ ์์ฒญ์ ๋ฐ๋ผ implementation๋๊ฒ ๋๋ค. ์ด๋ค ์ฝ๋ ๋ฐฉ์์ด๋ ์๊ด์์ด!
4) ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์์ํ๋ค.
: ์์ฒญ์ ์์ํ ์ /ํ์ ๊ณตํต์ ์ธ ์ /ํ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
5) ์ปจํธ๋กค๋ฌ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ ๋ฐํ๊ฐ์ ๋ฐํํ๋ค.
: ์ปจํธ๋กค๋ฌ๋ ์๋น์ค๋ฅผ ํธ์ถํ๊ณ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๋น์ฆ๋์ค ๋ก์ง๋ค์ ์งํํ๊ณ ์ฒ๋ฆฌ ์ดํ ๋ฐํ๊ฐ์ ๋ฐํํ๋ค.
์ฃผ๋ก ResponseEntity๋ก ๋ฐํํ๊ณ , ์๋ต ํ์ด์ง๋ String์ผ๋ก View์ ์ด๋ฆ์ ๋ฐํํ๊ธฐ๋ ํ๋ค.
6) ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ๋ฐํ๊ฐ์ ์ฒ๋ฆฌํ๋ค.
- ๋ง์ฝ ResponseEntity๊ฐ ๋ฐํ๋์๋ค๋ฉด HttpEntityMethodProcessor๊ฐ MessageConverter๋ฅผ ์ฌ์ฉํด ์๋ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ณ , ์๋ต ์ํ๋ฅผ ์ค์ ํ๋ค.
- ๋ง์ฝ View๊ฐ ๋ฐํ๋์๋ค๋ฉด ViewResolver๋ฅผ ํตํด View๋ฅผ ๋ฐํํ๋ค.
7) ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํ๋ค.
- ๋ค์ ํํฐ๋ค์ ๊ฑฐ์ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ค.
๋๋์ด ๋ญ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฒญ์ ๋ฐ๊ณ ์ฒ๋ฆฌํ๋์ง ์ ๊ฒ ๊ฐ๊ธฐ๋.............. ๋ ํค์ณ๋ชจ์ฌ ํ๋ ๊ตฌ๊ฐ์ด ์ค๊ฒ ์ง!? ใ ใ ใ
์ผ๋จ ์ค๋ ๊ธฐ์ตํ ๊ฒ์!
๐๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ฐ์ฅ๊ฐ์ ์ญํ ! ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ํ๋ค.
๊ทธ ๋์๋ HttpServlet์ด ์๋ค!
HandlerMapping์ ์ด๋ค ํธ๋ค๋ฌ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ๊น? ๊ฒฐ์
HandlerAdapter๋ ์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ก ์์ํด์ฃผ๋ ์ญํ
'Programming > Spring, SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JWT (1) | 2024.01.29 |
---|---|
HandlerInterceptor & Filter / SecurityFilterChain (0) | 2024.01.27 |
CustomUserDetailsManager๊ณผ CustomUserDetails ๋ง๋ค๊ธฐ (1) | 2024.01.26 |
Spring Security... ๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค (0) | 2024.01.25 |
Testing (1) | 2024.01.24 |