๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ์น MVC๋ฅผ ์๊ฐํ๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ์๋ฃ์ ๋๋ค. ์๋ต๋ ๋ด์ฉ๋ ๋ง๊ณ , ์ค์ ๊ฐ์์์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๊ตฌํ๊ณผ ๋์์ ๋ณด์ฌ์ฃผ์๋ ๊น์ ์ดํด๋ฅผ ์ํด์๋ ๊ฐ์๋ฅผ ์๊ฐํ์๊ธฐ๋ฅผ ์ ๊ทน ์ถ์ฒํฉ๋๋ค.
์คํ๋ง MVC ๊ตฌ์ฑ ์์
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ฌ์ฉํ๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ๊ณผ์ ์์ ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์ด๊ธฐํํด์ฃผ๊ฒ ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉด,
multipartResolver
- ํ์ผ ์ ๋ก๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค ๊ตฌํ์ฒด bean์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ฑ๋ก๋์ด์๋ค. ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ด ๊ตฌํ์ฒด ๋น์ ๊ฐ๊ณ ์์ด์ผ ํ์ผ ์ ๋ก๋๋ฅผ ์์ฒญํ ์ ์๋ค. ํด๋นํ๋ ํ์ ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ถ๋ถ๋ถ ์ชผ๊ฐ์ ๋ณด๋ด๋๋ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํน๋ณํ ๋ก์ง์ด ํ์ํ๋ค. ์ด๋ฌํ ์์ฒญ์ multipartResolver๋ฅผ ์ด์ฉํด ์ฌ์ฉํ ์ ์๋ค.
๊ตฌ์ฒด์ ์ผ๋ก๋ http servlet request๋ฅผ multipart http servlet request๋ก ๋ณํํด์ฃผ์ด ์์ฒญ์ด ๋ด๊ณ ์๋ ํ์ผ์ ๊บผ๋ผ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ค.
multipartResolver์ ๊ตฌํ์ฒด
- CommonsMultipartResolver
- StandardServletMultipartResolver (-> ์คํ๋ง๋ถํธ default multipartResolver)
๊ธฐ๋ณธ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์๋ ์๋ฌด๋ฐ multipartResolver๊ฐ ๋ฑ๋ก๋์ด์์ง์์ง๋ง, ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก StandardServletMultipartResolver ๋ฉํฐํํธ ๋ฆฌ์กธ๋ฒ ํ๋๊ฐ ๋ค์ด์ค๊ฒ ๋๋ค. ๊ทธ๋์ ํ์ผ ์ ๋ก๋ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ๋ฅผ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
localeResolver
- ํด๋ผ์ด์ธํธ ๋ก์ผ์ผ(์ง์ญ) ์ ๋ณด ํ์ธ
์์ฒญ์ด ๋์คํจ์ฒ์๋ธ๋ฆฟ์ ๋ค์ด์์ ๋, ์์ฒญ์ ๋ถ์ํ๋ ๋จ๊ณ์์ ์ฌ์ฉ๋๋ค. ๋ก์ผ์ผ ๋ฆฌ์กธ๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ก์ผ์ผ ์ ๋ณด๋ฅผ ํ์ธํ๋ ์์ฒญ์ด ์ด๋ ์ง์ญ์์ ์จ๊ฑด์ง ํ์ธํ๋, ์ง์ญ ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ค. ์ง์ญ์ ๋ฐ๋ผ์ ์ง์ญ์ ํด๋นํ๋ ์ ์ ํ ์ง์ญ์ธ์ด์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ค ์ ์๋ค.
๋ก์ผ์ผ ์ ๋ณด๋ฅผ ๋ถ์ํ๋ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ฌ๋ฌ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ์์ ์ ์์ง๋ง ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ตฌํ์ฒด๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ ๊ธฐ์ค์ผ๋ก AcceptHeader ๊ตฌํ์ฒด์ด๋ค. ์์ฒญ์ ๋ค์ด์๋ accept-language๋ฅผ ์ด์ฉํด์ ์์ด๊ถ์ธ์ง, ํ๊ตญ์ด๊ถ์ธ์ง ๋ฑ๋ฑ์ ํ๋จํ๋ค. ์ด ์ธ์๋ Session๊ธฐ๋ฐ์ผ๋ก ํ๋จํ๋ SessionLocaleResolver ๋ฑ๋ ์๋ค.
ThemeResolver
- css์ script๋ฅผ ๋ฐ๊พผ๋ค (ex. ๋คํฌ๋ชจ๋)
๊ทธ ๋ค์์ ํ ๋ง๋ฆฌ์กธ๋ฒ ThemeResolver์ธ๋ฐ, ๋ฒํผ์ ๋๋ฅด๋ฉด css์ script๊ฐ ์ฅ ๋ฐ๋๋ ์ฌ์ดํธ๊ฐ ์๋ค. ๊ทธ๋ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์คํ๋ง MVC๋ Theme์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค์, Theme์ด๋ผ๋ ํค๊ฐ์ ๋ทฐ์ ์ ๋ฌํ๊ณ ๋ทฐ๊ฐ ๊ทธ ํค๊ฐ์ ํด๋นํ๋ ์ ์ ํ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฝ์ด์จ๋ค. ๊ฐ๋ น ์ ์ ํ css๋ฅผ ์ฝ์ด์์, ํ๋ฉด์ ํ ๋ง, ์ ์ฒด์ ์ธ ๋ถ์๊ธฐ๋ฅผ ํ ๋ง์ ๋ง๊ฒ ๋ฐ๊ฟ ์ ์๋ค. ThemeResolver๋ Cookie, Session, Fixed๊ฐ ์๋๋ฐ ๊ธฐ๋ณธ๊ฐ์ Fixed๋ก ์ฌ์ค์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.
HandlerMapping
- ์์ฒญ์ด ๋ค์ด์์ ๋ ๊ทธ ์์ฒญ์ ํํํ๋, ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋ ์ธํฐํ์ด์ค
HandlerMapping์ ๋ง์ด ๋ค๋ค์ผ๋ ๊ฐ๋จํ๊ฒ ๋ค๋ฃฌ๋ค. ์์ฒญ์ด ๋ค์ด์์ ๋ ๊ทธ ์์ฒญ์ ํํํ๋, ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋ ์ธํฐํ์ด์ค์ด๋ค. ์์ฒญ์ ์น ๋ธ๋ผ์ฐ์ ์์ ์น/์ฑ์ผ๋ก ํฌ๋ก ๋ผ๊ณ ๋ณด๋ด๋ฉด HandlerMapping์ด ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ค๋ค. ์ดํ ํด๋น ๋ฉ์๋(ํธ๋ค๋ฌ)์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํธ๋ค๋ฌ ์์ฒด๊ฐ ๋ฆฌํด์ด ๋๋ค. ์ด๋ฐ ๊ฑธ ํด์ฃผ๋๊ฒ HandlerMapping์ด ํด์ฃผ๋ ์ผ์ด๋ค. ํธ๋ค๋ฌ๋งคํ์ด ํด์ฃผ๋ ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ๊ฐ ๋ฑ๋ก์ด ๋๋ค.
- RequestMappingHandler๋ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋ ๊ฒ
- BeanNameUrlHandler๋ ๋น ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก, ์ด ์์ฒญ์ ํด๋นํ๋ ๋น์ด ์๋๊ฐ ์๋๊ฐ๋ฅผ ์ฐพ๋๋ค.
HandlerAdapter
- ๊ฐ๊ฐ์ ํธ๋ค๋ฌ๋ฅผ ์ค์ ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ธํฐํ์ด์ค
๊ทธ๋ค์์ ์ฐพ์๋ณผ HandlerAdapter๋ ๊ฐ๊ฐ์ ํธ๋ค๋ฌ๋ฅผ ์ค์ ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ธํฐํ์ด์ค์ด๋ค. ์คํ๋ง MVC ํ์ฅ๋ ฅ์ ํต์ฌ์ด๋ค. ํธ๋ค๋ฌ๋ฅผ ์ผ๋ง๋ ์ง ์ํ๋๋๋ก ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค. ํจ์ํ ์คํ์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ํ์ ์คํ์ผ๋ก ์ ์ํ๊ณ , ํธ๋ค๋ฌ ๋งคํ๊ณผ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋์ํ๋ค.
HandlerExceptionResolver
- ํธ๋ค๋ฌ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ์ธํฐํ์ด์ค
์ ๋
ธํ
์ด์
๊ธฐ๋ฐ์ MVC๋ฅผ ์ฌ์ฉํด๋ณด์ ๋ถ๋ค์ ExceptionHandler๋ผ๋ ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํด์ ์์ธ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ํด๋ณด์
จ์ํ
๋ฐ์. ์ด๋ ๊ฒ ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ์ ์์ด์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ต์
์
๋ฆฌ์กธ๋ฒ๊ฐ ํด๋น ์ต์ผ์
ฅ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์
์
๋ฆฌ์กธ๋ฒ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ๋ฑ๋ก์ด ๋์ด ์๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ก ์ฌ์ฉํ๋๊ฑด ExceptionHandlerExceptionResolver๋ผ๋ ๊ฒ๋๋ค. @ExceptionHandler
๋ผ๋ ์ด๋
ธํ
์ด์
์ ๋์ค์ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
RequestToViewNameTransrator
- ๋ทฐ ์ด๋ฆ์ ์ถ์ธกํ๋ ์ธํฐํ์ด์ค
RequestToViewNameTransrator๋, ๋ฆฌํด๊ฐ์ธ ๋ทฐ ์ด๋ฆ์ ์๋ตํด๋ ์์ฒญ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋จํด์ค๋๋ค. ๋ทฐ ์ด๋ฆ์ ๋ฆฌํดํ ๋ ์์คฌ๋๋ฐ, ํน์ ModelAndView์ ํ๋ผ๋ฏธํฐ๊ฐ์ผ๋ก viewName์ ๋๊ฒจ์ฃผ์ง ์๋ ๊ฒฝ์ฐ์๋, ์คํ๋ง์ ์์ฒญ์ ๊ฐ๊ณ ํ๋จ์ ํฉ๋๋ค. ๊ฐ๋ น sample๋ก ๋ค์ด์์ผ๋๊น, ๋ทฐ ์ด๋ฆ๋ sample์ด๊ฒ ์ง? ํ๋ ๊ธฐ๋ณธ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ๊ตฌํ์ฒด๊ฐ DefaultRequestToViewNameTransrator ํ๋๋ฐ์ ์์ต๋๋ค. ์์ฒญ์์ ๋ทฐ ์ด๋ฆ์ ์ถ์ธกํ ์ ์๋ ๊ทธ๋ฐ ์ธํฐํ์ด์ค์๊ตฌ์.
ViewResolver
- ๋ทฐ๋ฅผ ์ฐพ์๋ด๋ ์ธํฐํ์ด์ค
ViewResolver๋ ๋ทฐ ์ด๋ฆ์ด ๋ช ์์ ์ผ๋ก ๋ฆฌํด๋๋ , ์์ฒญ์์ ๋ทฐ ์ด๋ฆ์ ์ถ์ธกํ๋, ๋ทฐ ์ด๋ฆ์ด ๋์ค๋ฉด ํด๋นํ๋ ๋ทฐ๋ฅผ ์ฐพ์๋ด๋ ์ธํฐํ์ด์ค์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ InternalResourceViewResolver๊ฐ ๋ฑ๋ก๋์ด์๊ณ , ์ฌ๋ฌ๊ฐ์ ๋ฆฌ์กธ๋ฒ๊ฐ ๋ฑ๋ก์ด ๋ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก๋ ํ๋๋ง ๋ฑ๋ก์ด ๋์ด ์๋ค. ์คํ๋ง๋ถํธ์์๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ์ข ๋ ๋ฑ๋ก์ด ๋์ด ์๊ตฌ์. InternalResourceViewResolver๋ ๊ธฐ๋ณธ์ ์ผ๋ก JSP๋ฅผ ์ฌ์ฉํ๊ณ , ์ด์ ๋ฐ๋ผ ์ฐ๋ฆฌ๊ฐ jsp๋ฅผ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
FlashMapManager
- FlashMapManager๋ ํ๋ฉด์์ ๋ฆฌํ๋ ์ํ์ ๋, ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ณด๋ด์ค์ง ์๋๋ก ๋ฐฉ์งํ๊ธฐ ์ํ ์ผ์ข ์ ํจํด -> url path๋ url request parameter ๋ฑ์ผ๋ก ์ด๋ฏธ ์์ฒญํ ๋ด์ฉ์ ์ธ์ ์ ์ ์ฅํด๋๊ณ , ์ค๋ณต ์ ์ก์ ๋ฐฉ์งํ๋ ๋ฏ?
FlashMapManager๋ ์ต๊ทผ์ ๋ค์ด์จ ์ธํฐํ์ด์ค์ ๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ์คํ๋ง ์ด๊ธฐ, ๋๋ต 2003๋ ๋ถํฐ ์์์ต๋๋ค. ๋ฒ์ ์ด ๋ช ์๋์ด์์ง ์์ ์ธํฐํ์ด์ค๋ ์ฒ์๋ถํฐ ์๋ ์ธํฐํ์ด์ค์ ๋๋ค.
redirect๋ฅผ ํ ๋, ๋ณดํต ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ , ์์ฒญํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๊ทธ๊ฑธ ์ ์ฅ์ ํ๊ณ redirect๋ฅผ ํ๊ฒ ๋๋ค. redirect๋ฅผ ํ์ง ์์ผ๋ฉด ํ๋ฉด์์ ๋ฆฌํ๋ ์ฌ๋ฅผ ํ ๋ ์์ฒญ ๋ฐ์ดํฐ ๋ฑ์ด ๋ ๋์ด์ค๊ณ , ๊ทธ๊ฑธ ๋งค๋ฒ ์ฒ๋ฆฌํด์ฃผ๊ฒ ๋๋ค. FlashMapManager๋ ํ๋ฉด์์ ๋ฆฌํ๋ ์ํ์ ๋, ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ณด๋ด์ค์ง ์๋๋ก ๋ฐฉ์งํ๊ธฐ ์ํ ์ผ์ข ์ ํจํด์ด๋ค.
post ์์ฒญ์ ๋ฐ์ ๋ค์์๋ ๋ฆฌ๋ค์ด๋ ์ ์ ํ๊ณ , get ์์ฒญ์ผ๋ก redirect๋ฅผ ํ๋ ๊ฑฐ์์. ๊ทธ๋์ GETํด์ VIEW๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฑฐ์ฃ . ๊ทธ๋ผ ๊ทธ ์ํฉ์์๋ ๋ธ๋ผ์ฐ์ ๋ฆฌํ๋ ์๋ฅผ ํด๋, ๋ค์ ํ ๋ฒ form ์๋ธ๋ฏธ์ ์ด ์ผ์ด๋๋๊ฒ ์๋๋ผ get ์์ฒญ์ด ๋ค์ ํ๋ฒ ๊ฐ๊ฒ ๋๋๊ฑฐ์ฃ . ๊ทธ๋ฐ ์์ผ๋ก form ์๋ธ๋ฏธ์ ์ค๋ณต์ ์กฐ๊ธ์ด๋ผ๋ ๋ฐฉ์งํ๊ธฐ ์ํ ์ผ์ข ์ ์์ฒญ ์ฒ๋ฆฌ ํจํด์ด๋ค.
์คํ๋ง MVC ๋์ ์๋ฆฌ ๋ง๋ฌด๋ฆฌ
-
์ฒ์์ ์คํ๋ง ๋ถํธ๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ web.xml๋ ์๊ณ ๊ทธ๋ฅ SpringBooTApplication์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด main method๋ฅผ ๊ฐ๊ณ ์๋ ํด๋์ค๋ฅผ ์คํ์ํค๊ณ , ์ปจํธ๋กค๋ฌ์ ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉ
-
์ด๋ ๊ฒ ๋์ํ๋ ๊ธฐ๋ฐ์๋ ์๋ธ๋ฆฟ์ด!
๊ฒฐ๊ตญ์๋ ์คํ๋ง mvc, ์น mvc๋ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด๊ณ , ๋ฐ๋ผ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํ์ํ๋ค. ๊ทธ๋์ ์์ฃผ ์ ํ์ ์ธ ์๋ธ๋ฆฟ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ ๋ง๋ค์ด์ ์คํ๋ง mvc๋ฅผ ํ ๋ฒ ์ฌ์ฉํด๋ณด์์ต๋๋ค. ์ฒ์์๋ ์๋ธ๋ฆฟ์ ๋ง๋ค์ด์ ์คํ์ ํด๋ดค๊ณ , ๊ทธ ์๋น์ค๊ฐ delegation(์์)ํ๋ post, do get ๋ฑ์ ์ฌ์ฉํด๋ณด์๊ตฌ์. filter์ listner๋ ๋ณด์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ๋๊ฑด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋๋ค. ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋์์๋ฆฌ, ํนํ ์ด๊ธฐํํ ๋ ํน์ ์ธํฐํ์ด์ค๋ค์ ํด๋นํ๋ ๋น์ ๋ชจ๋ ์ฐพ์์ ์ ๋ต์ ์ฌ์ฉํ๋๋ฐ, ์ ๋ต์ด ์๋ค๋ฉด DispatcherServlet.properties์ ์ ์๋ ๊ธฐ๋ณธ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. web.xml์ ์ง๊ธ๊น์ง๋ ์๋ธ๋ฆฟ์ ๋ฑ๋ก์ ํ์ง๋ง, ์ฌ์ค web.xml์์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์.
web.xml์ ๋์ฒดํ์ฌ ์๋ฐ ์ฝ๋๋ก Dispatcher Servlet์ ๋ฑ๋กํ๋ ๋ฒ
public class WebApplication implements WebApplicationInitializer {
@Override
public void onStartUp(ServletContext servletContext) throws ServletException {
// ์ด ์์์ ์๋ธ๋ฆฟ์ ๋ง๋ค์ด ๋ฑ๋กํ๋ค.
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(WebConfig.calss);
context.refresh();
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dynamic = servletContext.addServlet("app", dispatcherServlet); //๋ฑ๋ก
app.addMapping("/app/*"); //๋งคํ
}
}
dispatcher servlet์ ๋ง๋ค ๋ ์ด ์ดํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๋ฃ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฑ๋ก์ ํด์ฃผ๊ณ , ๋งคํ์ ํ๋ค. ์์ฒ๋ผ web.xml๋ง๊ณ , ์๋ฐ ํ์ผ๋ง์ ๊ฐ๊ณ ๋ ์๋ธ๋ฆฟ์ ๋ฑ๋กํด์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ์ด ๊ธฐ๋ฅ์ ์คํ๋ง 3.1, ์๋ธ๋ฆฟ 3.0 ๋ถํฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Dispatcher Servlet์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค. ์ด๋ ํฐ์บฃ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ Dispatcher Servlet์ด ๋ค์ด๊ฐ๋ ํํ์ธ๊ฑฐ๊ณ ,
์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ์ผ ์ฒ์ ๋ง๋ค์๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ํ ๋, ์๋ฒ ๋๋ ํฐ์บฃ์ด๋ผ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ฒ ๋๋ ํํ๋ก(์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ข ์๋๋ ํํ๋ก) ๊ตฌ๋์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ฒ ๋๋ ํฐ์บฃ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ฑ๋ก์ ํด์ค๋๋ค.
์คํ๋ง๋ถํธ๋ ์ด์ฒ๋ผ ์คํ๋ง๋ถํธ๊ฐ ๊ฐ๊ณ ์๋ ์ฃผ๊ด์ด ์์ด์. ์คํ๋ง ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๋ ๊ฐ๋ฐ์๋ค์, ์ด๋ฌํ ์ค์ ์ด ํธ๋ฆฌํ ๊ฒ์ด๋ค๋ผ๋ ์ฃผ๊ด์ ๋ฐ๋ผ์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํด๋๊ณ ์์ต๋๋ค. ๊ฐ๋ น ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ ์์ ๊ฒ์ด๊ตฌ์. ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ์ ์์, ์ด๋ค ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ธ์ง ๋ฑ๋ฑ๋ ๊ฐ๋ฐ์๋ค์ด ํธ๋ฆฌํ๋๋ก ์ค์ ์ ํด๋๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์คํ๋ง MVC๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋, ๋๋ฌด ๊ธฐ์ด์ ์ธ ์์ค์ ๊ธฐ๋ณธ ์ ๋ต๋ง ๊ฐ์ง๊ณ ์ฌ์ฉ์ ํ๊ฑฐ๋, ์๋๋ฉด ์ผ์ผํ, ํนํ ์ ์ฉํ ViewResolver๋ค์ ์ผ๋ง๋ ๊ผผ๊ผผํ, ๋ง์ด ์ค์ ์ ํ๋๋์ ๋ฐ๋ผ ๋์ํ๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋๋ค. ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ์ค ๋์๋ ์คํ๋ง MVC๊ฐ ๋ง์น ์๋ฌด๊ฒ๋ ์ ํด๋ ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์๋์ค์ ํ์ผ์ ์ํ์ฌ ๋์์ ํ๋ ๊ฒ์ ๋๋ค.
์คํ๋ง MVC ๋น ์ค์
์ด์ ์ฒซ๋ฒ์งธ ํํธ๋ฅผ ํ์ตํ์ ๋ถ๋ค์ ์ดํดํ์๊ฒ ์ง๋ง, ๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์์๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ properties์ ์ ์๋์ด์๋ ๊ธฐ๋ณธ์ ๋ต์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ๋ต์ ์ฌ์ฉํ ๋์๋ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค๋ค์ด ๊ฐ๊ณ ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ์ด ๋๋ค๋ ์ ์ ๋๋ค. ์ธํฐ๋ ๋ฆฌ์์ค ๋ทฐ ๋ฆฌ์กธ๋ฒ์ ๊ฒฝ์ฐ์๋ ํ๋ฆฌํฝ์ค์ ์ํฝ์ค๋ฅผ ์ค์ ํ ์ ์์ง๋ง, ์ค์ ๋์ด์์ง ์์ ์ํ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ํ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ง์ setPrefix, setSuffix๋ก ์ค์ ์ ํด์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ . ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฟ๋ง ์๋๋ผ ๋๋ถ๋ถ์ ๋น๋ค์ด ์๋์ ์ฝ๋์ฒ๋ผ ๊ธฐ๋ณธ๊ฐ๋ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@Bean
public Handlermapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
return handlerMapping;
}
๊ทธ๋ฐ๋ฐ ์ด๋ค ๊ฒ๋ค์ ์ค์ ํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
@Bean
public HandlerMapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setInterceptors();
handlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
return handlerMapping;
}
setInterceptors : ํธ๋ค๋ฌ ๋งคํ์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ฒ๋ฆฌํ ์ ์๋ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋ ์ธํฐํ์ด์ค์์ต๋๋ค. ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ ์ฒ๋ฆฌํ๊ธฐ ์ , ๋๋ ์ดํ์ ์๋ธ๋ฆฟ ํํฐ์ ๋น์ทํ ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ์ด ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๋ฅผ ์ค์ ํด์ค ์๊ฐ ์์ต๋๋ค. ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๋ ๋น์ผ๋ก ๋ฑ๋ก๋ ์ ์๊ตฌ์, ๊ทธ๋์ ์คํ๋ง IoC ์ปจํ ์ด๋์ ์ฅ์ ์ ๋์ฑ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋์ค์ ๋ ์์ธํ ์ดํด๋ณผ ๊ฒ์ด๊ตฌ์.
ํธ๋ค๋ฌ ๋งคํ์๋ค๊ฐ ์ด๋ฐ ์์ผ๋ก ์ธํฐ์ ํฐ๋ ์ค์ ํ ์ ์๊ตฌ์. setOrder๋ผ๋ ๊ฑด ๊ฐ์ฅ ์ฐ์ ์์(order)๊ฐ ๋์ ํธ๋ค๋ฌ๋ฅผ ๋งคํํด์ค๊ณ , ์ฐพ๊ฒ๋๋ฉด ๋ฐ๋ก ๋ฆฌํดํ๋ ๊ฒ์ ๋๋ค. ์ค๋๊ฐ ์ค์ํ ์ํฉ์ด๋ผ๋ฉด ์ค๋๋ฅผ ์ค์ ํ ์๋ ์๊ตฌ์. ๊ฐ๋ น Ordered.HIGHEST_PRECEDENCE๋ฅผ ์ฃผ๋ฉด ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ํธ๋ค๋ฌ ์ธํฐ์ ํฐ์ ๋ํด์๋ ์ ์ ๋ค์ ๋ค๋ฅธ ์๋ธ๋ฆฟ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@Bean
public HandlerAdapter handlerAdapter() {
RequestMapingHandlerAdapter handlerAdapter = new RequestMapingHandlerAdapter();
handlerAdapter.set
return handlerAdapter;
}
ํธ๋ค๋ฌ ๋งคํ๋ฟ๋ง ์๋๋ผ ํธ๋ค๋ฌ ์ด๋ํฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ๋ฌ ์ค์ ์ ์ถ๊ฐํด์ค ์ ์์ต๋๋ค. ๊ฐ๋ น ArgumentResolver๋ฅผ ์ฌ์ฉํด ์ํ๋ argument๋ฅผ ์ค์ ํด์ค ์ ์์ผ๋ฉฐ, MessageConveters๋ฅผ ์ฌ์ฉํด ์์ฒญ ๋ณธ๋ฌธ์ ๋ค์ด์ค๋ ๊ฐ์ Message Body๋ก ํ๋ผ๋ฏธํฐ์ ๋ฐ์ธ๋ฉํด์ค ์ ์์ต๋๋ค. ResponseBody์ ๊ฒฝ์ฐ์๋ MessageConverters๋ฅผ ์ฌ์ฉํ๊ตฌ์.
์ด ๋ชจ๋ ๊ฒ๋ค์ ์ผ์ผํ ์ค์ ์ ํ๊ธฐ ์ํด์ ๋น ์ค์ ์ ํ๊ฒ ๋ฉ๋๋ค. ์๋ค๋ค์ด ๊ฐ๊ณ ์๋ ๊ธฐ๋ณธ๊ฐ๋ค๋ ์์ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Message Converter๋ค์ ์ถ๊ฐ๋๋ ์ปจ๋ฒํฐ๋ค์ด ์๊ธด ํฉ๋๋ค. ์ฃผ๋ก ์ฌ์ฉํ๋ stringHttpMessageConverter ์ญ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๊ฐ๋๊ณ ์์ต๋๋ค. ์์ฆ์ ๋น ์ค์ ์ ์ง์ ํ์ง ์๊ณ , ์คํ๋ง๋ถํธ๊ฐ ๋์ค๊ธฐ ์ด์ ์๋ ์คํ๋ง MVC์์ ์ ๊ณตํด์ฃผ๋ ์กฐ๊ธ ๋ ํธํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์์ต๋๋ค. ๊ทธ๋ฅ ์ด๋ฐ ์์ผ๋ก ์ผ์ผํ ๋น์ ์ค์ ํด์ค ์ ์๊ตฌ๋, ์ ๋๋ฉด ์์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@EnableWebMvc
- ์ผ์ผํ ๋น์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ ๋์
- MVC์ ๊ฐ์ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ ๋, ์๋ฐ ๊ธฐ๋ฐ์ ์ค์ ๋ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ๋ ํธ๋ฆฌํ๋๋ก ์คํ๋ง์์ ์ง์ํ๋ ์ ๋ ธํ ์ด์
- ์ฌ์ฉ๋ฒ
- @Configuration์ด ์๋ ํ์ผ์ @EnableWebMvc์ ์ฃผ๊ณ
- WebApplicationContext์ context.setServletContext(servletContext)
์ผ์ผํ ๋น์ผ๋ก ๋ฑ๋ก์ ํ๊ธฐ๋ณด๋จ, ์กฐ๊ธ ๋ ์๋ฐ ๊ธฐ๋ฐ์ ์ค์ ์์, ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ, ์ฆ MVC๋ฅผ ์ฌ์ฉํ ๋์ ๋ ํธ๋ฆฌํ๋๋ก ์คํ๋ง์ด EnableWebMvc๋ผ๋ ์ ๋ ธํ ์ด์ ์ ์ง์ํฉ๋๋ค. ์ด ์ ๋ ธํ ์ด์ ์ Configuration์ ๊ฐ์ด ์ฃผ๋ฉด ๋๊ตฌ์. ComponentScan์ ์์ด๋ ๋๊ณ , ์์ด๋ ๋ฉ๋๋ค
WebApplicationContext์ context.setServletContext(servletContext)๋ฅผ ํ๋ ์ด์ : @EnableWebMvc๋ฅผ ์ฌ์ฉํ ๋ ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ฅผ ์ข ์ข ์ฐธ์กฐํจ. ์๋ธ๋ฆฟ ์ปจํ ์คํธ๊ฐ ํญ์ ์ค์ ์ด ๋์ด์์ด์ผ ํฉ๋๋ค.
์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง?
- EnableWebMvc๋ฅผ ํด์ฃผ๋ฉด
- DelegatingWebMvcConfiguration์ import
- DelegatingWebMvcConfiguration๊ฐ ์์๋ฐ๊ณ ์๋ ์ธํฐํ์ด์ค์ ๊ฐ๋ณด๋ฉด ํธ๋ค๋ฌ ๋งคํ, ๊ธฐ๋ณธ์ ์ธ Interceptor๋ค ๋ฑ์ด ์ถ๊ฐ๋์ด์๋ค.
์ง์ Bean ๋ฑ๋กํ๋ ๊ฒ๊ณผ ๋ฌด์จ ์ฐจ์ด๊ฐ?
์ง๊ธ๊น์ง๋ Bean์ ์ง์ ๋ฑ๋กํด์ webMVC์ ๋ฑ๋กํ๊ณ , ์ง์ ๋ฑ๋กํ์ง์์ ๊ฒ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ properties์ ์๋ ๊ฒ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. EnableWebMvc๋ฅผ ์ฐ๋ฉด ์ด๋ป๊ฒ ์ค์ ์ด ๋ฌ๋ผ์ง๊น์? EnableWebMvc ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ณ , ์ด ์ํ๋ก ํฐ์บฃ์ ๊ตฌ๋ํ๋ฉด ์ด๋ป๊ฒ ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํธ๋ค๋ฌ๋งคํ๋ถํฐ ๋ณด๋ฉด, RequestMappingHandlerMapping์ order(์ฐ์ ์์)๊ฐ 0์ผ๋ก ๋์ด์์ต๋๋ค. ์ฆ RequestMappingHandlerMapping์ผ๋ก ๋จผ์ ํ์ธํ๊ณ , BeanNameUrlHandlerMapping์ผ๋ก ๊ทธ ๋ค์์ ํ์ธ์ ํ๊ฒ ๋ฉ๋๋ค. ์ฐ์ ์์๋ ์์๋ถํฐ ์์๊ฐ์ด ์๋๋ฐ, 0์ด๋ฉด ๋ฑ ๊ฐ์ด๋ฐ๋ก ๋์ด์๋ ๊ฒ์ ๋๋ค. handlerAdapter์์๋ RequestMappingHandlerAdapter๊ฐ ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์น MVC๋ฅผ ๋จผ์ ์ฌ์ฉํ๋ค๋ฉด, ์ ์ด์ RequestMappingHandlerAdapter ์์ฃผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ์ฐ์ ์์๊ฐ ๋์ ๊ฒ๋ง ํ์ธํ๊ณ ๋ฎ์ BeanNameUrlHandlerMapping๊น์ง๋ ํ์ธํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ๋์ฑ ์ต์ ํ๊ฐ ๋ ๊ฒ์ ๋๋ค. handlerMappings, handlerAdapters ๋ชจ๋ RequestMappingHandlerMapping๊ณผ RequestMappingHandlerAdapter๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ฏ๋ก ๋ฐ๋ก ์ค์ ์ ์ฃผ์ด ์ต์ ํ๋ฅผ ์ํค๋ ์ํฉ์ ๋๋ค.
๋์ ์ผ๋ก ๋ฉ์ธ์ง ์ปจ๋ฒํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. EnableWebMvc๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์๊ฒ, Delegation ๊ตฌ์กฐ(์ด๋๊ฐ์ ์์ํ๋ ์์ ๊ตฌ์กฐ)๋ก ๋น์ ๋ถ๋ฌ์ต๋๋ค. ์ด์ ๊ธฐ์กด์ ๋น์, HandlerMapping, Adapter์์ ์ถ๊ฐํ๋ ์ค์ ๋ค์ด ์์ฝ๊ฒ ๊ฐ๋ฅํด์ง๋๋ค. ์ฒ์๋ถํฐ ํธ๋ค๋ฌ ๋งคํ, ์ด๋ํฐ๋ฅผ ๋ฑ๋กํด์ผํ๋๊ฒ ์๋๋ผ, ์ด ํด๋์ค๊ฐ ๋ฑ๋กํด์ฃผ๋ ๋งคํ, ์ด๋ํฐ์ ์กฐ๊ธ๋ง ๋ ์์ ์ ํ๋ ์์ผ๋ก ๋น ์ค์ ์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.