๐ป ๋์คํจ์ฒ ์๋ธ๋ฆฟ Dispatcher-Servlet์ ๊ฐ๋ ๊ณผ ๋์ ๊ณผ์ ์์๋ณด๊ธฐ
๊ฐ์ #
์คํ๋ง AOP, Filter, Interceptor๊ณผ ๊ฐ์ ๊ฐ๋ ์ ๊ณต๋ถํ๋ฉด์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ํ ์๊ธฐ๊ฐ ๋์ค๋๋ฐ
์์ง ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ํ ๊ฐ๋ ์ด ๋ถ์กฑํ ๊ฒ ๊ฐ์ ํ๋ฒ ๊ฐ๋ ๊ณผ ๋์๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
Servlet (Java Servlet) #
์๋ฐ ์๋ธ๋ฆฟ์ด๋ ์๋ฐ๋ฅผ ์ฌ์ฉํด ์น์ ๋ฑ์กฑ์ผ๋ก ์์ฑํ๋ ์๋ฒ์ธก ํ๋ก๊ทธ๋จ ํน์ ๊ทธ ์ฌ์์ ๋งํ๋ค.
ํํ ์๋ธ๋ฆฟ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ์๋ฐ ์๋ธ๋ฆฟ์ ์น ์๋ฒ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ์ํด ์ฌ์ฉ๋๋ ์๋ฐ์ ํด๋์ค ์ผ์ข ์ด๋ค.
์ฆ, ์๋ธ๋ฆฟ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ด๋ค.
Dispatcher-Servlet #
dispatch๋ "๋ณด๋ด๋ค" ๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๊ณ ์ด๋ฌํ ๋จ์ด๋ฅผ ํฌํจํด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ HTTP๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์
๊ฐ์ฅ ๋จผ์ ๋ฐ์์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์ํด์ฃผ๋ย ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก ์ ์๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋? (Front Controller)
์ฃผ๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ ์ผ ์์์ ์๋ฒ๋ก ๋ค์ด์ค๋ ํด๋ผ์ด์ธํธ๋ค์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ค.
MVC ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด์ด๋ค. (๊ณผ๊ฑฐ์๋ ์ด๊ฒ ์์ด์ web.xml์ ๋ชจ๋ url์ ๋ฑ๋กํ๋ ๋ถํธํจ์ด..)
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ค๋ ์์ฒญ์ ํฐ์บฃ๊ณผ ๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ค, ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ์์ฒญ์
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ธ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฐ์ฅ ๋จผ์ ๋ฐ๋๋ค. ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๊ณตํต์ ์ธ ์์ ์ ๋จผ์ ์ฒ๋ฆฌ ํ
์์ฒญ์ ํด๋นํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์์ ์ ์์ํด์ค๋ค.
์ฅ์
-> ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋ง ํ๋ค.
-> ๊ณตํต ์์ ์ ์ฒ๋ฆฌํด์ค๋ค. (์ฐ๋ฆฌ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํด๋๊ธฐ๋ง ํ๋ฉด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์์์ ์์ํด์ฃผ์ด ํธ๋ฆฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.)
but
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ ์ ์์์ ์ฒ๋ฆฌํ๋ฉด์ ๋ฌธ์ ๊ฐํ๋ ๋ฐ์ํ๋ค. ๊ทธ ์ด์ ๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด
๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค ๋ณด๋ image, HTML, CSS, JavaScript์ ๊ฐ์ ์ ์ ์์์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ ์ํฉ๋ ๋ฐ์ํ๋ค/
์ด๋ฌํ ๋ฐฉ๋ฒ์ ํด๊ฒฐํ๊ธฐ์ํด ๊ฐ๋ฐ์๋ค์ ๋๊ฐ์ง์ ๋ฐฉ๋ฒ์ ๊ณ ์ํ๋ค.
์ ์ ์์ ์์ฒญ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ ๋ถ๋ฆฌ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์ฒญ ํ์ ํ ์์ผ๋ฉด ์ ์ ์์์ ๋ํ ์์ฒญ์ผ๋ก ์ฒ๋ฆฌ
1. ์ ์ ์์ ์์ฒญ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ ๋ถ๋ฆฌ
-> /app ์ URL๋ก ์ ๊ทผํ๋ฉด Dispatcher Servlet์ด ๋ด๋น
-> /resource ์ URL๋ก ์ ๊ทผํ๋ฉด Dispatcher Servlet์ด ์ปจํธ๋กคํ ์ ์์ผ๋ฏ๋ก ๋ด๋นํ์ง ์๋๋ค.
๊ด์ฐฎ์ ๋ณด์ด๋ ๋ฐฉ๋ฒ์ด์ง๋ง ์ด๋ ๊ฒ ์ค๊ณํ๋ฉด ์ฝ๋๊ฐ ์๋นํ ์ง์ ๋ถํด์ง๊ณ ๋ชจ๋ ์์ฒญ์ ๋ํด์ ์ ๋ฐ
URL(app, resource)์ ๋ถ์ฌ์ค์ผ ํ๋ฏ๋ก ์ง๊ด์ ์ธ ์ค๊ณ๊ฐ ๋ ์ ์๋ค.
2. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์ฒญ์ ํ์ ํ ์์ผ๋ฉด ์ ์ ์์์ ๋ํ ์์ฒญ์ผ๋ก ์ฒ๋ฆฌ
์ ์ ์์์ ์์ฒญ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ๊ณ๋ฅผ ๋๋ผ๊ณ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ณ ์ํด๋ด์๋ค.
์์ฒญ์ ๋ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์, 2์ฐจ์ ์ผ๋ก ์ค์ ๋ ์์ ๊ฒฝ๋ก๋ฅผ ํ์ํด ์์์ ํ์ํ๋ค.
์ด๋ ๊ฒ ์์ญ์ ๋ถ๋ฆฌํ๋ฉด ๋ฆฌ์์ค ๊ด๋ฆฌ์ ํจ์จ์ ์ผ ๋ฟ๋ง ์๋๋ผ ์ถํ์ ํ์ฅ์ ์ฉ์ดํ๊ฒ ํด์ฃผ๋ ์ฅ์ ์ด ์๋ค.
#
๋์๊ณผ์ #

