๐Ÿšฉ [์ž๋ฐ” ์›น ๊ฐœ๋ฐœ ์›Œํฌ๋ถ Ch.1] (3) : 1.4 HttpServlet / 1.5 ๋ชจ๋ธ(Model)

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

Study

๋ชฉ๋ก ๋ณด๊ธฐ
4/9

๐Ÿšฉ 1.4 HttpServlet


๊ฐœ์š” ๐Ÿ



HttpServlet ํŠน์ง•

  • HttpServlet์€ GET/POST ๋“ฑ์— ๋งž๊ฒŒ doGet(), doPost() ๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณธ์ธ์—๊ฒŒ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ GET/POST ๋ฐฉ์‹ ์ฒ˜๋ฆฌ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • HttpServlet์„ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค ๊ฐ์ฒด(์„œ๋ธ”๋ฆฟ)๋Š” ํ†ฐ์บฃ๊ณผ ๊ฐ™์€ WAS์˜ ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • HttpServlet์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด์„œ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋™์‹œ์— ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ถ”์ƒ ํด๋ž˜์Šค GenericServlet๋Š” HTTP ํ”„๋กœํ† ์ฝœ์— ํŠนํ™”๋˜์ง€ ์•Š๋Š” ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ๋‹ค.

    • ๐Ÿ˜Š์›น ๋ฐ์ดํ„ฐ ํ†ต์‹  ๊ทœ์•ฝ์„ ์ œ์™ธํ•˜๊ณ ๋„ ์—ฌ๋Ÿฌ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ๋ฐ”ํƒ•์ด ๋˜๋Š” ๊ธฐ๋ณธ ์„œ๋ธ”๋ฆฟ์ด ์žˆ๊ฒ ์ฃ !

HttpServlet์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด

  • ์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ(Request)์„ ์ฒ˜๋ฆฌํ•ด์„œ ์‘๋‹ต(Response)ํ•  ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„ ๋˜์—ˆ๋‹ค. ๋‹ค๋งŒ ์ด ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ†ฐ์บฃ ๋“ฑ์˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹ค.

    1. ๋ธŒ๋ผ์šฐ์ € โ†’ ์„œ๋ธ”๋ฆฟ ํŠน์ • ๊ฒฝ๋กœ(URI) ํ˜ธ์ถœ
    2. ํ†ฐ์บฃ : ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ํ•ฉํ•œ ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค ๋กœ๋”ฉ, ๊ฐ์ฒด ์ƒ์„ฑ
      (init() ๋ฉ”์†Œ๋“œ๋กœ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด ๋™์ž‘ ์ „ ์ˆ˜ํ–‰ํ•  ๋‚ด์šฉ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)
    3. ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด : ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด ๋ถ„์„ํ•˜์—ฌ GET/POST ๋“ฑ์˜ ์ •๋ณด์™€ ํ•จ๊ป˜ ๊ฐ™์ด ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ(์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๋‚ด์šฉ)๋“ค์„ HttpServletRequest ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์Œ.
      (์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ HttpServletResponse๊ฐ€ ๋‹ด๋‹น)
    4. ์„œ๋ธ”๋ฆฟ ๋‚ด๋ถ€ : GET/POST์— ๋งž๊ฒŒ doGet()/doPost() ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ ์‹คํ–‰. ์ดํ›„ ๋™์ผํ•œ (์ฃผ์†Œ)ํ˜ธ์ถœ์ด ์žˆ์„ ๋•Œ๋Š” ์„œ๋ธ”๋ฆฟ์€ ๋™์ผํ•œ ๊ฐ์ฒด ํ•˜๋‚˜๋งŒ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ์ฒ˜๋ฆฌ.
    5. ํ†ฐ์บฃ ์ข…๋ฃŒ : ์„œ๋ธ”๋ฆฟ destroy()
  • โ‘  ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋Š” ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง
    โ‘ก ๋งค๋ฒˆ ํ˜ธ์ถœ ์‹œ์—๋Š” ์ž๋™์œผ๋กœ doGet() / doPost()๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋จ
    doGet์—์„œ ํ˜ธ์ถœ๋˜๋Š” ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ๋™์ผํ•˜๋‹ค.

    ๐Ÿ˜Š ํ•˜๋‚˜์˜ ์ฃผ์†Œ์— ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋์œผ๋ฉด ๊ทธ ์ดํ›„๋กœ ๋™์•Œํ•œ ์ฃผ์†Œ๋ฅผ ์š”์ฒญ ๋ฐ›์•˜์„ ๋•Œ ์ƒˆ๋กœ์šด ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด ๋‘์—ˆ๋˜ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ตฌ๋‚˜!

