๐Ÿšฉ [์ž๋ฐ” ์›น ๊ฐœ๋ฐœ ์›Œํฌ๋ถ Ch.3] ์„ธ์…˜/์ฟ ํ‚ค/ํ•„ํ„ฐ/๋ฆฌ์Šค๋„ˆ

NtoZยท2023๋…„ 6์›” 13์ผ
0

Study

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

๐Ÿšฉ 3.1 ์„ธ์…˜๊ณผ ํ•„ํ„ฐ

  • ์›น์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณผ๊ฑฐ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ฌด์ƒํƒœ(stateless) ์—ฐ๊ฒฐ.
    ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๊ธฐ์กด ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๊ธฐ์–ตํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๊ธฐ์กด ๋ฐฉ๋ฌธ์ž๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠน๋ณ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์„ธ์…˜(HttpSession)โญ์ด๋‚˜ ์ฟ ํ‚ค(Cookie)โญ๋ผ๋Š” ์กด์žฌ. ๋˜๋Š” ํŠน์ •ํ•œ ๋ฌธ์ž(ํ† ํฐ)โญ์„ ์ด์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ๋กœ๊ทธ์ธ ์œ ์ง€๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์›น์—์„œ๋Š” ์„ธ์…˜ ํŠธ๋ž™ํ‚น(session tracking)โญ์ด๋‹ค.


๐Ÿ ๋ฌด์ƒํƒœ์—์„œ ๊ณผ๊ฑฐ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฒ•

  • ์„ธ์…˜ ํŠธ๋ž˜ํ‚น(session tracking)โญ : ๊ณผ๊ฑฐ์˜ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ ์ถ”์ ํ•˜๋Š” ๊ธฐ๋ฒ•.

  • HTTP์—์„œ ์„ธ์…˜ ํŠธ๋ž™ํ‚น์€ '์ฟ ํ‚ค(Cookie)'โญ๋ผ๋Š” ์กด์žฌ๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ์ฟ ํ‚ค๋Š” ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ์กฐ๊ฐ์œผ๋กœ ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์—์„œ ์š”์ฒญ(Request)์ด๋‚˜ ์‘๋‹ต(Response) ์‹œ์— ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  • ์ฟ ํ‚ค๋Š” ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” '์ด๋ฆ„(name)'๊ณผ '๊ฐ’(value)'์˜ ๊ตฌ์กฐ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ '์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(application)' ๋ฉ”๋‰ด๋ฅผ ์ด์šฉํ•ด์„œ ํ™•์ธ.

  • ์ฐธ๊ณ  : GOOGLE์˜ ์ฟ ํ‚ค ์‚ฌ์šฉ๋ฒ•

    • ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜๋Š” ์ž‘์€ ํ…์ŠคํŠธ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.
      ์ฟ ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ฐฉ๋ฌธ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ๋‹ค์Œ๋ฒˆ์— ์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ํ”ผํ•˜๊ณ  ๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์ดํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ๋ธŒ๋ผ์šฐ์ €, ์•ฑ ๋˜๋Š” ๊ธฐ๊ธฐ, ํ”ฝ์…€, ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž ๊ฐ™์€ ๊ธฐํƒ€ ๊ธฐ์ˆ ๋„ ์ด ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค์˜ ์‹œ๋‚˜๋ฆฌ์˜คSource: Session vs Token Authentication in 100 Seconds (YouTube)

    1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ตœ์ดˆ๋กœ ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ๋ฐœํ–‰ํ•œ ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค.

    2. ์„œ๋ฒ„์—์„œ๋Š” ์‘๋‹ต(Response) ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด์ฃผ๋Š”๋ฐ ์ด๋•Œ 'SetCookie'๋ผ๋Š” HTTP ํ—ค๋”๋ฅผ ์ด์šฉ

    3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค๋ฅผ ๋ฐ›์€ ํ›„์— ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฝ๊ณ , ์ด๋ฅผ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ณด๊ด€ํ•  ๊ฒƒ์ธ์ง€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ด ํŒ๋‹จ์€ ์ฟ ํ‚ค์— ์žˆ๋Š” "์œ ํšจ๊ธฐ๊ฐ„(๋งŒ๋ฃŒ๊ธฐ๊ฐ„)"์„ ๋ณด๊ณ  ํŒ๋‹จํ•œ๋‹ค.

    4. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด๊ด€ํ•˜๋Š” ์ฟ ํ‚ค๋Š” ๋‹ค์Œ์— ๋‹ค์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ(Request)ํ•  ๋•Œ HTTPํ—ค๋”์— 'Cookie'๋ผ๋Š” ํ—ค๋” ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌ. (์ฟ ํ‚ค์—๋Š” ๊ฒฝ๋กœ(path)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋งž๋Š” ์ฟ ํ‚ค๊ฐ€ ์ „์†ก).

    5. ์„œ๋ฒ„์—์„œ๋Š” ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด๋‚ธ ์ฟ ํ‚ค๋ฅผ ์ฝ๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


      ์ฟ ํ‚ค | ๋กœ๊ทธ์ธ

