๐Ÿšฉ [์ž๋ฐ” ์›น ๊ฐœ๋ฐœ ์›Œํฌ๋ถ Ch.1] (2) : ์›น MVC ๋ฐฉ์‹

NtoZยท2023๋…„ 5์›” 31์ผ
0

Study

๋ชฉ๋ก ๋ณด๊ธฐ
3/9
post-thumbnail

๐Ÿšฉ 1.3. Web MVC ๋ฐฉ์‹


๐Ÿ ๊ฐœ์š”

  • JSP๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ โถ์œ ์ง€๋ณด์ˆ˜ โทURL ๋ณ€๊ฒฝ์ด ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

  • 2000๋…„๋Œ€ ์ค‘๋ฐ˜ ์ดํ›„ ๊ฐœ๋ฐœ์€ ๊ฑฐ์˜ MVC ํ˜•์‹์œผ๋กœ ์„œ๋ธ”๋ฆฟ๊ณผ JSP๋ฅผ ํ•จ๊ป˜ ์ด์šฉํ•œ๋‹ค.



๐Ÿ MVC ๊ตฌ์กฐ์™€ ์„œ๋ธ”๋ฆฟ/JSP

  • ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๋Š” ์ž๋ฐ” ์ฝ”๋“œ์™€ ๋ฌธ๋ฒ•(์ƒ์†, ์ธํ„ฐํŽ˜์ด์Šค) ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ HTTP๋กœ ์ „๋‹ฌ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” HTML์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํšจ์šฉ์„ฑ์ด ๋‚ฎ๋‹ค.

  • JSP์˜ ๊ฒฝ์šฐ HTML ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ HTTP ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์—๋Š” ์ ํ•ฉํ•˜์ง€๋งŒ,
    ๊ทธ ์•ˆ์— ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋‚˜ ์ž๋ฐ” ์ฝ”๋“œ์™€ HTML์ด ํ˜ผ์žฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ธ”๋ฆฟ๊ณผ JSP์˜ ์—ญํ• ์„ ๋‚˜๋ˆ ๋ณด๋ฉด ์–ด๋–จ๊นŒ?

โžก๏ธ ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ์€ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์— ์ „๋‹ฌ๋˜๊ณ ,
์„œ๋ธ”๋ฆฟ ๋‚ด๋ถ€์—์„œ๋Š” JSP๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•˜์—ฌ EL์„ ์ด์šฉํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
(๋ธŒ๋ผ์šฐ์ € โ†’ ์„œ๋ธ”๋ฆฟ โ†’ JSP โ†’ ๋ธŒ๋ผ์šฐ์ €)์‚ฌ์ง„ ์ถœ์ฒ˜ : JSP / Servlet(์„œ๋ธ”๋ฆฟ)์˜ MVC ํŒจํ„ด

  • ์„œ๋ธ”๋ฆฟ : ์‘๋‹ต์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์™„์„ฑ / ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค ์—ฐ๋™ ํ˜‘์—… ์ฒ˜๋ฆฌ / ์ƒ์†์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉ / ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ

  • JSP : EL์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ / HTML ์ฝ”๋“œ ํ™œ์šฉ / ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•  ์ตœ์ข… ๊ฒฐ๊ณผ ์™„์„ฑ
  • ์›น MVC๋Š” 'Model - View - Controller'์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ(Controller)์—์„œ ๊ฒฐ๊ณผ๋Š” ๋ทฐ(View)์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    ๋ชจ๋ธ(Model)์€ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๊ฐ€๊ณตํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
    • ์„œ๋ธ”๋ฆฟ์ด ์ปจํŠธ๋กค๋Ÿฌ, JSP๊ฐ€ ๋ทฐ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค.


MVC ๊ตฌ์กฐ๋กœ ๋‹ค์‹œ ์„ค๊ณ„ํ•˜๋Š” ๊ณ„์‚ฐ๊ธฐ

  • MVC ๊ตฌ์กฐ์—์„œ ๋ช…์‹ฌํ•ด์•ผ ํ•  ์›์น™
    • ๋ธŒ๋ผ์šฐ์ € ํ˜ธ์ถœ์€ ๋ฐ˜๋“œ์‹œ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์„ ํ˜ธ์ถœํ•œ๋‹ค.
    • JSP๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  Controller(์„œ๋ธ”๋ฆฟ)๋ฅผ ํ†ตํ•ด์„œ๋งŒ JSP์— ์ ‘๊ทผํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค.