HttpServletRequest ์ฃผ์š” ๊ธฐ๋Šฅ

getParameter( )

  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์—์„œ ํ‚ค(key)๋ฅผ ์ด์šฉํ•ด ๊ฐ’(value)๋ฅผ ์–ป๋Š”๋‹ค.
    ?name=AAA&age=20
    (request.getParameter(name) == "AAA")
    • getParameter()์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์€ ํ•ญ์ƒ String์ด๋‹ค.
    • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด null๋ฐ˜ํ™˜, null ์ฒดํฌ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

getParameterValues( )

  • ๋™์ผํ•œ ์ด๋ฆ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • ๋ฐ˜ํ™˜ ํƒ€์ž… String[ ]

setAttribute( )

  • JSP๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ‚ค(key)์™€ ๊ฐ’(value) ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
    • ํ‚ค(key)๋Š” ๋ฌธ์ž์—ด๋กœ ์ง€์ •, ๊ฐ’(value)๋Š” ๋ชจ๋“  ๊ฐ์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • request.setAttribute("3๋Œ€" , 500)

RequestDispatcher( )

  • ์›น MVC ๊ตฌ์กฐ์—์„œ๋Š” HttpServletRequest์˜ getRequestDispatcher(์ฃผ์†Œ)๋ฅผ ์ด์šฉํ•ด์„œ RequestDispatcher ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • RequestDispatcher๋Š” ํ˜„์žฌ์˜ ์š”์ฒญ์„ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ์ž์›(์„œ๋ธ”๋ฆฟ ํ˜น์€ JSP)์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 2๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

HttpServletResponse์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

sendRedirect()

  • sendRedirect()๋Š” ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ๊ฐ€๋ผ๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฐ๋‹ค.์ถœ์ฒ˜ : https://stackoverflow.com/questions/2047122/requestdispatcher-forward-vs-httpservletresponse-sendredirect
    • HttpServletResponse๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด sendRedirect() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์ •ํ•œ ๊ฒฝ๋กœ๋กœ ์ œ์–ด๋ฅผ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ sendRedirect()๋Š” HTTP ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์š”์ฒญ ๋ฒ”์œ„ ์•ˆ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ Response ํ›„ ๋ธŒ๋ผ์šฐ์ €์ธก์—์„œ ์ง€์ •๋ฐ›์€ ์š”์ฒญ ๊ฒฝ๋กœ๋กœ ๋‹ค์‹œ ์žฌ์š”์ฒญ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ์— ๋‘ ๋ฒˆ์˜ HTTP ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์„œ๋ฒ„์ธก์—์„œ๋Š” ์ตœ์ดˆ์— ๋ฐ›์€ ์š”์ฒญ์ค‘์— ์ฒ˜๋ฆฌํ•œ ๋‚ด์šฉ์„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋œ ์š”์ฒญ์•ˆ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฌผ๋ก  sendRedirect() ์—์„œ๋„ ์ฟ ํ‚ค๋‚˜ ์„ธ์…˜๋“ฑ์„ ์ด์šฉํ•ด ํŠน์ • ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ๊ณต์œ ํ•  ์ˆ˜๋Š” ์žˆ๊ฒ ์œผ๋‚˜, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ ๋ ˆ๋ฒจ ์—์„œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์„ ๊ณง๋ฐ”๋กœ ์ด์–ด๊ฐ€๋Š”๋ฐ์—๋„ ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์„๊ฒƒ์ž…๋‹ˆ๋‹ค.

      ๊ทธ๋Œ€์‹  HttpServletResponse๋ฅผ ํ†ตํ•ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๋Š” ๋ฐฉ์‹์€ ํ˜„์žฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด์™ธ์— ๋‹ค๋ฅธ ์ž์›์˜ ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด RequestDispatcher๋Š” ํ˜„์žฌ ์ฒ˜๋ฆฌ์ค‘์ธ ์„œ๋ธ”๋ฆฟ์ด ์†ํ•ด ์žˆ๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์š”์ฒญ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      ์ถœ์ฒ˜ : [์„œ๋ธ”๋ฆฟ/JSP] REQUESTDISPATCHER๋ž€. REQUESTDISPATCHER๋กœ FORWARD() ํ•˜๊ธฐ

