[Spring] Dispatcher-Servlet์ ๋์ ๊ณผ์ ์ ์์๋ณด์.
Dispatcher - Servlet์ด๋?
Dispatcher Servlet์ ์์, _Servlet_์ด๋ ์๋ฐ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ ํน์ ๊ทธ ์ฌ์์ ๋ปํ๋ค. ์๋ฐ์ Servlet์ ์น ์๋ฒ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์ ์ฌ์ฉ๋๋๋ฐ, ๊ฐ๋จํ๊ฒ ์๊ฐํ์๋ฉด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ด๋ค.
_Dispatcher-Servlet_๋ํ _Servlet_์ ์ผ์ข ์ผ๋ก ๊ทธ ์ญํ ์ ์ดํด๋ณด์๋ฉด Dispatcher์ ์๋ฏธ๋ฅผ ์ฐพ์๋ณด๋ฉด ๋๋ค. ์ด๋ "๊ธํ์"๋ผ๋ ๋ป์ผ๋ก ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ ํจ์์ธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํด์ฃผ๋ ์ญํ ์ ๊ฐ์ง๋ค.
์ฆ, _Dispatcher-Servlet_์ HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์๊ฒ ์์ํด์ฃผ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ด๋ค. ์ ํํ๋ ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๊ฐ์ฅ ๋จผ์ Tomcat๊ณผ ๊ฐ์ _Servlet Container_์๊ฒ ์์ฒญ์ด ๋ค์ด์ค๊ณ , ์ด๋ฌํ ์์ฒญ์ Dispatcher-Servlet์ด ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒ๋๋ค.
Dispatcher - Servlet์ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋งํด์ฃผ๋ฉด์ ๊ณตํต์์ ์ ์ํํด์ค๋ค๋ ์ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํ๋ค. ํ์ง๋ง, ์ด๋ฏธ์ง๋ HTML/CSS/JS์ ๊ฐ์ ์ ์ ํ์ผ์ ๋ํ ์์ฒญ ๋ํ ๋ชจ๋ ๊ฐ๋ก์ฑ๋ ๋ฐ๋์ ์ ์ ์์์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฒซ ๋ฒ์งธ๋ URL๋ก ํด๋ผ์ด์ธํธ ์์ฒญ์ ๊ตฌ๋ถํ๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, /apps๋ก ์ ๊ทผํ๋ฉด dispatcher servlet์ด ๋ด๋นํ๋๋ก ํ๊ณ , /resources๋ก ์ ๊ทผํ๋ฉด dispatcher servlet์ด ๋ด๋นํ์ง ์๋๋ก ํ๋ค.
ํ์ง๋ง, ์ฝ๋๊ฐ ๋๋ฌ์์ง๊ณ ์ง๊ด์ ์ด์ง ๋ชปํ๋ค๋ ๋จ์ ๋๋ฌธ์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ปจํธ๋กค๋ฌ์์ ์ฐพ์ ์ ์๋ ์์ฒญ์ ๋ํด์๋ ์ ๋ถ Resource ๊ฒฝ๋ก๋ก ํ์ํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ง๋ ๋ค๋ฉด, ํ์ฅ์ ์ฉ์ดํ ๋ฟ๋ง์ด ์๋๋ผ ๊ด๋ฆฌ๋ ํธํด์ง๋ค.
Dispatcher Servlet์ ๋ด๋ถ์ ์ผ๋ก HttpServlet์ ์์ ๋ฐ๊ณ ์๋ค.
(์ ํํ๋ DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet ์์ ๊ตฌ์กฐ์ด๋ค.)
๐ถ HttpServlet
Http ์๋ธ๋ฆฟ์ ๊ตฌํํ๊ธฐ ์ํ J2EE ์คํ์ ์ถ์ ํด๋์ค์ด๋ค. ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ํน์ HTTP ๋ฉ์๋๋ฅผ ์ง์ํ๊ธฐ ์ํด์๋ doX ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ผ ํ๋ค.
๐ถ HttpServletBean
HttpServlet์ Spring์ด ๊ตฌํํ ์ถ์ ํด๋์ค์ด๋ค.
๐ถ FrameworkServlet
Spring ์น ํ๋ ์์ํฌ์ ๊ธฐ๋ฐ์ด ๋๋ ์๋ธ๋ฆฟ์ด๋ค. HttpServlet์ doX ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๊ณ ์๋ค.(์ด๋, PATCH์์ฒญ์ ๋ฐ๋ก ์ฒ๋ฆฌ) ๊ฐ doX ๋ฉ์๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์ธ processRequest๋ฅผ ํธ์ถํ๋ค.
processRequest์ ์ค์ ์์ฒญ ํธ๋ค๋ง์ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ด ์ ์ฉ๋์๊ธฐ์ doService๋ก ์์๋๋ค.
๐ถ DispatcherServlet
์ค์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ doService๋ฅผ ๊ตฌํํ๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ Servlet WebApplicationContext๋ฅผ ์์ฑํ๊ณ , Root WebApplicationContext๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์์ Controller, ViewResolver, HandlerMapping๋ฑ์ด ์๋ค.
Root WebApplicationContext๋ฅผ ์์ฑํ ๊ฒฝ์ฐ, Infra Bean์ด ์์ฑ๋๋ ๋ฐ Repository๋ Service๊ฐ ์ด์ ํด๋น๋๋ค.
Dispatcher - Servlet์ ๋์ ๊ณผ์
1๏ธโฃ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ฐ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ธ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ๋๋ค.
2๏ธโฃ ์์ฒญ ์ ๋ณด๋ฅผ ํตํด์ ์์ฒญ์ ์์ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
์ด ๋จ๊ณ ๋ถํฐ ์๋ ๊ทธ๋ฆผ์ _doService_ ๋ฉ์๋๊ฐ ์ํ๋๋ค. _DispatcherServlet_์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค์ ์์ ์ ์์ํ๋๋ฐ, ์ด๋ ๊ฒ ์์๋ฐ๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ์ ๋น(Special Bean)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ ์ค์์๋ _HandlerMapping_์ด๋ผ๋ ์คํ์ ๋น์ ํตํด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ค.
_DispatcherServlet_์์ ์์ํ๋ ์คํ์ ๋น์ ์๋์ ๊ฐ๋ค.
1. _HandlerMapping_ : ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
2. _HandlerAdapter_ : ์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ๋ค.
3. _handlerExceptionResolver_ : ์์ฒญ์ ๋ํ ์์ธ ๋ฐ์ ์ ์ฒ๋ฆฌํ๋ค.
4. _viewResolver_ : ๋ฆฌํด ๊ฐ์ ๋ํ ๋ทฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ค. ์ด๋, String์ผ๋ก ๋ทฐ ์ด๋ฆ์ ๋ฐ๋๋ค๋ฉด modelAndView์ ๊ฐ์ ๊ฐ์ฒด๋ก ๋ฐํํ๋ค.
5. _LocalResolver_ : Local์ ๊ฒฐ์ ํ๋๋ฐ, ์ด๋ ์ ์ ์ ์ธ์ด๋ ์ง์ญ์ด๋ ์ถ๋ ฅํ์์ ์ง์ ํ๋ ๋ฌธ์์ด์ด๋ค.
6. _MultipartResolver_ : ๋ฉํฐ ํํธ ํ์ผ ์ ๋ก๋๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ฉํฐ ํํธ๋ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ๋๋ฅผ ์ฌ๋ฌ ๋ฒ ๋๋์ด ๋ณด๋ผ ๋ ํ์ผ ํ์์ ์๋ฏธํ๋ค.
Spring boot ๊ฐ๋ฐ ์ ์์ฃผ ์ฌ์ฉํ๋ _@Controller_ ๋ฐฉ์์ _RequestMappingHandlerMapping_์ด ์ฒ๋ฆฌํ๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ํ์ํ๊ณ HashMap์ผ๋ก ์์ฒญ ์ ๋ณด์ ๊ทธ ๋์์ ๊ด๋ฆฌํ ์ ์๋ค.
๊ด๋ฆฌ ๋์์ _HandlerMethod_ ๊ฐ์ฒด๊ฐ ์ค๊ฒ ๋๋๋ฐ ์ด ์์๋ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๊ฐ ๋ค์ด์๋ค. _HandlerMethod_๋ ๊ทธ ์์ฒด๋ก ์ ์ฅ๋์ง ์๊ณ _HandlerExceptionChain_์ผ๋ก ๊ฐ์ธ์ ๋ณด๊ด๋๋ค. ๊ทธ ์ด์ ๋ ์ /ํ "์ธํฐ์ ํฐ"๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
3๏ธโฃ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์์ ์์ฒญ์ ์์ํ๋ค.
_DispatcherServlet_์ ์์ ์ปจํธ๋กค๋ฌ์ ๋ํ ์ ๋ณด๊ฐ ์ ์ฅ๋ _HandlerExceptionChain_์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๋๋ค. ๋์ _HandlerAdapter_๋ผ๋ ์ด๋ํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์คํํ๋ค.
๊ตณ์ด ๋ฐ๋ก ์ฐ์ง ์๊ณ ์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ํตํ๋ ์ด์ ๋ ํ์ฌ ๋ค์ํ ํํ์ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฒ์ผ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ํฌ๋งท์ด ๋ค๋ฅด๋๋ผ๋ _DispatcherServlet_์ ์ ์ฅ์์๋ _HandlerAdapter_๋ฅผ ํตํด ์์ ์ ์ฝ๋๋ฅผ ๋ฐ๊พธ์ง ์์๋ ๋๋ค.
_HandlerAdapter_๋ฅผ ์ฐพ๊ธฐ ์ํด์ _getHandlerAdapter()_ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด๋ ๊ฒ ์ป์ด์ง _HandlerAdapter_๋ฅผ ํตํด์ ์ด์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ด๋ค.
_HandlerAdapter_๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์์ํ ์ /ํ์ ๊ณตํต์ ์ผ๋ก ์ /ํ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค. ์ด ๊ณผ์ ์์ ๋ํ์ ์ผ๋ก ์ธํฐ์ ํฐ๋ฅผ ํฌํจํ์ฌ _@RequestParam_๊ณผ _@RequestBody_๋ฅผ ์ฒ๋ฆฌํ๋ _ArgumentResolver_์ ์ง๋ ฌํ ์ฒ๋ฆฌ๋ฅผ ์ํ _ReturnValueHandler_ ๋ฑ์ด _HandlerAdapter_์์ ์ฒ๋ฆฌ๋๋ค.
4๏ธโฃ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
์ปจํธ๋กค๋ฌ๋ _Root WebApplicationContext_ ์์ _Service_์ _Repository_๋ฑ์ ํธ์ถํด๊ฐ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
5๏ธโฃ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํ๊ฐ์ ๋ด๋๊ณ , _HandlerAdapter_๊ฐ ์ฒ๋ฆฌํ๋ค.
_HandlerAdapter_๋ ๋ฐํ๊ฐ์ ๋ฐ์์ _Dispatcher Servlet_์ผ๋ก ๋๋ ค์ฃผ๋๋ฐ, ์ด๋ ๋ฐํ ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋์ ํ๋ค.
๋ง์ฝ, ์ปจํธ๋กค๋ฌ๊ฐ _ResponseEntity_๋ฅผ ๋ฐํํ๋ค๋ฉด _MessageConverter_๋ฅผ ํตํด์ ์ง๋ ฌํ ์ดํ ์๋ต ์ํ๋ฅผ ์ค์ ํด ๋ฐํํ ๊ฒ์ด์ง๋ง, ์ปจํธ๋กค๋ฌ๊ฐ View์ด๋ฆ์ ๋ฐํํ๋ค๋ฉด _ViewResolver_๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค.
6๏ธโฃ ์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํ๋ค.
_DispatcherServlet_ ์ ํตํด์ ๋ฐํ๋๋ ์๋ต์ ํํฐ๋ฅผ ๊ฑฐ์น๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ค. ์๋ต์ด ๋ง์ฝ ๋ฐ์ดํฐ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ๋ ๊ฒ์ด๊ณ , ํ๋ฉด์ด๋ผ๋ฉด _ViewResolver_๋ฅผ ํตํด ์ ์ ํ๊ฒ ํ๋ฉด์ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
References
- https://tecoble.techcourse.co.kr/post/2021-07-15-dispatcherservlet-part-2/
- https://mangkyu.tistory.com/216
- https://mangkyu.tistory.com/18
- https://velog.io/@betterfuture4/Spring-Dispatcher-Servlet-%EC%A0%95%EB%A6%AC#0-servlet-container