์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

  • โถ ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ฟ ํ‚ค : ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ •ํ•ด์ง„ ์ฟ ํ‚ค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋ฐœํ–‰
    • WAS๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉฐ, ํ†ฐ์ผ“์˜ ์ฟ ํ‚ค ์ด๋ฆ„์€ JSESSIONID
    • ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๋ณด๊ด€ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์„œ๋ฒ„ ๋ฐœํ–‰ ์ฟ ํ‚ค๋„ ์‚ญ์ œ ๋œ๋‹ค.
    • ์„œ๋ฒ„์—์„œ ๋ฐœํ–‰ํ•˜๋Š” ์ฟ ํ‚ค์˜ ๊ฒฝ๋กœ๋Š” /์ด๋‹ค.
  • โท ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ฟ ํ‚ค : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ฟ ํ‚ค์™€ ๋‹ค์Œ์ด ๋‹ค๋ฅด๋‹ค.
    • ์ด๋ฆ„์„ ์›ํ•˜๋Š”๋Œ€๋กœ ์ง€์ •
    • ์œ ํšจ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€์ •๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ณด๊ด€)
    • ๋ฐ˜๋“œ์‹œ ์ง์ ‘ ์‘๋‹ต(Response)์— ์ถ”๊ฐ€
    • ๊ฒฝ๋กœ๋‚˜ ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.(ํŠน์ •ํ•œ ์„œ๋ฒ„์˜ ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉ).


๐Ÿ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ์™€ ์„ธ์…˜ ์ €์žฅ์†Œ

  • ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•˜๋Š” ์ฟ ํ‚ค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐœ๋…:
    โถ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ(ServletContext)โญ โท์„ธ์…˜ ์ €์žฅ์†Œ(Session Repository)โญ

  • ํ•˜๋‚˜์˜ ์„œ๋ฒ„(ํ†ฐ์บฃ)๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์›น ํ”„๋กœ์ ํŠธ)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ค์ œ ์šด์˜์—์„œ๋„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ๋‹ค ๋ณ„๋„์˜ ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

  • ํ”„๋กœ์ ํŠธ์˜ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ '/'์™ธ์— ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๊ฐ๊ฐ ์ง€์ •ํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ†ฐ์บฃ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋œ๋‹ค.

  • ๊ฐ๊ฐ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ๋งŒ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๊ณต๊ฐ„์— ์„œ๋ธ”๋ฆฟ์ด๋‚˜ JSP ๋“ฑ์„ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ์˜์—ญ์„ ์„œ๋ธ”๋ฆฟ API์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธโญ๋ผ๊ณ  ํ•œ๋‹ค.

  • ๊ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•  ๋•Œ ํ†ฐ์บฃ์ด ๋ฐœํ–‰ํ•˜๋Š” ์ฟ ํ‚ค(๊ฐœ๋ฐœ์ž ์ƒ์„ฑ ์ฟ ํ‚ค์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ ์ฟ ํ‚คโญ๋ผ๊ณ  ํ•จ)๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•˜๋‚˜ ๋” ์ƒ์„ฑ๋˜๋Š” ๋ฐ ์ด ์˜์—ญ์ด ์„ธ์…˜ ์ €์žฅ์†Œ(Session Repository)โญ์ด๋‹ค.

    ์„ธ์…˜ ์ €์žฅ์†Œโญ๋Š” ํ‚ค(key)์™€ ๊ฐ’(value)์„ ๋ณด๊ด€ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ด ๋•Œ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ ํ‚ค๋Š” ํ†ฐ์บฃ์—์„œ JSESSIONID๋ผ๋Š” ์ฟ ํ‚ค ๊ฐ’์ด ๋œ๋‹ค.

    (๐Ÿ˜Š ์•„ํ•˜ ํ†ฐ์บฃ์—์„œ ์ž๋™ ์ƒ์…ฉ๋˜๋Š” ์„ธ์…˜ ์ฟ ํ‚ค JSESSIONID๋Š” ๋žœ๋คํ•œ ๋ฌธ์ž์—ด ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ตœ์ดˆ ์š”์ฒญ์„ ํ•˜๋ฉด ์ด ์ฟ ํ‚ค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์—๋Š” ํ•ด๋‹น JESSIONID์˜ ๊ฐ’(value)๋ฅผ ์ด๋ฆ„์œผ๋กœ ํ•˜๋Š” ํ‚ค-๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ณต๊ฐ„์ด ์ƒ๊ธฐ๋Š” ๊ตฌ๋‚˜!)
    (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ†ฐ์บฃ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋ฐ›์€ JSESSIONID ์ฟ ํ‚ค.
    ์ด JSESSIONID์˜ ๋ฐธ๋ฅ˜๊ฐ’์ด ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ‚คkey์ด์ž ๊ณต๊ฐ„์˜ ์ด๋ฆ„์œผ๋กœ ํ™œ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.)
    ์„œ๋ฒ„์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ง€๋Š” JSESSIONID ์ฟ ํ‚ค ๊ฐ’์„ ํ‚คkey๋กœ ๋ณด๊ด€ํ•œ๋‹ค.

    • ํ†ฐ์บฃ ๋‚ด๋ถ€์˜ ์„ธ์…˜ ์ €์žฅ์†Œ๋Š” ๋ฐœํ–‰๋œ ์ฟ ํ‚ค๋“ค์˜ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.
      ๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ์ฟ ํ‚ค๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ž๋ฐ”์—์„œ๋Š” GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€๋งŒ ํ†ฐ์บฃ์—์„œ๋Š” session-timeout ์„ค์ •์„ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.

    • session-timeout ์„ค์ • : ์ง€์ •๋œ ์‹œ๊ฐ„๋ณด๋‹ค ์˜ค๋ž˜๋œ ๊ฐ’๋“ค์€ ์ฃผ๊ธฐ์ ์ธ ๊ฒ€์‚ฌ๊ณผ์ •์—์„œ ์‚ญ์ œ (ํ†ฐ์บฃ ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ 30๋ถ„)