GET ์ž…๋ ฅํ™”๋ฉด ์„ค๊ณ„

  1. ๋ธŒ๋ผ์šฐ์ €๋Š” /input๊ณผ ๊ฐ™์ด ํŠน์ •ํ•œ ์ฃผ์†Œ๋ฅผ ํ˜ธ์ถœ
  2. /input์— ๋งž๋Š” ์„œ๋ธ”๋ฆฟ์„ InputController๋กœ ์ž‘์„ฑํ•˜๊ณ , GET ๋ฐฉ์‹์ผ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ์ž‘์„ฑ
    • HTTPServlet์—์„œ ์ƒ์†๋ฐ›์€ doGet() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.
  3. Inputcontroller์˜ ํ™”๋ฉด ์ฒ˜๋ฆฌ๋Š” input.jsp๋ฅผ ์ด์šฉํ•˜๋„๋ก ์ง€์ •
  4. input.jsp์—๋Š” HTML ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑ

POST ์ฒ˜๋ฆฌ์˜ ์„ค๊ณ„

  1. input.jsp์˜ <form> ํƒœ๊ทธ์˜ action์„ โ€˜/calcResultโ€™์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๊ณ  ์ด์— ํ•ด๋‹นํ•˜๋Š”
    CalcResuLtServLet ์„œ๋ธ”๋ฆฟ์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ž‘์„ฑ.
  2. CalcResultServlet์€ <form>์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” numl, num2 ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋‚ด์„œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ฆ.
    • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ์—ญํ• ์€ ์ปจํŠธ๋กค๋Ÿฌ (์—ฌ๊ธฐ์„œ๋Š” ์„œ๋ธ”๋ฆฟ)์ด ์ˆ˜ํ–‰ํ•œ๋‹ค!
  3. ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋ฅผ calcResult.jsp์™€ ๊ฐ™์ด JSP๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•˜๊ณ  JSP์—์„œ๋Š” ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ์€ View๋ฅผ ๋งก๊ณ  ์žˆ๋Š” JSP์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค!

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ(View) ํ˜ธ์ถœ

  • ์„œ๋ธ”๋ฆฟ์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” JSP์™€ ๋‹ฌ๋ฆฌ src/main/webapp ํด๋”์— ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, src/main/java ํด๋”์— ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ƒ์„ฑํ•œ๋‹ค.

  • @WebServlet(name = "inputController" , urlPatterns = "/calc/input")

  • 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) ๋ฐฐํฌ

  • 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>์— ๊ด€ํ•ด์„œ

POST ๋ฐฉ์‹์„ ํ†ตํ•œ ์ฒ˜๋ฆฌ ์š”์ฒญ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ˆซ์ž์˜ ์ฒ˜๋ฆฌ๋Š” POST ๋ฐฉ์‹์œผ๋กœ ์ „์†กํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ CalcController ์ƒ์„ฑ

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 ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

MVC ํŒจํ„ด์— ์˜ํ•œ ์š”์ฒญ ํ๋ฆ„ ์ •๋ฆฌ

  1. http://localhost:8080/calc/input๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ GET ์š”์ฒญ
  1. ํ•ด๋‹น url์ด ๋งคํ•‘๋œ ์›น ์„œ๋ธ”๋ฆฟ InputController๊ฐ€ ์š”์ฒญ ๊ฐ์ฒด์˜ RequestDispatcher ๊ฐ์ฒด๋ฅผ ์–ป์–ด /WEB-INF/calc/input.jsp๋กœ forward ์‹œํ‚ด.

  2. /WEB-INF/calc/input.jsp์˜ form ํƒœ๊ทธ์—๋Š” SEND๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด POST ๋ฐฉ์‹์˜ ์š”์ฒญ์„ /calc/makeResult๋ผ๋Š” url๋กœ ์ง„ํ–‰ํ•˜๋„๋ก form ํƒœ๊ทธ ์„ค์ •์ด ๋˜์–ด ์žˆ์Œ.

  3. /calc/makeResult url์ด ๋งคํ•‘๋˜์–ด ์žˆ๋Š” CalcController ์„œ๋ธ”๋ฆฟ์ด form ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ num1๊ณผ num2์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•จ.

  • โญ MVC ํŒจํ„ด์— ์˜ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ Controller(์„œ๋ธ”๋ฆฟ)๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  View(JSP)๊ฐ€ ํ™”๋ฉด๋‹จ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

    โžก๏ธ URL ๋ณ€๊ฒฝ๊ณผ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜์— ์ž์œ ๋กœ์›€