์™€์ด์–ด ํ”„๋ ˆ์ž„์˜ ๊ตฌํ˜„ ( 67 ~ 73 )

  • ์™€์ด์–ด ํ”„๋ ˆ์ž„ ๊ธฐ๋Šฅ ์ •๋ฆฌ

  • GET/POST ์š”์ฒญ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค.




๐Ÿšฉ 1.5 ๋ชจ๋ธ(Model)

๐Ÿ ๋ชจ๋ธ๊ณผ 3ํ‹ฐ์–ด

  • ์›น MVC ์ž…์žฅ์—์„œ ๋ชจ๋ธ์€ ์ปจํŠธ๋กค๋Ÿฌ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋Š” ์กด์žฌ์ง€๋งŒ ์‹œ์Šคํ…œ ์ „์ฒด ๊ตฌ์กฐ๋กœ ๋ณด๋ฉด ๋ชจ๋ธ์€ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ทฐ๋ฅผ ์ œ์™ธํ•œ ๋‚จ์€ ๋ถ€๋ถ„์ด๋‹ค.

    ์ด๋Š” โถ View๊ณ„์ธต(JSP + ์„œ๋ธ”๋ฆฟ) / โท ์„œ๋น„์Šค ๊ณ„์ธต(๋กœ์ง ์ฒ˜๋ฆฌ) / โธ ์˜์† ๊ณ„์ธต(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ)๋กœ ๋‹ค์‹œ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

DTO(Data Transfer Object)

  • DTO๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?
    ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด(DTO)๋ž€ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. DTO ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋‘ ์‹œ์Šคํ…œ(API์™€ ์„œ๋ฒ„ ๋“ฑ) ๊ฐ„ ํ†ต์‹ ์„ ์›ํ™œํ•˜๊ฒŒ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 3ํ‹ฐ์–ด ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ณ„์ธต์ด๋‚˜ ๊ฐ์ฒด๋“ค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ DTO(Data Transfer Object, ์ดํ•˜ DTO)โญ๋ผ๊ณ  ํ•œ๋‹ค.

  • DTO๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ํ•„์š”ํ•œ ๊ณณ์— ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœ์„ ๊ฒฐ๊ณผ๋กœ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • DTO๋Š” Java Beansโญ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    • ์ƒ์„ฑ์ž๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋ฐ˜๋“œ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ํ˜•ํƒœ (๊ธฐ๋ณธ ์ƒ์„ฑ์ž)
    • ์†์„ฑ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)์€ private์œผ๋กœ ์ž‘์„ฑ
    • getter/setter๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ
      - ์ด ์™ธ์—๋„ Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ ๋“ฑ...
  • ์ž๋ฐ”๋นˆ์ฆˆ ์˜ˆ์‹œ

    public class CoffeeBEAN implements Serializable {

       private String name;
       private List<String> ingredients;

       public CoffeeBEAN() {
       }

       public String getName() {
           return name;
       }

       public void setName(String name) {
           this.name = name;
       }

       public List<String> getIngredients() {
           return ingredients;
       }

       public void setIngredients(List<String> ingredients) {
           this.ingredients = ingredients;
       }
    }

์„œ๋น„์Šค ๊ฐ์ฒด

  • DTO๋Š” ๋‹จ์ˆœํžˆ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ,
    ์ฃผ๋กœ ์„œ๋น„์Šค ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ๋“ค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฆฌํ„ดํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  • Service๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋‹ค. Controller๊ฐ€ Request๋ฅผ ๋ฐ›์œผ๋ฉด ์ ์ ˆํ•œ Service์— ์ „๋‹ฌํ•˜๊ณ , ์ „๋‹ฌ ๋ฐ›์€ Service๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. DAO๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ ‘๊ทผํ•˜๊ณ , DTO๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๋‹ค์Œ, ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ถœ์ฒ˜ : DAO, DTO, Service