์„ธ์…˜์„ ํ†ตํ•œ ์ƒํƒœ ์œ ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • ์„ธ์…˜ ๋™์ž‘ ๋ฐฉ์‹๐Ÿ’ก

  • ์ฝ”๋“œ ์ƒ์—์„œ HttpServletRequest์˜ getSession()โญ์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด
    ํ†ฐ์บฃ์—์„œ๋Š” JSESSIONID ์ด๋ฆ„์˜ ์ฟ ํ‚ค๊ฐ€ ์š”์ฒญ(Request)ํ•  ๋•Œ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ค์–ด ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ๋ณด๊ด€ํ•œ๋‹ค.
    (๐Ÿ˜Š์ด๋ฏธ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ํ—ค๋”์— ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค.)

    • ํ•œ ์˜ˆ์‹œ๋กœ, 3๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์„ธ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ–ˆ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” 'JSESSIONID-๊ฐ’'์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์Œ์„ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ , ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์— ํ•ด๋‹น JSESSIONID ๊ฐ’์„ ๊ณต๊ฐ„ ์ด๋ฆ„์œผ๋กœ ํ•˜์—ฌ 3๊ฐœ์˜ ๊ณต๊ฐ„์„ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค.
  • ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ๋Š” JSESSIONID์˜ ๊ฐ’๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ณต๊ฐ„์€ ๋‹ค์‹œ ํ‚คkey์™€ ๊ฐ’value์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๊ณต๊ฐ„๋“ค์„ ์ด์šฉํ•ด์„œ ์„œ๋ธ”๋ฆฟ/JSP ๋“ฑ์€ ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์‚ฌ์šฉ์ž๋“ค๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    (์ถœ์ฒ˜: ์ž๋ฐ”์›น๊ฐœ๋ฐœ์›Œํฌ๋ถ 174P)

  • ๐Ÿ’ก ์„œ๋ธ”๋ฆฟ API์—์„œ๋Š” HttpServletRequest๋ฅผ ํ†ตํ•ด getSession()์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ JSESSIONID์˜ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ์ƒ์„ฑ๊ณผ ๋ณต์‚ฌ 175P


HttpServletRequest์˜ getSession( )

  • HttpServlet์˜ getSession()์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    • JSESSIONID๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ : ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ƒˆ๋กœ์šด ๋ฒˆํ˜ธ๋กœ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜. ์ƒˆ๋กœ์šด ๋ฒˆํ˜ธ๋Š” ๋ธŒ๋ผ์šฐ์ €์— JSESSIONID ๊ฐ’์œผ๋กœ ์ „์†ก
    • JSESSIONID๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ : ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ JSESSIONID๊ฐ’์„ ์ด์šฉํ•ด์„œ ํ• ๋‹น๋œ ๊ณต๊ฐ„์„ ์ฐพ๊ณ  ์ด ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • HttpServlet์˜ getSession()์˜ ๊ฒฐ๊ณผ๋ฌผ : ์„ธ์…˜ ์ €์žฅ์†Œ ๋‚ด์˜ ๊ณต๊ฐ„.

    • HttpSession ํƒ€์ž… : ์ด ๊ณต๊ฐ„์„ ์˜๋ฏธํ•˜๋Š” ํƒ€์ž…
    • ์„ธ์…˜ ์ปจํ…์ŠคํŠธ(Session Context) ํ˜น์€ ์„ธ์…˜(Session) : ์ด ๊ณต๊ฐ„ ์ž์ฒด (ํ‚ค-๋ฐธ๋ฅ˜ ์Œ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ. ํ‚ค์˜ ์˜ˆ์‹œ๋กœ๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด, ์‚ฌ์šฉ์ž ์ •๋ณด, ๊ถŒํ•œ ์ •๋ณด)

