์๋ ํ์ธ์, ์ด๋ฒ ํฌ์คํ ์์๋ ๊ธฐ์กด Servlet ๊ธฐ๋ฐ์ MVC ํ๋ ์์ํฌ๋ฅผ ์คํ๋ง์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์ง์ ๋ง๋ค์ด๋ณด๋ฉด์ ์ ์ง์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ณผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋น ํฌ์คํ ์ ์๋ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์ต๋๋ค!
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
์คํ๋ง์์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ ํจํด์ ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์ํ๋ ์ญํ ์ ํ๋๋ฐ์, ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ๋ํด ์์ธํ ๊ฑด ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
Servlet, JSP ๊ธฐ๋ฐ MVC ๊ธฐ์กด ์ฝ๋
๊ธฐ์กด ์ฝ๋๋ ์ ์ฝ๋์ฒ๋ผ HttpServlet ํด๋์ค๋ฅผ ์์๋ฐ์์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
- View๋ฅผ ํธ์ถํ๊ธฐ ์ํ dispatcher, forward ์ฝ๋์ ์ค๋ณต
- HttpServletRequest, HttpServletResponse ๋ฑ์ ๋ฏธ์ฌ์ฉ ์ฝ๋
- ๊ฐ ์ปจํธ๋กค๋ฌ์์ ํ์ํ ๊ณตํต ์ฒ๋ฆฌ์ ์ด๋ ค์
์์ ๊ฐ์ ๋จ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ์๋ฌธ์ฅ ์ญํ ์ ํ๋ ๊ธฐ๋ฅ์ธ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller) ํจํด์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ๋์
์ฒ์์ ์ดํด๋ดค๋ฏ์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋จผ์ ๋ฐ์์ ์ฒ๋ฆฌํฉ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V1 ๊ตฌ์กฐ
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ V1 ๋ฒ์ ์์๋ ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ๋ FrontController ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ํด๋น ํด๋์ค์์ URI๋ฅผ ํตํด Controller์ ๋งคํ ์ ๋ณด๋ฅผ ์กฐํํ ํ Controller๋ฅผ ํธ์ถํ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ํ๋ก์ธ์ค์ ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V1 ์ฝ๋
์ ์ฝ๋๋ ๊ธฐ์กด Servlet, jsp๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ ์ ์งํ ์ฑ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ง ๋์ ํ ๊ตฌ์กฐ์ ๋๋ค.
์ปจํธ๋กค๋ฌ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์์ ๋งคํ ์ ๋ณด๋ฅผ ์กฐํํ ๋ ๋คํ์ฑ์ ์ ์ฉํ๋๋ก ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๊ณ , ๊ฐ ์ปจํธ๋กค๋ฌ๋ง๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ์ ์ธํ์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์ ํจ์ผ๋ก์จ ๋ชจ๋ ์์ฒญ์ FrontControllerServletV1 ํด๋์ค๊ฐ ๋จผ์ ๋ฐ๊ณ , ๊ณตํต ๋ก์ง์ ์ฒ๋ฆฌํ ํ ํธ์ถ๋ ์ปจํธ๋กค๋ฌ์ ๋งคํ ์ ๋ณด๋ฅผ URL๋ก๋ถํฐ ์ฐพ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
ํ์ง๋ง, V1 ๊ตฌ์กฐ์์๋ View์ ๊ด๋ จ๋ ์ฝ๋์์ ์ค๋ณต ์ฝ๋๊ฐ ๋ง์ด ์กด์ฌํ๋๋ฐ์, V2 ๊ตฌ์กฐ์์๋ ์ด๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V2 ๊ตฌ์กฐ
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ V1 ๋ฒ์ ์ ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ๋ FrontController ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ํด๋น ํด๋์ค์์ URI๋ฅผ ํตํด Controller์ ๋งคํ ์ ๋ณด๋ฅผ ์กฐํํ ํ Controller๋ฅผ ํธ์ถํ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ํ๋ก์ธ์ค์ ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ V2 ๋ฒ์ ์์๋ V1๊ณผ๋ ๋ฌ๋ฆฌ ๋ณ๋๋ก View๋ฅผ ์ฒ๋ฆฌํ๋ MyView ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฃผ์์ต๋๋ค.
(์๋ ๋นจ๊ฐ์ ๋ค๋ชจ ๋ฐ์ค ๋ถ๋ถ์ด V1 ๊ตฌ์กฐ์์ ์ถ๊ฐ๋ ๋ถ๋ถ์ ๋๋ค.)
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V2 ์ฝ๋
๊ธฐ์กด V1์ ์ปจํธ๋กค๋ฌ์ ์กด์ฌํ๋ View ๊ด๋ จ ๋ก์ง์ MyView ๊ฐ์ฒด์ ์ถ๊ฐํฉ๋๋ค.
V2 Controller๋ ๋ก์ง์ ์ฒ๋ฆฌํ ํ MyView ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ , Servlet์์ ์ด๋ฅผ ๋ฐ์ render() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด MyView ๊ฐ์ฒด๊ฐ JSP๋ฅผ forwardํ์ฌ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
V2 ๊ตฌ์กฐ๋ฅผ ํตํด V1์์ View์ ๊ด๋ จ๋ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์์์ต๋๋ค.
ํ์ง๋ง V2 ๊ตฌ์กฐ ๋ํ Controller์์ ์ฌ์ฉํ์ง ์๋ request, response ๋ฑ์ด ์กด์ฌํ๋ค๋ ๋ฌธ์ ์ ์ด ์กด์ฌํฉ๋๋ค.
๋ฐ๋ผ์ V3 ๊ตฌ์กฐ์์๋ ์ ์๋ธ๋ฆฟ ์์กด ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ , Model์ ์ถ๊ฐํ์ฌ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V3 ๊ตฌ์กฐ
V2 ๋ฒ์ ์์๋ View๋ฅผ ์ฒ๋ฆฌํ๋ MyView ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋๋ฐ์, V3 ๋ฒ์ ์์๋ ์กฐ๊ธ ๋ ๋์๊ฐ์ ์ปจํธ๋กค๋ฌ์ ์๋ธ๋ฆฟ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ณ , View ์ด๋ฆ์ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํด ๋ณด๊ฒ ์ต๋๋ค.
(์๋ ๋นจ๊ฐ์ ๋ค๋ชจ ๋ฐ์ค ๋ถ๋ถ์ด V1 ๊ตฌ์กฐ์์ ์ถ๊ฐ๋ ๋ถ๋ถ์ ๋๋ค.)
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V3 ์ฝ๋
viewName๊ณผ model์ ํ๋๋ก ๊ฐ์ง๋ ModelView ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
V3 Controller๋ ํ์ํ ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ V2 Controller์๋ ๋ฌ๋ฆฌ Servlet์ ์์กด์ ์ด์ง ์์ผ๋ฉฐ view์ prefix ๋ํ ์ ๊ฑฐํด ์ฃผ์์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ V1 -> V2 -> V3
์์์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ V1 ๋ฒ์ ๋ถํฐ V3 ๋ฒ์ ๊น์ง ๊ฐ์ ์ ํ์๋๋ฐ์, ๊ฐ ๋ฒ์ ๋ง๋ค ์ด๋ ํ ๋ถ๋ถ์ด ๊ฐ์ ๋์๋์ง ๊ฐ๋จํ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
FrontControllerServlet
Controller
Controller ๊ตฌํ์ฒด
์ ์ด๋ฏธ์ง์ฒ๋ผ V1 -> V2 -> V3 ๋ฒ์ ์ผ๋ก ๊ฐ์๋ก ์ค๋ณต๋ ์ฝ๋๋ ์ ๊ฑฐํ๊ณ (View, prefix, JSP forward ๋ฑ), ์๋ธ๋ฆฟ์ ์์กด์ ์ธ ์ฝ๋(HttpServletRequest, HttpServletResponse)๋ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์ ํ ์ ์์์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V4 ๊ตฌ์กฐ
V3 ๊ตฌ์กฐ์์๋ ์ปจํธ๋กค๋ฌ์ ModelView ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐํํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์กด์ฌํ๋๋ฐ์, ์ด๋ ๊ฐ๋ฐ์์ ์ ์ฅ์์๋ ๋ถํ์ํ ๋ถ๋ถ์ผ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ ์กฐ๊ธ ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก V4 ๋ฒ์ ์ ํตํด ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
(์๋ ๋นจ๊ฐ์ ๋ค๋ชจ ๋ฐ์ค ๋ถ๋ถ์ด V1 ๊ตฌ์กฐ์์ ์ถ๊ฐ๋ ๋ถ๋ถ์ ๋๋ค.)
V3 ๊ตฌ์กฐ์ ๋์ผํ์ง๋ง 3๋ฒ์์ ๊ธฐ์กด์๋ ModelView๋ฅผ ๋ฐํํ๋ค๋ฉด V4์์๋ ViewName๋ง ๋ฐํํฉ๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V4 ์ฝ๋
V3์๋ ๋ฌ๋ฆฌ Controller์์ ModelView๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋ ViewName์ธ String๋ง ๋ฐํํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
๋ง์ ๊ฐ์ ์ ์๋์ง๋ง ์ด์ ๋ฒ์ ๊ณผ๋ ๋ฌ๋ฆฌ ์ปจํธ๋กค๋ฌ์์ ModelView ๊ฐ์ฒด์ ๋ํด ์ ํ์๊ฐ ์๊ณ , View์ ์ด๋ฆ๋ง ๋ฐํํ๋๋ก ๋จ์ํ๊ณ ์ค์ฉ์ ์ผ๋ก ๊ฐ์ ํ์์ต๋๋ค.
"ํ๋ ์์ํฌ๋ ๊ณตํต ๊ธฐ๋ฅ์ด ์๊ณ ๋ก์์ผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ ํธ๋ฆฌํด์ง ์ ์์ต๋๋ค."
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V5 ๊ตฌ์กฐ
์ง๊ธ๊ป ๊ฐ๋ฐํด์จ V1 ~ V4 ๊ตฌ์กฐ์์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ํ๋์ ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฒ์ ๊ฐ ํธํ์ด ๋ถ๊ฐ๋ฅํ๋ฐ์, ๋ง์ฝ ๋๊ตฐ๊ฐ๋ ControllerV3๋ฅผ ์ฌ์ฉํ๊ณ ๋๊ตฐ๊ฐ๋ ControllerV4 ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ด๋ฌํ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ด๋ํฐ ํจํด์ ๋๋ค.
V5 ๋ฒ์ ์์๋ ์ด๋ํฐ ํจํด์ ์ ์ฉํ์ฌ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ค์ํ ๋ฐฉ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
(์๋ ๋นจ๊ฐ์ ๋ค๋ชจ ๋ฐ์ค ๋ถ๋ถ์ด V1 ๊ตฌ์กฐ์์ ์ถ๊ฐ๋ ๋ถ๋ถ์ ๋๋ค.)
- ํธ๋ค๋ฌ ์ด๋ํฐ: ์ค๊ฐ์ ์ด๋ํฐ ์ญํ ์ ํตํด ๋ค์ํ ์ข ๋ฅ์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
- ํธ๋ค๋ฌ: ์ด๋ํฐ๋ก ์ธํด ์ปจํธ๋กค๋ฌ์ ์ ํ์ ์ด์ง ์์ ํธ๋ค๋ฌ๋ก ๋ค์ด๋ฐ์ ๋ณ๊ฒฝํ์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - V5 ์ฝ๋
๊ธฐ์กด์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฐ๋ก ํธ์ถํ์ง๋ง, ์ด์ ๋ ์ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋ฉ๋๋ค.
- supports(): ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ControllerV3๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ํ๋จํฉ๋๋ค.
- handle(): ํธ๋ค๋ฌ๋ฅผ ControllerV3์ผ๋ก ๋ณํํ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ค์ ํธ์ถํ๊ณ , ModelView๋ฅผ ๋ฐํํฉ๋๋ค.
V5 FrontController์์๋ ํธ๋ค๋ฌ ๋งคํ ์ ๋ณด(handlerMappingMap)์์ ํธ๋ค๋ฌ๋ฅผ ์กฐํํ๊ณ , ํธ๋ค๋ฌ ์ด๋ํฐ ๋ชฉ๋ก(handlerAdapters)์์ ์ฒ๋ฆฌํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์ ํ ์ฒ๋ฆฌํฉ๋๋ค.
์ฌ์ฉ์๋ ๋ฒ์ ์ ๊ด๊ณ์์ด V5์์ ๋์ ๋ ์ด๋ํฐ๋ฅผ ํตํด ํ๋ ์์ํฌ๋ฅผ ์กฐ๊ธ ๋ ์ ์ฐํ๊ณ ํ์ฅ์ฑ์๊ฒ ์ค๊ณ๋ฅผ ํ ์ ์์์ต๋๋ค.
V1 ~ V5 ๋ฒ์ ์์๋ ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ก์ง์ ๋ถ๋ฆฌํ๋ฉฐ ์๋ธ๋ฆฟ์ ์์กด์ ์ธ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ณ , ๊ฐ๋ฐ์๊ฐ ์กฐ๊ธ ๋ ํธ๋ฆฌํ๊ฒ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ก์ง์ ๊ฐ๋จํ ํ๊ณ , ์ด๋ํฐ๋ฅผ ๋์ ํ์ฌ ํ๋ ์์ํฌ๋ฅผ ํ์ฅ์ฑ์๊ฒ ๊ฐ์ ํด๋ณด์์ต๋๋ค.
์ง์ ๋ง๋ค์ด๋ณธ FrontController ํจํด์ด ์คํ๋ง์์๋ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง ๊ถ๊ธํ์ ๋ถ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํ์
๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์ ์ง์ ๋ง๋ค์ด๋ณธ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์คํ๋ง ํ๋ ์์ํฌ์๋ ๋ด๋ถ์ ์ผ๋ก ๋์ผํ๊ฒ ๊ตฌํ์ด ๋์ด ์๋๋ฐ์, ์ฌ์ฉํ ๊ฐ์ฒด๋ค (HandlerAdapter, ModelView ๋ฑ) ๋ํ ์คํ๋ง์ ๋น์ทํ ๋ค์ด๋ฐ์ ๊ฐ์ฒด๊ฐ ์กด์ฌ ํฉ๋๋ค.
์คํ๋ง ํ๋ ์์ํฌ์์๋ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง ๊ถ๊ธํ์ ๋ถ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ์ ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค
๋๊ธ