TodoService ํด๋ž˜์Šค

  • TodoService ํด๋ž˜์Šค๋Š” enum ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.
  public enum TodoService {
      INSTANCE;
  }
  • enum ํƒ€์ž…์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ •ํ•ด์ง„ ์ˆ˜ ๋งŒํผ๋งŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

    enum์˜ ์ƒ์ˆ˜๊ฐ€ INSTANCE ํ•œ ๊ฐœ๋งŒ ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์„ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

    ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(singleton pattern)โญ์€ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

    ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์ด TodoService ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋”ฐ.

  • TodoService์˜ ๋ฉ”์†Œ๋“œ๋“ค :
    TodoService ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ๋‹ค. ์„œ๋น„์Šค ๊ฐ์ฒด๋Š” ์›์น™์ ์œผ๋กœ System.out.println()๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋˜์ง€๋งŒ, ๋””๋ฒ„๊น… ์šฉ๋„๋กœ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    ๋“ฑ๋ก/๋ชฉ๋ก์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

public List<TodoDTO> getList() {
        List<TodoDTO> todoDTOs = IntStream.range(0, 10).mapToObj(i -> {
            TodoDTO dto = new TodoDTO();
            dto.setTno((long)i);
            dto.setTitle("Todo..."+i);
            dto.setDueDate(LocalDate.now());

            return dto;
        }).collect(Collectors.toList());

        return todoDTOs;
    }

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ชจ๋ธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

  • ์›น MVC ๊ตฌ์กฐ์—์„œ๋Š” ํ™”๋ฉด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ์ปจํŠธ๋กค๋Ÿฌ๋Š” (๋ชจ๋ธ์˜) ์„œ๋น„์Šค ๊ฐ์ฒด์˜ ํž˜์„ ๋นŒ๋ ค์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    • ~Controller -> ~Service์˜ ๊ฒฐ๊ณผ -> JSP
  • ์ด ๊ณผ์ •์—์„œ HttpServletRequest์˜ setAttribute()๊ฐ€ ์ค‘์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. 'ํ‚ค(key)'-'๊ฐ’(value)' ํ˜•์‹์œผ๋กœ HttpServletRequest์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. ์ด ์š”์ฒญ๊ฐ์ฒด๊ฐ€ forward์— ๋‹ด๊ฒจ jsp๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

TodoListController ์˜ ์ฒ˜๋ฆฌ

System.out.println("/todo/List");
        
        List<TodoDTO> dtoList = TodoService.INSTANCE.getList();
        
        req.setAttribute("List", dtoList); //setAttribute๋กœ req ์†์„ฑ์— ๋‹ด์•„์„œ
                                                                //ํฌ์›Œ๋”ฉ
        req.getRequestDispatcher("/WEB-INF/todo/list.jsp").forward(req, resp);
  • WEB-INF/todo/list.jsp
<h1>List Page</h1>

${List} //List ๊ฐ์ฒด์˜ toString์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

</body>

JSP - EL(Expression Language)

  • JSP ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ${}๋Š” EL(Expression Language)โญ์˜ ํ‘œํ˜„์‹์ด๋‹ค.
  • ๊ณผ๊ฑฐ์—๋Š” JSP์—์„œ๋„ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋‚ด๋ถ€์—์„œ ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ๊ฐ™์ด ์„ž์ด๋ฉด import๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ชจ๋“  ์ž๋ฐ” ๋ฌธ๋ฒ•์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ์šฉ ์–ธ์–ด์ธ EL์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

EL์„ ์ด์šฉํ•œ ์ถœ๋ ฅ

  • EL์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ getter๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    ${list[0].title} == getTno().getTitle()
    (Todo..O)

  • EL์€ ํ‘œํ˜„์‹(expression)์ด๊ธฐ ๋•Œ๋ฌธ์— ${} ๋‚ด๋ถ€ ํ‘œํ˜„์‹์ด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ${1 + 2 + 3} == 6
    • ${"AAA" += "BBB"} == "AAABBB"
    • ${"AAA".equals("AAA")} == true
  • EL ๋‚ด๋ถ€์—์„œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ()

    • ${list[0]โ€ขgetTitle()}
  • ๋‹จ, ์ œ์–ด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ๊ณผ ๊ฐ™์ด '์‹(expression)'์ด ์•„๋‹Œ '๋ฌธ(statement)'๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JSTL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโญ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