- ๋“ฑ๋กํ•  ๋•Œ, ๋กœ๊ทธ์ธ ์ฒดํฌํ•˜๊ธฐ

  • TodoRegisterController์˜ doGet() ์ˆ˜์ •

    • HttpSession session = req.getSession() : JSESSSIONID๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์„ธ์…˜ ์ €์žฅ์†Œ์— JSESSIONID์˜ ๊ฐ’์„ ์ด๋ฆ„์œผ๋กœ ํ•˜๋Š” ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ  JSESSIONID-๊ฐ’ ์Œ์˜ ์ฟ ํ‚ค๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•œ๋‹ค. ๋‹จ, JSESSIONID๊ฐ€ ๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค์— ์กด์žฌํ•  ๊ฒฝ์šฐ ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ์ด ๊ฐ’์œผ๋กœ ํ• ๋‹น๋œ ๊ณต๊ฐ„์„ ์ฐพ๊ณ  ํ•ด๋‹น ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      -> ์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด session์— ํ• ๋‹น๋˜์—ˆ๋‹ค.

    • session.isNew() : ํ•ด๋‹นํ•˜๋Š” ์„ธ์…˜์ด ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ณต๊ฐ„์ธ์ง€ ์ฒดํฌํ•œ๋‹ค.(JSESSIONID ์ฟ ํ‚ค๊ฐ€ ๊ธฐ์กด์— ์—†์—ˆ๋˜ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์ž„์„ ์ฒดํฌ)

    • session.getAttribute("loginInfo") == null : SESSIONID๋Š” ์žˆ์ง€๋งŒ ํ•ด๋‹น ์„ธ์…˜ ์ปจํ…์ŠคํŠธ์—(ใ…ก ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์„ธ์…˜ ๊ณต๊ฐ„์—) ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ•ญ๋ชฉ์˜ JSESSIONID ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ todo/register ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

    • ์ƒˆ๋กœ์šด ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋œ๋‹ค.
      (๋ฌผ๋ก  ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์—๋Š” ํ•ด๋‹น ๊ฐ’์„ ์ด๋ฆ„์œผ๋กœํ•˜๋Š” ๊ณต๊ฐ„์ด ์ƒ๊ฒผ์„ ๊ฒƒ์ด๋‹ค.)
  • ๋งŒ์•ฝ ๊ธฐ์กด์— ํ•ด๋‹น SESSIONID๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

    • ํ•ด๋‹น ์ฟ ํ‚ค์˜ ๊ฐ’์„ ์ด๋ฆ„์œผ๋กœ ํ•˜๋Š” ์„ธ์…˜ ์ €์žฅ์†Œ๋Š” ์กด์žฌํ•˜์ง€๋งŒ (!session.isNew()) ๊ทธ ์„ธ์…˜ ์ €์žฅ์†Œ์— ๋กœ๊ทธ์ธ ์ •๋ณด๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

- ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑํ•˜๊ธฐ 181

  • LoginController.java ์˜ doGet() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

  • WEB-INF/login.jsp ๋กœ ํ™”๋ฉด๋‹จ ์—ฐ๊ฒฐ

  • LoginController.java ์˜ doPost() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

      1. req.getParameter(์•„์ด๋””), req.getParameter(๋น„๋ฒˆ) ์œผ๋กœ ๋ฌธ์ž์—ด ๋งŒ๋“  ๋‹ค์Œ
      1. req.getSession() ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ์ €์žฅ์†Œ ์ตœ์ดˆ ์ƒ์„ฑํ•˜๋ฉฐ
        ํ•ด๋‹น HttpSession ๊ฐ์ฒด๋กœ setAttribute("๋กœ๊ทธ์ธ ์ •๋ณด", ๋กœ๊ทธ์ธ ์ •๋ณด ๋ฌธ์ž์—ด)๋ฅผ ํ•˜์—ฌ ์„ธ์…˜ ์ €์žฅ์†Œ์— ํ‚ค-๊ฐ’ ์ €์žฅ.
      1. todo/list.jsp๋กœ sendRedirectํ•  ๋•Œ JSESSIONID์ฟ ํ‚ค ์ •๋ณด๊ฐ€ ์ „์†ก๋  ๊ฒƒ์ด๋‹ค.
      1. ์ด์ œ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์™€ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ TodoRegisterController์˜ doGet()์„ ํ†ตํ•ด resp.sendRedirect("/login")์— ๋Œ€ํ•œ ๋ทฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

- ํ•„ํ„ฐ๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ์ฒดํฌ 184

  • ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ๋™์ผํ•˜๊ฒŒ ์ฒดํฌ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋ฉด ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ๋น„ํšจ์œจ์ ์ด๋‹ค.
    โžก๏ธ @WebFilter๋กœ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. (์›น MVC ํŒจํ„ด์—์„œ)

    • @WebFilterโญ : ํŠน์ • ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ๋•Œ ํ•„ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

      ํ•„ํ„ฐ๋Š” ํ•œ ๊ฐœ ์ด์ƒ, ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • Servlet 3.0 ์ด์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      ํ†ฐ์บฃ 7์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • filter.LoginCheckFilter.java ์ƒ์„ฑ

- UTF-8 ์ฒ˜๋ฆฌ ํ•„ํ„ฐ 188

  • filter.UTF8Filter

- ์„ธ์…˜์„ ์ด์šฉํ•˜๋Š” ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ 189

  • controller.LoginController.java

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํšŒ์› ์ •๋ณด ์ด์šฉํ•˜๊ธฐ 191

  • webdb์— tbl_member ํ…Œ์ด๋ธ” ์ƒ์„ฑ.

