JSP๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฐ ๋ฐฉ์์ โถ์ ์ง๋ณด์ โทURL ๋ณ๊ฒฝ์ด ์ ์ฐํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค.
2000๋ ๋ ์ค๋ฐ ์ดํ ๊ฐ๋ฐ์ ๊ฑฐ์ MVC ํ์์ผ๋ก ์๋ธ๋ฆฟ๊ณผ JSP๋ฅผ ํจ๊ป ์ด์ฉํ๋ค.
์๋ธ๋ฆฟ ์ฝ๋๋ ์๋ฐ ์ฝ๋์ ๋ฌธ๋ฒ(์์, ์ธํฐํ์ด์ค) ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง HTTP๋ก ์ ๋ฌ๋ ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑํ๋ HTML์ ์ฒ๋ฆฌํ ๋ ํจ์ฉ์ฑ์ด ๋ฎ๋ค.
JSP์ ๊ฒฝ์ฐ HTML ์ฝ๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก HTTP ๋ฉ์์ง ์์ฑ์๋ ์ ํฉํ์ง๋ง,
๊ทธ ์์ ์๋ฐ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ์๋ฐ ์ฝ๋์ HTML์ด ํผ์ฌํ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ธ๋ฆฟ๊ณผ JSP์ ์ญํ ์ ๋๋ ๋ณด๋ฉด ์ด๋จ๊น?
โก๏ธ ๋ธ๋ผ์ฐ์ ์์ฒญ์ ํด๋น ์ฃผ์๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ธ๋ฆฟ์ ์ ๋ฌ๋๊ณ ,
์๋ธ๋ฆฟ ๋ด๋ถ์์๋ JSP๋ก ๋ค์ ์ ๋ฌํ์ฌ EL์ ์ด์ฉํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
(๋ธ๋ผ์ฐ์ โ ์๋ธ๋ฆฟ โ JSP โ ๋ธ๋ผ์ฐ์ )์ฌ์ง ์ถ์ฒ : JSP / Servlet(์๋ธ๋ฆฟ)์ MVC ํจํด
- ์๋ธ๋ฆฟ : ์๋ต์ ํ์ํ ๋ฐ์ดํฐ ์์ฑ / ๋ค๋ฅธ ๊ฐ์ฒด๋ค ์ฐ๋ ํ์ ์ฒ๋ฆฌ / ์์์ด๋ ์ธํฐํ์ด์ค ํ์ฉ / ์ฝ๋์ ์ฌ์ฌ์ฉ
- JSP : EL์ ์ด์ฉํด์ ๋ฐ์ดํฐ ์ถ๋ ฅ / HTML ์ฝ๋ ํ์ฉ / ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ ์ต์ข ๊ฒฐ๊ณผ ์์ฑ
- ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ, JSP๊ฐ ๋ทฐ ์ญํ ์ ๋ด๋นํ๊ฒ ํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.
- ๋ธ๋ผ์ฐ์ ํธ์ถ์ ๋ฐ๋์ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ ์๋ธ๋ฆฟ์ ํธ์ถํ๋ค.
- JSP๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํธ์ถํ์ง ์๋๋ก ํ๊ณ Controller(์๋ธ๋ฆฟ)๋ฅผ ํตํด์๋ง JSP์ ์ ๊ทผํ๋๋ก ๊ตฌ์ฑํ๋ค.
/input
๊ณผ ๊ฐ์ด ํน์ ํ ์ฃผ์๋ฅผ ํธ์ถ
HTTPServlet
์์ ์์๋ฐ์doGet()
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ฉด ๋ ๊ฒ์ด๋ค.
<form>
ํ๊ทธ์ action์ โ/calcResultโ์ ๊ฐ์ด ๋ณ๊ฒฝํ๊ณ ์ด์ ํด๋นํ๋<form>
์ผ๋ก ์ ๋ฌ๋๋ numl, num2 ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ด์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ฆ.
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ์ญํ ์ ์ปจํธ๋กค๋ฌ (์ฌ๊ธฐ์๋ ์๋ธ๋ฆฟ)์ด ์ํํ๋ค!
- ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ์ญํ ์ View๋ฅผ ๋งก๊ณ ์๋ JSP์์ ์ํํ๋ค!
์๋ธ๋ฆฟ์ ์์ฑํ ๋๋ JSP์ ๋ฌ๋ฆฌ src/main/webapp
ํด๋์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, src/main/java
ํด๋์ ํจํค์ง๋ฅผ ๋ง๋ค์ด์ ์์ฑํ๋ค.
@WebServlet(name = "inputController" , urlPatterns = "/calc/input")
- @WebServlet ์ด๋ ธํ ์ด์ โญ์ ์น ์๋ธ๋ฆฟ์ผ๋ก ํ์ฌ๊ธ url ๋งคํ์ ํ๊ฒ ํ๋ค.
- JAVA์์
@WebServlet
์ ์ด๋ ธํ ์ด์ ์ ์ฃผ์ ์์ฑ์name
,urlPatterns
,value
๊ฐ ์๋ค.
-name
์ ์๋ธ๋ฆฟ์ ์ด๋ฆ์ ์ค์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋น ๋ฌธ์์ด(""
)์ด๋ค.
-urlPatterns
๋ ์๋ธ๋ฆฟ์ URL ๋ชฉ๋ก์ ์ค์ ํ๋ค.
์์ฑ๊ฐ์ผ๋ก String ๋ฐฐ์ด์ ์ง์ ํ๋ฉฐ, ๊ธฐ๋ณธ ๊ฐ์ ๋น ๋ฐฐ์ด({}
)์ด๋ค.
-value
๋urlPattern
๊ณผ ๊ฐ์ ์ฉ๋์ด๋ค. ์ด๋ ธํ ์ด์ ์์ ๋จ์ผ ์์ฑ value๋ ์๋ต ๊ฐ๋ฅ.
- ์ฐธ๊ณ :
- @WebServlet ์ฌ์ฉํ๊ธฐ
- ์๋ธ๋ฆฟ ๊ตฌํ ๋ฐ ์คํ (web.xml, @WebServlet ์ค์ )
- ์๋ธ๋ฆฟ(Servlet) url ๋งคํ๊ธฐ๋ฒ 2๊ฐ์ง(web.xml, ์ด๋ ธํ ์ด์ )
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/calc/input.jsp");
RequestDispatcher
โญ๋ โถํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ต์ด์ ๋ค์ด์จ ์์ฒญ์ JSP/Servlet ๋ด์์ ์ํ๋ ์์์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ ์ญํ ์ ์ํํ๊ฑฐ๋, ํน์ ์์์ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๊ณ โท์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ค๋ ๊ธฐ๋ฅ์ ์ํํ๋ ํด๋์ค์ด๋ค.
req.getRequestDispatcher(URL์ฃผ์)
๋ URL ์ฃผ์์ ๋ํ RequestDispatcher ๊ฐ์ฒด๋ฅผ ServletRequest๋ฅผ ํตํด์ ์ป๋ ๋ฐฉ๋ฒ
- [์๋ธ๋ฆฟ/JSP] REQUESTDISPATCHER๋. REQUESTDISPATCHER๋ก FORWARD() ํ๊ธฐ
dispatcher.forward(req, resp);
- forward() ๋ฉ์๋๋ ๋์ ์์์ผ๋ก ์ ์ด๋ฅผ ๋๊ธฐ๋ ์ญํ ์ ํ๋ค.
- ๋ธ๋ผ์ฐ์ ์์
/a.jsp
๋ก ์์ฒญํ์ ๋/a.jsp
์์forward()
๋ฅผ ์คํํ์ฌ/b.jsp
๋ก ์ ์ด๋ฅผ ๋๊ธธ ์ ์๋ค. ์ ์ด๋ฅผ ๋๊ฒจ๋ฐ์/b.jsp
๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ต์ข ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์๊ฒ ์ถ๋ ฅํ๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฅ์์๋/a.jsp
๋ฅผ ์์ฒญํ์ง๋ง ๋ฐ์ ๊ฒฐ๊ณผ๋/b.jsp
์ ๊ฒฐ๊ณผ์ด๋ค. ์ด๋ HTTP ๋ฆฌ๋ค์ด๋ ํธ ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ ํ๋์ HTTP ์์ฒญ(Request) ๋ฒ์ ์์์ ๋์์ด ์ด๋ฃจ์ด์ง๋ค.
RequestDispatcher
๋ ์๋ธ๋ฆฟ์ ์ ๋ฌ๋ ์์ฒญ(Request)์ ๋ค๋ฅธ ์ชฝ์ผ๋ก ์ ๋ฌ ํน์ ๋ฐฐํฌํ๋ ์ญํ ์ ํ๋ค. InputController
์๋ธ๋ฆฟ์ /WEB-INF/calc/input.jsp
๋ผ๋ ๋ชฉ์ ์ด๋ฅผ ๊ฐ๋ ์ค๊ฐ ๊ฒฝ์ ์ง๊ฐ ๋๋ค. (49p)
InputController
๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ํด๋น ์๋ธ๋ฆฟ์ ์์ ์ ๋ชจ๋ ์คํํ ์ดํinput.jsp
๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋๋ค.
๊ธฐ์กด ์ฌ์ฉํ๋ input.jsp
์ calcResult.jsp
๋ WEB-INF ๊ฒฝ๋ก ๋ฐ์ผ๋ก ์ด๋์ํจ๋ค.
- WEB-INF ํด๋์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผ์ด ๋ถ๊ฐํ ๊ฒฝ๋ก๋ค.
- WEB-INF ํด๋์ ์์ ๊ฒฝ์ฐ localhost:8090/WEB-INF/test.jsp๋ก ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค. ์ด๋ก์ธํด ์ ์ ์ ์ง์ ์ ๊ทผ์ด ์ด๋ ต์ ๋ณด์์ฑ์ด ๋๋ค.
- ์ง์ ์ ์ผ๋ก view๋ฅผ ๋ณผ ์ ์๋ค. ๋ํ ์ง์ ์ ์ผ๋ก ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์<a>
์ต์ปค ํ๊ทธ๋ก ์ด๋์ด ๋ถ๊ฐํ๋ฉฐ Controller๋ฅผ ํตํด์๋ง ์ด๋์ ํด์ผ ํ๋ค.
- [์คํ๋ง ๊ฐ๋ ] web๊ณผ WEB-INF ํด๋์ ๊ดํด์ ๋ฐ WEB-INF์์์ ์ต์ปค ํ๊ทธ
<a>
์ ๊ดํด์
CalcController
์์ฑ์๋ธ๋ฆฟ์ doPost()
๋ผ๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด์ POST ๋ฐฉ์์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ(Request)๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
CalcController
๋ผ๋ ์๋ธ๋ฆฟ์ ์ถ๊ฐํด์ POST ์์ฒญ์ ๋ฐ์๋ณด์.
@WebServlet(name="calcController" , urlPatterns = "/calc/makeResult")
:
์น ์๋ธ๋ฆฟ์ urlPattern ๊ฐ์ด /calc/makeResult
๋ก ๋์ด ์์ผ๋ฏ๋ก form ํ๊ทธ์ action ์์ฑ์ ์ฌ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
(WEB-INF/calc/input.jsp
์ form action ์ฌ์ง์ )
doPost()
: ๋ธ๋ผ์ฐ์ ์์ POST ๋ฐฉ์์ผ๋ก ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ง ํธ์ถ์ด ๊ฐ๋ฅํจ.
String num1 = req.getParameter("num1");
,
String num2 = req.getParameter("num2");
:
HttpServletRequest.getParameter(ํ๋ผ๋ฏธํฐ ์ด๋ฆ)
์ผ๋ก ์ ๋ฌ๋ ๋ณ์๋ฅผ ๋ฐ๊ณ ์๋ค. ์ซ์๊ฐ ์๋ ๋ฌธ์์ด String ํ์
์ผ๋ก ๋ฐ๋ ๊ฒ์ ์ฃผ์ํด์ผ ํ๋ค.
http://localhost:8080/calc/input
๋ก ๋ธ๋ผ์ฐ์ ์์ GET ์์ฒญํด๋น url์ด ๋งคํ๋ ์น ์๋ธ๋ฆฟ InputController
๊ฐ ์์ฒญ ๊ฐ์ฒด์ RequestDispatcher
๊ฐ์ฒด๋ฅผ ์ป์ด /WEB-INF/calc/input.jsp
๋ก forward
์ํด.
/WEB-INF/calc/input.jsp
์ form ํ๊ทธ์๋ SEND
๋ผ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด POST ๋ฐฉ์์ ์์ฒญ์ /calc/makeResult
๋ผ๋ url๋ก ์งํํ๋๋ก form ํ๊ทธ ์ค์ ์ด ๋์ด ์์.
/calc/makeResult
url์ด ๋งคํ๋์ด ์๋ CalcController
์๋ธ๋ฆฟ์ด form ํ๊ทธ๋ฅผ ํตํด ์ ๋ฌ๋ num1
๊ณผ num2
์ ๋ณ์๋ฅผ ์ ์ฅํจ.
๐กPOST ๋ฐฉ์์ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ฉด ๋นจ๋ฆฌ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ณด๋๋ก ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ์ด๋์ํค๋ ๊ฒ์ด ์ข๋ค.
(๐ POST ์์ฒญ์ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก POST๋ฅผ ๊ณ์ ์์ฒญํ๋ฉด ์๋ฒ๋ DB์ ๊ณ์ํ์ฌ ์ค๋ณต๋ ์์ฒญ์ด ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๊ฒ ๊ตฌ๋!)
PRG ํจํด (Post-Redirect-Get) - ์ฝ์ง์ค์ธ ๊ฐ๋ฐ์
โก์๋ก๊ณ ์นจ์ผ๋ก ์ธํ ๋์ผํ ์์ฒญ์ด ์ฐ์์ ์ผ๋ก ๋ณด๋ด์ง๋ ์ด์
โกPOST ์์ฒญ์ URL์ ๋ณต์ฌํ๋๋ผ๋ ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ ์ ์๋ค๋ ์
์ด ๋ HttpServletResponse
์ sendRedirect()
๋ฅผ ์ฌ์ฉํ๋ค.
- https://dololak.tistory.com/502 : RequestDispatcher๊ฐ ์๋ ์ด์ . HttpServletResponse#sendRedirect() ์์ ์ฐจ์ด์
HttpServletResponse
๋ฅผ ์ฌ์ฉํ๋ฉดsendRedirect()
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ง์ ํ ๊ฒฝ๋ก๋ก ์ ์ด๋ฅผ ์ด๋์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋sendRedirect()
๋ HTTP ๋ฆฌ๋ค์ด๋ ์ ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์์ฒญ ๋ฒ์ ์์์ ์ฒ๋ฆฌ๋ฅผ ํ๋๊ฒ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์๊ฒ Response ํ ๋ธ๋ผ์ฐ์ ์ธก์์ ์ง์ ๋ฐ์ ์์ฒญ ๊ฒฝ๋ก๋ก ๋ค์ ์ฌ์์ฒญ์ ํ๋ ๋ฐฉ์์ด๊ธฐ์ ๋ ๋ฒ์ HTTP ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ฉฐ, ์๋ฒ์ธก์์๋ ์ต์ด์ ๋ฐ์ ์์ฒญ์ค์ ์ฒ๋ฆฌํ ๋ด์ฉ์ ๋ฆฌ๋ค์ด๋ ํธ ๋ ์์ฒญ์์์ ๊ณต์ ํ ์ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ๋ฌผ๋ก
sendRedirect()
์์๋ ์ฟ ํค๋ ์ธ์ ๋ฑ์ ์ด์ฉํด ํน์ ์ํ๋ฅผ ์ ์งํ์ฌ ๊ณต์ ํ ์๋ ์๊ฒ ์ผ๋, ์ํฉ์ ๋ฐ๋ผ ์ ํ์ ์ผ ์ ์์ผ๋ฉฐ, ์ฝ๋ ๋ ๋ฒจ ์์์ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ๊ณง๋ฐ๋ก ์ด์ด๊ฐ๋๋ฐ์๋ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์๋ ์์๊ฒ ์ ๋๋ค.
๊ทธ๋์HttpServletResponse
๋ฅผ ํตํด ๋ฆฌ๋ค์ด๋ ํธ ํ๋ ๋ฐฉ์์ ํ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ์ด์ธ์ ๋ค๋ฅธ ์์์ ๊ฒฝ๋ก๋ฅผ ์์ฒญํ ์ ์๋ ๋ฐ๋ฉดRequestDispatcher
๋ ํ์ฌ ์ฒ๋ฆฌ์ค์ธ ์๋ธ๋ฆฟ์ด ์ํด ์๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ฒ์ ๋ด์์๋ง ์์ฒญ์ ์ ์ดํ ์ ์์ต๋๋ค.
CalcController
์ doPost()
์์
Controller A
Controller A
=> ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ๋ ๋ค๋ฅธ ์ฃผ์๋ก Redirectํ๋๋ก ์๋ตController B
Controller B
=> GET ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋ต ๋ฉ์์ง ์ ์ก
- ์ฌ์ฉ์ => ์ ๊ฒ์๊ธ ์์ฑ POST ๋ฐฉ์์ผ๋ก ์ ์ก
- ์๋ฒ์์ ๊ฒ์๊ธ ์ฒ๋ฆฌ ํ ๋ธ๋ผ์ฐ์ ์ฃผ์๋ฅผ ๋ชฉ๋ก ํ๋ฉด ๊ฒฝ๋ก๋ก ์ด๋ํ๋๋ก ์๋ต(Redirect)
- ๋ธ๋ผ์ฐ์ ๋ ๋ชฉ๋ก ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ์ฌ์ฉ์๋ ์์ ์ถ๊ฐ ๊ฒ์๊ธ์ด ์ถ๊ฐ๋ ๊ฒฐ๊ณผ ํ์ธ
์์ด์ดํ๋ ์ ๊ทธ๋ฆฌ๊ธฐ ์์น
- ํ๋ฉด์๋ ํด๋น ํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ ๊ฒฝ๋ก(URL)๋ฅผ ๋ช ์ํ๋ค.
- GET ๋ฐฉ์์ผ๋ก ๋์ํ๊ณ ๋์ ๋ณด์ด๋ ๊ฒ์ ๊ฐ์ฅ ๋จผ์ ๊ตฌ์ฑํ๋ค.
- POST ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ปจํธ๋กค๋ฌ๋ ๋ค๋ฅธ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ค.
- Redirect๋์ด ๋ณด์ฌ์ง๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ์ ์ผ๋ก ํํํ๋ค.
์์ด์ด ํ๋ ์์ผ๋ก๋ถํฐ ๊ตฌํ ๋ชฉ๋ก์ ์ ๋ฆฌํ ์๋ ์๋ค. (59 ๊ทธ๋ฆผ ์ฐธ์กฐ)