JSTL

  • JSTL(JSP Standard Tag Library)์ด๋ž€?

  • JSTL(JavaServerPage Standard Tag Library)๋Š” JSP์—์„œ ๋™์ž‘ํ•˜๋Š” ์ƒˆ๋กœ์šด ํƒœ๊ทธ๋“ค์˜ ๋ฌถ์Œ์ด๋‹ค.

  • ์ž๋ฐ” ๋ฌธ๋ฒ•๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ์–ด๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ, ์„ ์–ธ๋ฌธ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • JSTL ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ build.gradle ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

    • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ํ›„ ํ†ฐ์บฃ ์ค‘์ง€ ๋ฐ ๊ทธ๋ž˜์ด๋“ค ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด์ฃผ์–ด์•ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›์Œ.
dependencies {
    compileOnly('javax.servlet:javax.servlet-api:4.0.1')

    testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")

    implementation group: 'jstl', name: 'jstl', version: '1.2'
}
  • CORE๋ฅผ ์„ ์–ธํ•  ๋•Œ <% taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>๋ฅผ ๋ฌธ์„œ ๊ฐ€์žฅ ์œ„ ๋‹จ์— ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

  • JSP์—์„œ <%@ %>๋กœ ์ž‘์„ฑ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง€์‹œ์ž(directives)โญ๋ผ๊ณ  ํ•œ๋‹ค.
    ์ถ”๊ฐ€ํ•œ ์„ค์ •์€ ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์‹œ์ž๋กœ JSTL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•œ๋‹ค.

<c:forEach>

  • JSTL์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.
    ๋ฐฐ์—ด์ด๋ผ ๋ฆฌ์ŠคํŠธ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

    ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

    • var : EL์—์„œ ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜ ์ด๋ฆ„
    • items : List, Set, Map, Enumeration, iterator ๋“ฑ์˜ ์ปฌ๋ ‰์…˜
    • begin/end : ๋ฐ˜๋ณต์˜ ์‹œ์ž‘/๋ ใ„ฑ๋ฐง
  • list.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<ul>
  <c:forEach var="dto" items="${List}">
  <li>${dto}</Li>
  </c:forEach>
</uL>

  • ๋ฐ˜๋ณต๋ฌธ์˜ ๊ฒฝ์šฐ begin/end๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ.
      <c:forEach var="num" begin="1" end="10">
          <li>${num}</li> //์ถœ๋ ฅ๊ฐ’์€ EL ์‚ฌ์šฉ
      </c:forEach>

<c:if> , <c:choose>

  • <c:if>๋Š” test๋ผ๋Š” ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, test์˜ ์†์„ฑ๊ฐ’์œผ๋กœ boolean์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‹์ด๋‚˜ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ.

  • <c:choose>๋Š” ์ž๋ฐ”์˜ switch ๊ตฌ๋ฌธ๊ณผ ๋น„์Šท.
    ๋‚ด๋ถ€์— <when test="">, c:otherwise๋ฅผ ์ด์šฉํ•ด์„œ if~else if ~else์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

//list ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ™€/์ง์ธ์ง€ ์—ฌ๋ถ€ ์ถœ๋ ฅ
    <c:if test="${list.size()%2 == 0}">
            ์ง์ˆ˜
    </c:if>
    <c:if test="${list.size()%2 != 0}">
        	ํ™€์ˆ˜
    </c:if>
	<c:choose>
        <c:when test="${List.size()%2 == 0}">
            ์ง์ˆ˜
        </c:when>
        <c:otherwise>
            ํ™€์ˆ˜
        </c:otherwise>
    </c:choose>

<c:set>

  • ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    var ์†์„ฑ์œผ๋กœ ๋ณ€์ˆ˜๋ช… ์ง€์ •, value ์†์„ฑ์œผ๋กœ ๊ฐ’ ์ง€์ •
	<ul>
        <c:forEach var="num" begin="1" end="10">
            <c:if test="${num == bigO}">
                num is bigO
            </c:if>
        </c:forEach>
    </ul>

Todo ์กฐํšŒ

  • ์กฐํšŒ๋‚˜ ๋ชฉ๋ก์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ชจ๋ธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ข‹์€ ์˜ˆ์ด๋‹ค.

    ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒํ’ˆ์˜ ๋ฒˆํ˜ธ๋‚˜ ํšŒ์›์˜ ์•„์ด๋”” ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋น„์Šค ๊ฐ์ฒด๋กœ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ JSP๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

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

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