- ์ž๋ฐ”์—์„œ ํšŒ์› ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ 192

  • domain.MemberVO.java ์ž‘์„ฑ

  • dao.MemberDAO.java ์ž‘์„ฑ

    • Member getWithPassword(String mid, String mpw) : API ๊ณ„์ธต์—์„œ ๋ฐ›์•„์˜จ mid์™€ mpw๋กœ ์ฟผ๋ฆฌ ์กฐ์ž‘ํ•˜์—ฌ DB์—์„œ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ ResultSet์—์„œ MemberVO๋ฅผ ๋นŒ๋” ํŒจํ„ด์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์‹œ ๋ฆฌํ„ดํ•œ๋‹ค.
  • dto.MemberDTO.java ์ž‘์„ฑ : ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•  DTO

  • service.MemberService ์ž‘์„ฑ : MemberDTO๋ฅผ ์‚ฌ์šฉ, DAO์™€ ModelMapper ๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
    enum์„ ์ด์šฉํ•œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ MemberService ํด๋ž˜์Šค ์ž‘์„ฑ

    • MemberDTO login(String mid, String mpw) throws Exception : dao ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ•ด๋‹นํ•˜๋Š” MemberVO๋ฅผ DB์—์„œ ์–ป์–ด์˜ค๊ณ  modelMapper.map์„ ํ†ตํ•ด VO -> DTO ์ž‘์—…ํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” memberDTO ์ž‘์„ฑ

- ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ์—ฐ๋™ 196

  • controller.LoginController.java ์—์„œ doPost()๋ฉ”์„œ๋“œ๊ฐ€ MemberService๋ฅผ ์—ฐ๋™ํ•ด ์‹ค์ œ๋กœ ๋กœ๊ทธ์ธ ๋˜๋„๋ก ์ฝ”๋“œ ์ž‘์„ฑ
    • ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ์ธ ๋œ ๊ฒฝ์šฐ HttpSession์„ ์ด์šฉํ•ด์„œ 'loginInfo' ์ด๋ฆ„์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ €์žฅ
    • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ /login์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ?result=error ์ „์†ก

EL์—์„œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์ฒ˜๋ฆฌ

  • /WEB-INF/login.jsp์—๋Š” EL์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” param์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ result๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • login.jsp๋Š” JSTL์„ ์ด์šฉํ•ด ${param.result}๊ฐ€ error๋ผ๋ฉด ๋‹ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ์ถœ๋ ฅํ•œ๋‹ค.

- EL์˜ Scope์—์„œ HttpSession์ ‘๊ทผํ•˜๊ธฐ

  • EL์„ ์ด์šฉํ•ด์„œ HttpServletRequest์— setAttribute()๋กœ ์ €์žฅํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    EL์€ ์Šค์ฝ”ํ”„๋ผ๋Š” ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ,
    Page Scope, Request Scope, Session Scope, Application Scope๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ ${์–ด์ฉŒ๊ตฌ}์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋‚˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
    • ์˜ˆ์ œ์—์„œ๋Š” HttpSession์„ ์ด์šฉํ•ด์„œ loginInfo๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ MemberDTO๋ฅผ ์ €์žฅํ–ˆ๋Š”๋ฐ, ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ${loginInfo}๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋‹ค. (๐Ÿ˜Š์ด์ „์—๋Š” ์„ธ์…˜์ด ์•„๋‹Œ HttpServletRequest ๊ฐ์ฒด์— ์ €์žฅ์„ ํ–ˆ์—ˆ์ฃ .)



๐Ÿšฉ 3.2. ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค(Cookie)

  • โญ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค์™€ WAS์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฟ ํ‚ค(์„ธ์…˜ ์ฟ ํ‚ค)์˜ ์ฐจ์ด : ์ž๋ฐ”์›น๊ฐœ๋ฐœ์›Œํฌ๋ถ 200p

  • ์‚ฌ์šฉ์ž ์ •์˜ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” newCookie()๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๋•Œ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ž์—ด๋กœ ๋œ ์ด๋ฆ„(name)๊ณผ ๊ฐ’(value)๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ฐ’(value)์€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ URLEncoding๋œ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. (ํ•œ๊ธ€ ์ €์žฅ ๋ถˆ๊ฐ€)

์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด๋ฅผ ์˜ค๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค.

  • ์˜ค๋žœ ์‹œ๊ฐ„ ๋ณด๊ด€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์„œ๋ฒ„์— ๋ณด๊ด€ํ•˜๊ณ ,
    ์•ฝ๊ฐ„์˜ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ฟ ํ‚ค์— ๋ณด๊ด€ํ•œ๋‹ค.

    • '์˜ค๋Š˜ ํ•˜๋ฃจ ์ด ์ฐฝ ์—ด์ง€ ์•Š๊ธฐ', '์ตœ๊ทผ ๋ณธ ์ƒํ’ˆ ๋ชฉ๋ก'
    • ๋ชจ๋ฐ”์ผ์—์„œ์˜ '์ž๋™ ๋กœ๊ทธ์ธ'

