-
[Spring / SpringBoot] Dispatcher Servlet(๋์คํจ์ฒ ์๋ธ๋ฆฟ) ๋์ ๊ณผ์ / SpringBoot(์คํ๋ง๋ถํธ) ์์ฒญ, ์๋ต ํ๋ฆ๐ปProgramming/SpringBoot 2023. 9. 18. 12:34
Dispatcher Servlet์ด๋?
DispatcherServlet์ HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋จผ์ ๋ฐ์์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์(Delegate Request)ํ๋ ์ญํ ์ ํ๋ Front Controller๋ผ๊ณ ์ ์ํ ์ ์๋ค. Front Controller๋ ์ฃผ๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ ์ผ ์์์ ์๋ฒ๋ก ๋ค์ด์ค๋ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ก์, MVC ๊ตฌ์กฐ์์ ํจ๊ป ์ฌ์ฉ๋๋ ๋์์ธ ํจํด์ด๋ค.
*์คํ๋ง๋ถํธ์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ์๋ ๊ตฌ์ฑ์ด๋ค. ๋ฐ๋ผ์ ์คํ๋ง๋ถํธ ๊ตฌ๋์ DispatcherServlet์ ์๋ธ๋ฆฟ์ผ๋ก ์๋ ๋ฑ๋กํ๊ณ , ๋ชจ๋ ๊ฒฝ๋ก"/"์ ๋ํด ๋งคํํ๋ค.
์ ์ ์์(Static Resources)์ ์ฒ๋ฆฌ
Dispatcher Servlet์ด ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค๋ณด๋ ์ด๋ฏธ์ง, css, javascript๋ฑ๊ณผ ๊ฐ์ ์ ์ ์์์ ๋ํ ์์ฒญ๋ง์ ๋ชจ๋ ๊ฐ๋ก์ฑ๋ฉฐ ์ ์ ์์์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํจ.
ํด๊ฒฐ๋ฐฉ๋ฒ1. ์ ์ ์์ ์์ฒญ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ์ ๋ถ๋ฆฌ
- /apps์ ์๋ํฌ์ธํธ๋ก ์ ๊ทผํ๋ฉด Dispatcher Servlet์ด ๋ด๋น
- /resources์ URL๋ก ์ ๊ทผํ๋ฉด Dispatcher Servlet์ด ์ปจํธ๋กคํ ์ ์์ผ๋ฏ๋ก ๋ด๋น x
-> ๋ชจ๋ ์๋ํฌ์ธํธ์ apps์ resources๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ฏ๋ก ์ง๊ด์ ์ธ ์ค๊ณ ๋ถ๊ฐ๋ฅ
ํด๊ฒฐ๋ฐฉ๋ฒ2. ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ์ ํ์ํ๊ณ ์์ผ๋ฉด ์ ์ ์์ ์์ฒญ์ผ๋ก ์ฒ๋ฆฌ
Dispatcher Servlet์ด ์์ฒญ์ ๋ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๊ณ ์์ผ๋ฉด 2์ฐจ์ ์ผ๋ก ์์(resources)๊ฒฝ๋ก๋ฅผ ํ์ํ์ฌ ์์ ํ์.
-> ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ง์ / ์ถํ์ ํ์ฅ ์ฉ์ด
Dispatcher Servlet์ ์ฅ์
๊ณผ๊ฑฐ์ Dispatcher Servlet์ด ๋ฑ์ฅํ๊ธฐ ์ ์๋ ๋ชจ๋ ์๋ธ๋ฆฟ์ ๋ํด URL์ ๋งคํํ๊ธฐ ์ํด ๊ด๋ จ ์ค์ ์ ํด์ฃผ์ด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์กด์ฌํ๋ค. ๊ธฐ์กด์๋ ๋ชจ๋ ์๋ธ๋ฆฟ์ ๋ํด์ URL ๋งคํ์ ํ๊ธฐ ์ํด web.xmlํ์ผ์ ๋ชจ๋ ๋ฑ๋กํด์ผ ํ์ง๋ง, Dispatcher Servlet์ด ํด๋น ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋งํ๊ณ ๊ณตํต ์์ ์ ์ฒ๋ฆฌํ๋ฉด์ ๋งค์ฐ ํธ๋ฆฌํด์ก๋ค. ํ๋ง๋๋ก Dispatcher Sevlet์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ค๋ ๋ชจ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ์ ๊ณตํต์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ web.xml์ ๋ํ ์์กด์ ๊ทน์ ์ผ๋ก ๋ฎ์ถ ์ ์๊ฒ ํด์ฃผ๋ฉด์, ํ๋์ ์๋ธ๋ฆฟ์ผ๋ก ๋ชจ๋ ๊ฒ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ณตํต๋๋ ์ฝ๋์ ์๋ ์ค์ผ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๊ธฐ๋ง ํ๋ค๋ฉด Dispatcher Servlet์ด ์์์ ์ผ์นํ๋ Controller๋ก ์์์ ํด์ฃผ๋ ๊ตฌ์กฐ๊ฐ ๋์๋ค.
+ Servlet์ด๋?
: ์๋ฐ ์น ์ฑ์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ค๋ฃจ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฐ ํด๋์ค
Dispatcher Servlet์ ๋์ ๊ณผ์
1. ํด๋ผ์ด์ธํธ๊ฐ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ ๋ณด๋
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก์ Web Context์์ ํํฐ๋ค์ ์ง๋ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ๊ฒ๋๋ค. ํด๋ผ์ด์ธํธ๋ URL(ex. /follow/{fromUser}/{toUser})๋ก ์ ๊ทผํ์ฌ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค.
2. ํด๋น ์์ฒญ์ ์๋ํฌ์ธํธ๋ฅผ ๋งคํํ ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ง ์ฐพ๋๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ฅผ ์ฐพ๊ณ ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋์ง๋ฅผ ์๋ณํ๋๋ก ํด์ฃผ๋ ๊ฒ์ด HandlerMapping์ด๋ค. ์๋ฅผ๋ค์ด์ ํด๋ผ์ด์ธํธ๊ฐ "follow/{userId}/post"์๋ํฌ์ธํธ๋ก ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ธ๋ค๋ฉด HandlerMapping์ด @Controller์ค Follow๋ฅผ ๊ตฌํํ @Controller๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค.
3. ์์ฒญ์ Controller๋ก ์์ํ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์์ ์ ๋ฌ.
์์ฒญ์ ์ฒ๋ฆฌํ @Controller๋ฅผ ์ฐพ์์ผ๋ฉด ์์ฒญ์ ์์ํด์ผ ํ๋๋ฐ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก ๋ฐ๋ก ์์ฒญ์ ์์ํ์ง ์๊ณ , HandlerAdapter๋ฅผ ํตํด ์์ํ๋ค. ์๋ํ๋ฉด ์ปจํธ๋กค๋ฌ์ ๊ตฌํ ๋ฐฉ์์ด ๋ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋ค์ํ๊ฒ ์์ฑ๋๋ ์ปจํธ๋กค๋ฌ์ ๋์ํ๊ธฐ ์ํด ์คํ๋ง์ HandlerAdapter๋ผ๋ ์ด๋ํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ํฐ ํจํด์ ์ ์ฉํจ์ผ๋ก์จ ์ปจํธ๋กค๋ฌ์ ๊ตฌํ ๋ฐฉ์์ ์๊ด์์ด ์์ฒญ์ ์์ํ๋๋ก ํ์๋ค.
4. HandlerAdapter๊ฐ Controller๋ก ์์ฒญ์ ์์.
ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์์ฒญ์ ์์ํ ์ /ํ์ ๊ณตํต์ ์ธ ์ /ํ์ฒ๋ฆฌ ๊น์ง ํด์ค๋ค. @RequestParam, @RequestBody๋ฑ์ ์ ์ฒ๋ฆฌ์ ์์ฒญ์ ๋ํ ์๋ต์ธ ResponseEntity์ Body๋ฅผ Json์ผ๋ก ์ง๋ ฌํํ๋ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
5. ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ก์ง์ ์ฒ๋ฆฌํด์ค๋ค.
6. Controller๊ฐ ๋ฐํ๊ฐ์ ๋ฐํ
์ผ๋ฐ์ ์ผ๋ก ResponseEntity๋ฅผ ๊ฐ์ฅ ๋ง์ด ๋ฐํ.
return ResponseEntity.ok().body(responseDTO);
์๋ฅผ๋ค์ด ์ด๋ฐ์์ผ๋ก ๋ฐํํ๋ค.
7. ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ๋ฐํ๊ฐ์ ์ฒ๋ฆฌํด์ค๋ค.
์๊น 4๋ฒ์์ HandlerAdapter๋ ์์ฒญ์ ์์ํ ์ ์ฒ๋ฆฌ ๋ฟ๋ง ์๋๋ผ ํ์ฒ๋ฆฌ๊น์ง ํด์ค๋ค๊ณ ํ์๋ค. ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ์๋ต ์ฒ๋ฆฌ๊ธฐ์ธ ReturnValueHandler๊ฐ ํ์ฒ๋ฆฌํ ํ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ๋๋ ค์ค๋ค. ๋ง์ฝ ์ปจํธ๋กค๋ฌ๊ฐ ResponseEntity๋ฅผ ๋ฐํํ๋ฉด HttpEntityMethodProcessor๊ฐ MessageConverter๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ๊ณ ์๋ต ์ํ๋ฅผ ์ค์ . ๋ง์ฝ View์ด๋ฆ์ ๋ฐํํ๋ฉด ViewResolver๋ฅผ ํตํด View๋ฅผ ๋ฐํ.
8. ์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํ
์๋ต์ด ๋ฐ์ดํฐ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ๋๊ณ , ํ๋ฉด์ด๋ผ๋ฉด View์ ์ด๋ฆ์ ๋ง๋ View๋ฅผ ์ฐพ์์ ๋ฐํํด์ฃผ๋ ViewResolver๊ฐ ์ ์ ํ ํ๋ฉด์ ๋ด๋ ค์ค๋ค.
References
๊ฐ์ฅ ๋ง์ด ์ฐธ๊ณ ํ ๊ธ:
https://mangkyu.tistory.com/18
'๐ปProgramming > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