sendRedirect()

  • ๐Ÿ’ก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() ์ˆ˜์ •



PRG ํŒจํ„ด(Post-Redirect-GET)

  • ์›น MVC ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์€ POST ๋ฐฉ์‹๊ณผ Redirect๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” PRG ํŒจํ„ดโญ์ด๋‹ค.
  1. P : POST ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญ => Controller A
  2. Controller A => ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ๋Š” ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ Redirectํ•˜๋„๋ก ์‘๋‹ต
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ฐ›๋Š”๋‹ค.
  4. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ฃผ์†Œ(์„œ๋ฒ„)๋ฅผ GET ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ => Controller B
  5. Controller B => GET ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต ๋ฉ”์‹œ์ง€ ์ „์†ก
  6. ๋ธŒ๋ผ์šฐ์ €๋กœ ์‘๋‹ต
  • PRG ํŒจํ„ด์€ ๊ฒŒ์‹œํŒ์ด ๋Œ€ํ‘œ์ ์ด๋‹ค.
    • ์‚ฌ์šฉ์ž => ์ƒˆ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ POST ๋ฐฉ์‹์œผ๋กœ ์ „์†ก
    • ์„œ๋ฒ„์—์„œ ๊ฒŒ์‹œ๊ธ€ ์ฒ˜๋ฆฌ ํ›„ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ๋ฅผ ๋ชฉ๋ก ํ™”๋ฉด ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋„๋ก ์‘๋‹ต(Redirect)
    • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชฉ๋ก ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‚ฌ์šฉ์ž๋Š” ์ž์‹  ์ถ”๊ฐ€ ๊ฒŒ์‹œ๊ธ€์ด ์ถ”๊ฐ€๋œ ๊ฒฐ๊ณผ ํ™•์ธ

PRG ํŒจํ„ด์˜ ์žฅ์ 

  • PRG : POST ๋ฐฉ์‹ ์ฒ˜๋ฆฌ ํ›„์— ๋ฐ”๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋™ํ•œ๋‹ค.
    โถ ๋ฐ˜๋ณต์ ์œผ๋กœ POST ํ˜ธ์ถœ์ด ๋˜๋Š” ์ƒํ™ฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
    โท ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„ ๋‹ค์‹œ ์ฒ˜์Œ ๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ„๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๋Š”๋‹ค.

PRG ํŒจํ„ด์„ ์ด์šฉํ•œ ์™€์ด์–ด ํ”„๋ ˆ์ž„ ์ž‘์„ฑํ•˜๊ธฐ (55~59)

  • ์›น์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ ์ด๋™์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ์„ค๊ณ„๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•ด๋ณด๋Š” ๋ฌธ์„œ๊ฐ€ ์™€์ด์–ด ํ”„๋ ˆ์ž„(wire frame)โญ์ด๋‹ค.
    (์ถœ์ฒ˜ : https://www.geeksforgeeks.org/how-to-create-a-wireframe-in-software-design/)

    ์™€์ด์–ด ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™”๋ฉด๊ณผ ํ™”๋ฉด ์‚ฌ์ด์— ์–ด๋–ค ์ผ๋“ค์ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

Todo ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™€์ด์–ด ํ”„๋ ˆ์ž„ ๊ทธ๋ฆฌ๊ธฐ

  • ์™€์ด์–ดํ”„๋ ˆ์ž„ ๊ทธ๋ฆฌ๊ธฐ ์›์น™

    • ํ™”๋ฉด์—๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ(URL)๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
    • GET ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๋ˆˆ์— ๋ณด์ด๋Š” ๊ฒƒ์„ ๊ฐ€์žฅ ๋จผ์ € ๊ตฌ์„ฑํ•œ๋‹ค.
    • POST ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค๋ฅธ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
    • Redirect๋˜์–ด ๋ณด์—ฌ์ง€๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ์„ ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์™€์ด์–ด ํ”„๋ ˆ์ž„์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌํ˜„ ๋ชฉ๋ก์„ ์ •๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (59 ๊ทธ๋ฆผ ์ฐธ์กฐ)

profile
9์—์„œ 0์œผ๋กœ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€