- ์กฐํšŒํ•œ Todo ํ™•์ธํ•˜๊ธฐ 201

  • Todo ๋ชฉ๋ก์—์„œ ์กฐํšŒํ–ˆ๋˜ Todo ๋ฒˆํ˜ธ(tno)๋“ค์„ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ „์†ก๋œ ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ (์„œ๋ฒ„์—์„œ) ํ™•์ธ - ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ฟ ํ‚ค์˜ ๊ฐ’(value)์„ ํ™œ์šฉํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑ
    • ์ฟ ํ‚ค ์ด๋ฆ„์€ 'viewTodos'
    • ๋ฌธ์ž์—ด ๋‚ด์— ํ˜„์žฌ Todo์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์—ฐ๊ฒฐ
    • '3-4-5' ๊ฐ™์€ ํ˜•ํƒœ. ์ด๋ฏธ ์กฐํšŒํ•œ ๋ฒˆํ˜ธ๋Š” ์ถ”๊ฐ€X
    • ์ฟ ํ‚ค์˜ ์œ ํšจ๊ธฐ๊ฐ„ 24์‹œ๊ฐ„์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์ฟ ํ‚ค๋ฅผ ๋‹ด์•„์„œ ์ „์†ก
  • controller.TodoReadController.java์— ๋‹ค์Œ ์ฝ”๋“œ ์ถ”๊ฐ€

    • ํ˜„์žฌ ์š”์ฒญ(Request)์— ์žˆ๋Š” ๋ชจ๋“  ์ฟ ํ‚ค ์ค‘์— ์กฐํšŒ ๋ชฉ๋ก ์ฟ ํ‚ค(viewTodos)๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋ฉ”์†Œ๋“œ
    • ํŠน์ •ํ•œ tno๊ฐ€ ์ฟ ํ‚ค์˜ ๋‚ด์šฉ๋ฌผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ
  • doGet()์—์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„ 'viewTodos' ์ด๋ฆ„์˜ ์ฟ ํ‚ค๋ฅผ ์ฐพ๊ณ (findCookie()), ์ฟ ํ‚ค์˜ ๋‚ด์šฉ๋ฌผ์„ ๊ฒ€์‚ฌํ•œ ํ›„์— ์กฐํšŒํ•œ ์  ์—†๋Š” ๋ฒˆํ˜ธ๋ผ๋ฉด ์ฟ ํ‚ค์˜ ๋‚ด์šฉ๋ฌผ์„ ๊ฐฑ์‹ ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ.

  • โญ์ฟ ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ๋‹ค์‹œ ๊ฒฝ๋กœ๋‚˜ ์œ ํšจ์‹œ๊ฐ„์„ ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค.


- ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ๊ฐ™์ด ํ™œ์šฉํ•˜๊ธฐ 204

  • ํ˜„์žฌ /todo/..๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๋‹ค.

  • ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ ์ž๋™๋กœ๊ทธ์ธ 'remember-me'๋ฅผ ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • ์ฟ ํ‚ค ์ด์šฉ ์ž๋™ ๋กœ๊ทธ์ธ : ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์— ๋ณด๊ด€ํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ HttpSession์— ๋‹ด๋Š” ๋ฐฉ์‹

      ๋‹จ, ์‚ฌ์‹ค ์ œ๋Œ€๋กœ remember-me๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์‹œํ๋ฆฌํ‹ฐ์˜ ๊ฐœ๋…์ด ํ•„์š”ํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์•„์ด๋””์–ด๋งŒ.

์ž๋™๋กœ๊ทธ์ธ ์ค€๋น„

  • ์ž๋™๋กœ๊ทธ์ธ์„ ์œ„ํ•ด์„œ๋Š” โถ์ฟ ํ‚ค์— ์–ด๋–ค ๊ฐ’์„ ๋ณด๊ด€ํ•  ๊ฒƒ์ธ์ง€ โท์œ ํšจ์‹œ๊ฐ„์€ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ณ ๋ ค

  • ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹

    • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ ์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ DB์— ๋ณด๊ด€
    • ์ฟ ํ‚ค์—๋Š” ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๊ฐ’์œผ๋กœ ์‚ผ๊ณ  ์œ ํšจ๊ธฐ๊ฐ„์€ 1์ฃผ์ผ๋กœ ์ง€์ •
  • ๋กœ๊ทธ์ธ ์ฒดํฌ ๊ตฌํ˜„ ๋ฐฉ์‹

    • ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ HttpSession์— ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๋ฅผ ํ™•์ธ
    • ์ฟ ํ‚ค์˜ ๊ฐ’๊ณผ DB๋ฅผ ๋น„๊ตํ•˜๊ณ  ๊ฐ™๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฝ์–ด์™€์„œ HttpSession์— ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”๊ฐ€
  • ์ฟ ํ‚ค์™€ ๊ฐ’์„ ํƒˆ์ทจ๋‹นํ•˜๋Š” ๋ฆฌ์Šคํฌ๋ฅผ ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฟ ํ‚ค์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

    ์—ฌ๊ธฐ์„œ๋Š” ์šฐ์„  UUID๋ฅผ ์ด์šฉํ•œ ์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ์ด์šฉํ•œ๋‹ค. UUID(universally unique identifier)โญ๋Š” ๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ๋žœ๋ค์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (์ž๋ฐ” java.util ํŒจํ‚ค์ง€)

  • tbl_member ํ…Œ์ด๋ธ”์— ์ž„์˜์˜ ๋ฌธ์ž์—ด ๋ณด๊ด€์„ ์œ„ํ•œ uuid ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    alter table tbl_member add column uuid varchar(50)