์์ ๊ทธ๋ฆผ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด๋ค. ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ ๋งํ๋๋กย ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๋ฅผ ์ฐพ์ ์์ฒญ์ ์์ํ๋ค.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ฐ๋๋ค.
์์ฒญ ์ ๋ณด๋ฅผ ํตํด ์์ฒญ์ ์์ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ์์ํ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์์ ์ ๋ฌํ๋ค.
ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์์ํ๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ ๋ฐํํ๋ค.
HanlderAdapter๊ฐ ๋ฐํ๊ฐ์ ์ฒ๋ฆฌํ๋ค.
์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํ๋ค.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ฐ๋๋ค.

์์ ๊ทธ๋ฆผ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋์ํํ ๊ฒ์ผ๋ก ์์ ์ค๋ช ํ๋ฏ ์๋ธ๋ฆฟ์ ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ค.
์๋ธ๋ฆฟ ์ปจํ ์คํธ(Web Context)์์ ํํฐ๋ค์ ์ง๋ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ๋๋ค.
์ค์ ๋ก Interceptor๊ฐ Controller๋ก ์์ฒญ์ ์์ํ์ง๋ ์๋๋ค. ๊ทธ์ ์์ ๋งํ๋ฏ ์ฒ๋ฆฌ์์๋ฅผ ๋์ํ ํ ๊ฒ ๋ฟ์ด๋ค.
์์ฒญ ์ ๋ณด๋ฅผ ํตํด ์์ฒญ์ ์์ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๊ณ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค.
HandlerMapping ๊ตฌํ์ฒด์ค ํ๋์ธ RequestMapping HandlerMapping์ @Controller๋ก ์์ฑ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ ๋น์ ํ์ฑํ์ฌ HashMap(์์ฒญ ์ ๋ณด, ์ฒ๋ฆฌ ๋์)์ผ๋ก ๊ด๋ฆฌํ๋ค. ์๋ฐํ ๋งํ์๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ์๋, ์์ฒญ์ ๋งคํ๋๋ ์ปจํธ๋กค๋ฌ์ ํด๋น ๋ฉ์๋๋ฅผ ๊ฐ๋ HandlerMethod ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋์ ํธ๋ค๋ฌ ๋งคํ์ ์์ฒญ์ด ์ค๋ฉด HTTP Method, URI๋ฑ์ ํตํด Key ๊ฐ์ฒด์ธ ์์ฒญ ์ ๋ณด๋ฅผ ๋ง๋ค๊ณ , Value์ธ ์์ฒญ์ ์ฒ๋ฆฌํ HandlerMethod๋ฅผ ์ฐพ์ HandlerMethodExecutionChain์ผ๋ก ๊ฐ์ธ ๋ฐํํ๋ค. HandlerMethodExecutionChain์ผ๋ก ๊ฐ์ธ๋ ์ด์ ๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ๋๊ฒจ์ฃผ๊ธฐ ์ ์ฒ๋ฆฌํด์ผํ๋ย ์ธํฐ์ ํฐ๋ฑ์ ํฌํจํ๊ธฐ ์ํด์๋ค.
์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ์์ํ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์ ์ ๋ฌํจ
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ก ์ง์ ์์ฒญ์ ์์ํ๋๊ฒ ์๋ HandlerAdapter๋ผ๋ ์น๊ตฌ๋ฅผ ํตํด์ ์์ฒญ์ ์์ํ๋ค.
์ด๋ ์ด๋ํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๋ ์ด์ ๋ ์ปจํธ๋กค๋ฌ ๊ตฌํ๋ฐฉ์์ด ๋ค์ํด์๋ค.
์ต๊ทผ์๋ @Controller, @RequestMapping ๊ด๋ จ ์ด๋ ธํ ์ด์ ๋ง ์ฌ์ฉํด ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๊ธด ํ์ง๋ง
์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํด๋์ค๋ฅผ ์์ฑํ ์๋ ์์ด์๋ค. ์คํ๋ง์ HanlderAdapter๋ผ๋ ์ด๋ํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด
์ด๋ํฐ ํจํด์ ์ ์ฉํจ์ผ๋ก์จ ์ปจํธ๋กค๋ฌ์ ๊ตฌํ ๋ฐฉ์์ ์๊ด ์์ด ์์ฒญ์ ์์ํ ์ ์๋ ๊ฒ์ด๋ค.
ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์์ํจ
ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ปจํธ๋กค๋ด๋ก ์์ฒญ์ ์์ํ๊ธฐ์ ๊ณตํต์ ์ธ ์ /ํ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค.
๋ํ์ ์ผ๋ก ์ธํฐ์ ํฐ๋ค์ ํฌํจํด @RequestParm,@RequestBody ๋ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ArgumentResolver๋ค๊ณผ
์๋ต ์์ ResponseEntity์ Body๋ฅผ Json์ผ๋ก ์ง๋ ฌํํ๋ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ํ๋
ReturnValueHandler๋ฑ์ด ์ด๋ํฐ์์ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ์์ฒญ์ ์์ํฉ๋๋ค. ์ค์ ๋ก ์์ฒญ์ด ์์๋๋ ๊ณผ์ ์ ๋ฆฌํ๋ ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค.
์์ฒญ์ ์ฒ๋ฆฌํ ๋์ ์ ๋ณด์ธ HandlerMethod ๊ฐ์ฒด์๋ ์ปจํธ๋กค๋ฌ ์ ๋ณด์ ๋ฉ์๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฏ๋ก ๋ฆฌํ๋ ์ ๋ฉ์๋ ๊ฐ์ฒด๋ฅผ invoke ํฉ๋๋ค.
๋ฆฌํ๋ ์ (Reflection)์ด๋?
๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์ ์ ์์ง ๋ชปํด๋ ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์ , ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์๋ฐ API
์ฌ์ค ์ค์ ๋ก๋ HandlerMethod์ ์ปจํธ๋กค๋ฌ ๋น ์ด๋ฆ๊ณผ ๋ฉ์๋, ๋น ํฉํ ๋ฆฌ๊ฐ ์์ด ๋น ํฉํ ๋ฆฌ์์ ์ปจํธ๋กค๋ฌ ๋น์ ์ฐพ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ์ปจํธ๋กค๋ฌ ๋น ๊ฐ์ฒด๋ก๋ถํฐ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํฉ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํจ
์ปจํธ๋กค๋ฌ๊ฐ ์๋น์ค๋ฅผ ํธ์ถํด ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํฉ๋๋ค.
์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํ๊ฐ์ ๋ฐํํจ
๋น์ฆ๋์ค ๋ก์ง์ด ์ฒ๋ฆฌ๋ ํ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํ๊ฐ์ ๋ฐํํฉ๋๋ค. (ResponseEntity, View Name)
HandlerAdapter๊ฐ ๋ฐํ๊ฐ์ ์ฒ๋ฆฌํจ
ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์ปจํธ๋กค๋ฌ๋ก ๋ถํฐ ๋ฐ์ ์๋ต์ ์๋ต ์ฒ๋ฆฌ๊ธฐ์ธ ReturnValueHandler๊ฐ ํ์ฒ๋ฆฌํ ํ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ๋๋ ค์ค๋๋ค.
๋ง์ฝ ์ปจํธ๋กค๋ฌ๊ฐ ResponseEntity๋ฅผ ๋ฐํํ๋ ค๋ฉด HttpEntityMethodProcessor๊ฐ MessageConverter๋ฅผ ์ฌ์ฉํด ์๋ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ ํ ์๋ต ์ํ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ง์ฝ ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ ์ด๋ฆ์ ๋ฐํํ๋ฉด ๋ทฐ๋ฆฌ์กธ๋ฒ๋ฅผ ํตํด ๋ทฐ๋ฅผ ๋ฐํํฉ๋๋ค.
์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํ
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํตํด ๋ฐํ๋๋ ์๋ต์ ๋ค์ ํํฐ๋ค์ ๊ฑฐ์ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ฉ๋๋ค.
์ฐธ๊ณ ๊ธ