- ์ž๋™ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ 205

  • login.jsp : ์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ์ฒดํฌ๋ฐ•์Šค ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์„ฑ (name ="auto")

  • LoginController.java์˜ doPost()์—์„œ๋Š” 'auto' ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ boolean ๊ฐ’์— ๋‹ด์•„ ํ•ด๋‹น boolean์ด true์ด๋ฉด java.util์˜ UUID๋ฅผ ์ด์šฉํ•ด์„œ ์ž„์˜์˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ
    String uuid = UUID.randomUUID().toString()

  • MemberVO, MemberDTO์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์—ด uuid ๋ฐ˜์˜

  • MemberDAO์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ž‘์„ฑ : rememberMe๊ฐ€ true๋ผ๋ฉด tbl_member ํ…Œ์ด๋ธ”์— ์‚ฌ์šฉ์ž ์ •๋ณด์— uuid๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ•œ๋‹ค.

    • public void updateUuid(String mid, String uuid) : rememberMe๊ฐ€ true์ด๋ฉด tbl_member ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
  • MemberService์—๋„ ์—ฐ๊ฒฐ ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

    • public void updateUuid(String mid, String uuid)
      : ๋‚ด์šฉ์€ dao.updateUuid(mid, uuid)
  • LoginController์˜ doPost()์—๋Š” ๋กœ๊ทธ์ธ ํ›„์— ๋ฐ˜์˜


์ฟ ํ‚ค ์ƒ์„ฑ ๋ฐ ์ „์†ก 209

  • ์ฟ ํ‚ค์— ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์— remember-me ์ด๋ฆ„์˜ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ „์†ก

์ฟ ํ‚ค์˜ ๊ฐ’์„ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ์กฐํšŒ 210

  • ์ฟ ํ‚ค ์•ˆ์— UUID๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค๋ฉด (remember-me)์ฟ ํ‚ค์˜ ๊ฐ’์„ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋กœ๋”ฉํ•ด ์˜ค๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•˜๋‹ค.

  • MemberDAO์— public MemberVO selectUUID(String uuid) ์ถ”๊ฐ€

    • DB์—์„œ uuid๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์™€์„œ builder ํŒจํ„ด์œผ๋กœ VO ์ƒ์„ฑํ•˜์—ฌ DTO์— ๋ฐ˜ํ™˜
  • MemberService์—๋„ public MemberDTO getByUUID(String uuid) ์ž‘์„ฑ

    • dao์—์„œ uuid๋กœ ์–ป์–ด์˜จ VO ๊ฐ์ฒด๋Š” ์ด ๋ฉ”์„œ๋“œ์—์„œ DTO๋กœ ๋‹ค์‹œ ๋งคํ•‘๋˜์–ด ๋ฆฌํ„ด๋œ๋‹ค.

LoginCheckFilter์—์„œ์˜ ์ฟ ํ‚ค ์ฒดํฌ

  • ์ด์ „ LoginCheckFilter.java ํด๋ž˜์Šค์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ :
    โถHttpSession์— loginInfo๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ

  • ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๊ธฐ๋Šฅ:
    โท HttpSession์—๋Š” ์—†๊ณ , ์ฟ ํ‚ค์— UUID ๊ฐ’๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ

  • ๋กœ๊ทธ์ธ ์ฒดํฌ ์ „์ฒด ์ง„ํ–‰๊ณผ์ •

    1. HttpServletRequest๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ์ฟ ํ‚ค ์ค‘์—์„œ remember-me์ด๋ฆ„์˜ ์ฟ ํ‚ค ๊ฒ€์ƒ‰

    2. ํ•ด๋‹น ์ฟ ํ‚ค์˜ value(UUID) ์ด์šฉํ•ด์„œ MemberService๋ฅผ ํ†ตํ•ด MemberDTO ๊ตฌ์„ฑ

    3. HttpSession์„ ์ด์šฉํ•ด์„œ 'loginInfo'๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ MemberDTO๋ฅผ setAttribute()

    4. ์ •์ƒ์ ์œผ๋กœ FilterChain์˜ doFilter() ์ˆ˜ํ–‰

  • LoginCheckFilter์— ์ฝ”๋“œ ๊ฐœ์„  ์ ์šฉ ์ดํ›„ ๊ฒฐ๊ณผ

    • HttpSession ๋‚ด์— loginInfo๋กœ ์ €์žฅ๋œ ๊ฐ์ฒด๋„ ์—†๊ณ , remember-me ์ฟ ํ‚ค์—๋„ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํ™ฉ : ๋กœ๊ทธ์ธ ๊ฒฝ๋กœ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌ

    • HttpSession์—๋Š” ์—†์ง€๋งŒ ์ฟ ํ‚ค๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ:
      DB์— uuid๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋œ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ
  • ๋‹จ, ์ฃผ๊ธฐ์ ์œผ๋กœ UUID ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์„ ์ ์šฉํ•ด์„œ ๋” ์•ˆ์ „ํ•œ ์ž๋™ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ.



๐Ÿšฉ 3.3. ๋ฆฌ์Šค๋„ˆ(Listener)

  • ์Šคํ”„๋ง MVC๋Š” ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ†ตํ•ด์„œ ๋™์ž‘ํ•œ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ API์˜ ๋ฆฌ์Šค๋„ˆ(Listener)โญ
    : ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ(Event)๋ผ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

๐Ÿ ๋ฆฌ์Šค๋„ˆ์˜ ๊ฐœ๋…๊ณผ ์šฉ๋„ 215

  • ์–ด๋–ค ์ž‘์—…์˜ ์˜ํ–ฅ์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์ด ๊ฐ™์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • ex) ํ˜„์žฌ ์„œ๋ฒ„์— ์ ‘์†ํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ IP๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์˜ต์ €๋ฒ„(observer) ํŒจํ„ดโญ :
    ํŠน์ •ํ•œ ๋ณ€ํ™”๋ฅผ '๊ตฌ๋…(subscribe)'ํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒ(๋ฐœํ–‰, publish)ํ•˜๋ฉด ๊ตฌ๋… ๊ฐ์ฒด๋ฅผ ์‹คํ–‰

    • ex) ์žฌ๋‚œ ๊ฐ์‹œ ์‹œ์Šคํ…œ
  • ์„œ๋ธ”๋ฆฟ API๋Š” ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ(Event)์— ๋งž๋Š” ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•ด ๋‘์—ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ํ•ด๋‹น ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๋•Œ ํŠน์ •ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰
    • HttpSession์˜ ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ์‹œ์™€ ์ฒ˜๋ฆฌ
    • HttpServletRequest์— ํŠน์ •ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ์‹œ์™€ ์ฒ˜๋ฆฌ

ServletContextListener 216

  • ServletContextListenerโญ: ์–ด๋–ค ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹คํ–‰๋˜์ž๋งˆ์ž ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌ
    • ๋ฆฌ์Šค๋„ˆ ํด๋ž˜์Šค์— @WebListener ์• ๋„ˆํ…Œ์ด์…˜ ๋ถ™์ž„.
    • ServletContextListenr ๊ตฌํ˜„
    • void contextInitialized(ServletContextEvent sce) ์™€
      void contextDestroyed(ServletContextEvent sce)์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„

ServletContextEvent์™€ ServletContext 217

  • contextInitailized()์™€ contextDestroyed()์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํŠน๋ณ„ ๊ฐ์ฒด์ธ ServletContextEvent๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

  • ServletContextEventโญ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ˜„์žฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๊ณต๊ฐ„์ธ ServletContext์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ServletContext์—๋„ Http์š”์ฒญ๊ฐ์ฒด๋‚˜ Http์„ธ์…˜ ๊ฐ์ฒด ๋“ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋– ํ•œ ์†์„ฑ์„ ํ‚ค-๋ฐธ๋ฅ˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ServletContext์— ์ €์žฅ๋˜๋Š” ๊ฐ์ฒด๋Š” ์„œ๋ธ”๋ฆฟ JSP/EL์— ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      (๐Ÿ˜Š์ „์—ญ๋ณ€์ˆ˜ ๋Š๋‚Œ)

  • HttpServletRequest์—๋Š” getServletContext() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ServletContext๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ServletContextListener์™€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

  • ServletContextListener์™€ ServletContext๋ฅผ ์ด์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ์ค€๋น„ํ•˜๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์˜ˆ) ์ปค๋„ฅ์…˜ ํ’€ ์ดˆ๊ธฐํ™” / TodoService์™€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ enum์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ๋ณด๊ด€ ๋“ฑ
  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์›น ํ”„๋กœ์ ํŠธ์—์„œ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ServletContextListener๋ฅผ ์ด์šฉํ•œ๋‹ค.


- ์„ธ์…˜ ๊ด€๋ จ ๋ฆฌ์Šค๋„ˆ

  • ์„œ๋ธ”๋ฆฟ์˜ ๋ฆฌ์Šค๋„ˆ ์ค‘์—์„œ HttpSession ๊ด€๋ จ ์ž‘์—…์„ ๊ฐ์‹œํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
    • HttpSessionListner๋‚˜ HttpSessionAttributeListener๋ฅผ ์ด์šฉํ•ด์„œ HttpSession์ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ setAttribute()๋“ฑ์˜ ์ž‘์—…์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ ์ด๋ฅผ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ฐ์‹œํ•˜์—ฌ ์ด ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.)
  1. HttpSessionAttributeListener๋ฅผ ๊ตฌํ˜„ ํ•œ๋‹ค.

  2. ํด๋ž˜์Šค๋ ˆ๋ฒจ์— @WebListener ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

  3. attributedAdded(), attributedRemoved(), attributedReplaced()๋ฅผ ์ด์šฉํ•ด์„œ HttpSession์— setAttributed()๋‚˜ removeAttribute() ๋“ฑ์˜ ์ž‘์—…์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ด ๋ฉ”์„œ๋“œ๋“ค์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ธ์ž๋กœ HttpSessionBindingEvent ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ ์ด ๊ฐ์ฒด์˜ getName()๊ณผ getValue()๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€/์‚ญ์ œ๋œ ์†์„ฑ์˜ ํ‚ค-๋ฐธ๋ฅ˜ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
profile
9์—์„œ 0์œผ๋กœ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

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