์น์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณผ๊ฑฐ์ ์ํ๋ฅผ ์ ์งํ์ง ์๋ ๋ฌด์ํ(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)
- ๋ธ๋ผ์ฐ์ ์์ ์ต์ด๋ก ์๋ฒ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ํด๋น ์๋ฒ์์ ๋ฐํํ ์ฟ ํค๊ฐ ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋ฌด๊ฒ๋ ์ ์กํ์ง ์๋๋ค.
- ์๋ฒ์์๋ ์๋ต(Response) ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ฟ ํค๋ฅผ ๋ณด๋ด์ฃผ๋๋ฐ ์ด๋ 'SetCookie'๋ผ๋ HTTP ํค๋๋ฅผ ์ด์ฉ
- ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค๋ฅผ ๋ฐ์ ํ์ ์ด์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ๊ณ , ์ด๋ฅผ ํ์ผ ํํ๋ก ๋ณด๊ดํ ๊ฒ์ธ์ง ๋ฉ๋ชจ๋ฆฌ์์์๋ง ์ฒ๋ฆฌํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด ํ๋จ์ ์ฟ ํค์ ์๋ "์ ํจ๊ธฐ๊ฐ(๋ง๋ฃ๊ธฐ๊ฐ)"์ ๋ณด๊ณ ํ๋จํ๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๊ดํ๋ ์ฟ ํค๋ ๋ค์์ ๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์์ฒญ(Request)ํ ๋ HTTPํค๋์ 'Cookie'๋ผ๋ ํค๋ ์ด๋ฆ๊ณผ ํจ๊ป ์ ๋ฌ. (์ฟ ํค์๋ ๊ฒฝ๋ก(path)๋ฅผ ์ง์ ํ ์ ์์ด์ ํด๋น ๊ฒฝ๋ก์ ๋ง๋ ์ฟ ํค๊ฐ ์ ์ก).
- ์๋ฒ์์๋ ํ์์ ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ธ ์ฟ ํค๋ฅผ ์ฝ๊ณ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
์ฟ ํค | ๋ก๊ทธ์ธ
- 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์ ๊ณต๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
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()
) ๊ทธ ์ธ์ ์ ์ฅ์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ค.
LoginController.java
์ doGet()
์ค๋ฒ๋ผ์ด๋ฉ
WEB-INF/login.jsp
๋ก ํ๋ฉด๋จ ์ฐ๊ฒฐ
LoginController.java
์ doPost()
์ค๋ฒ๋ผ์ด๋ฉ
req.getParameter(์์ด๋)
,req.getParameter(๋น๋ฒ)
์ผ๋ก ๋ฌธ์์ด ๋ง๋ ๋ค์
req.getSession()
์ฌ์ฉํ์ฌ ์ธ์ ์ ์ฅ์ ์ต์ด ์์ฑํ๋ฉฐ
ํด๋น HttpSession ๊ฐ์ฒด๋กsetAttribute("๋ก๊ทธ์ธ ์ ๋ณด", ๋ก๊ทธ์ธ ์ ๋ณด ๋ฌธ์์ด)
๋ฅผ ํ์ฌ ์ธ์ ์ ์ฅ์์ ํค-๊ฐ ์ ์ฅ.
todo/list.jsp
๋กsendRedirect
ํ ๋JSESSIONID
์ฟ ํค ์ ๋ณด๊ฐ ์ ์ก๋ ๊ฒ์ด๋ค.
- ์ด์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ์ธ์ ์ ์ฅ์๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํ๋ฏ๋ก
TodoRegisterController
์doGet()
์ ํตํดresp.sendRedirect("/login")
์ ๋ํ ๋ทฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์ปจํธ๋กค๋ฌ๋ง๋ค ๋์ผํ๊ฒ ์ฒดํฌ ๋ก์ง์ ์์ฑํ๋ฉด ์ฝ๋์ ์ค๋ณต์ด ๋ฐ์ํ๋ฉฐ, ๋นํจ์จ์ ์ด๋ค.
โก๏ธ @WebFilter
๋ก ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ค. (์น MVC ํจํด์์)
- @WebFilterโญ : ํน์ ๊ฒฝ๋ก์ ์ ๊ทผํ ๋ ํํฐ๊ฐ ๋์ํ๋๋ก ์ค๊ณํ ์ ์๋ค.
ํํฐ๋ ํ ๊ฐ ์ด์, ์ฌ๋ฌ ๊ฐ๋ฅผ ์ ์ฉํ ์ ์์ด์ ์ฌ๋ฌ ๊ฐ์ ํํฐ๋ฅผ ์ ์ฉํ ์๋ ์๋ค.- Servlet 3.0 ์ด์ ์ฌ์ฉ ๊ฐ๋ฅ
ํฐ์บฃ 7์ด์์์ ์ฌ์ฉ ๊ฐ๋ฅ
filter.LoginCheckFilter.java
์์ฑ
filter.UTF8Filter
controller.LoginController.java
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 ์์ฑ
controller.LoginController.java
์์ doPost()
๋ฉ์๋๊ฐ MemberService๋ฅผ ์ฐ๋ํด ์ค์ ๋ก ๋ก๊ทธ์ธ ๋๋๋ก ์ฝ๋ ์์ฑ
- ์ ์์ ์ผ๋ก ๋ก๊ทธ์ธ ๋ ๊ฒฝ์ฐ HttpSession์ ์ด์ฉํด์ 'loginInfo' ์ด๋ฆ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ ์ฅ
- ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
/login
์ผ๋ก ์ด๋ํ๋ฉฐ ํด๋ผ์ด์ธํธ์๊ฒ ํด๋น ์ ๋ณด๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ก?result=error
์ ์ก
/WEB-INF/login.jsp
์๋ EL์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ param์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ result๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ๋ฌํ ๊ฐ์ ํ์ธํ ์ ์๋ค.
login.jsp
๋ JSTL์ ์ด์ฉํด${param.result}
๊ฐ error๋ผ๋ฉด ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ์ถ๋ ฅํ๋ค.
Page Scope
, Request Scope
, Session Scope
, Application Scope
๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ฉฐ ${์ด์ฉ๊ตฌ}
์ ํด๋นํ๋ ๊ฐ์ฒด๋ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- ์์ ์์๋
HttpSession
์ ์ด์ฉํด์loginInfo
๋ผ๋ ์ด๋ฆ์ผ๋ก MemberDTO๋ฅผ ์ ์ฅํ๋๋ฐ, ์ด์ ๊ณผ ๋์ผํ๊ฒ${loginInfo}
๋ฅผ ์ฌ์ฉํด ์ ๊ทผํ ์ ์๋ค. (๐์ด์ ์๋ ์ธ์ ์ด ์๋ HttpServletRequest ๊ฐ์ฒด์ ์ ์ฅ์ ํ์์ฃ .)
โญ์ฌ์ฉ์ ์ ์ ์ฟ ํค์ WAS์์ ๋ฐ์ํ๋ ์ฟ ํค(์ธ์ ์ฟ ํค)์ ์ฐจ์ด : ์๋ฐ์น๊ฐ๋ฐ์ํฌ๋ถ 200p
์ฌ์ฉ์ ์ ์ ์ฟ ํค๋ฅผ ์์ฑํ ๋๋ newCookie()
๋ฅผ ์ด์ฉํด์ ์์ฑํ๋ค. ์ด ๋ ๋ฐ๋์ ๋ฌธ์์ด๋ก ๋ ์ด๋ฆ(name)๊ณผ ๊ฐ(value)๊ฐ ํ์ํ๋ค. ๊ฐ(value)์ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด๋ก ์ ์ฅ์ด ๋ถ๊ฐ๋ฅํ์ฌ URLEncoding๋ ๋ฌธ์์ด๋ก ์ง์ ํด์ผ ํ๋ค. (ํ๊ธ ์ ์ฅ ๋ถ๊ฐ)
์ฟ ํค๋ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด๋ฅผ ์ค๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ๋ค.
์ค๋ ์๊ฐ ๋ณด๊ดํ๋ ๋ฐ์ดํฐ๋ ํญ์ ์๋ฒ์ ๋ณด๊ดํ๊ณ ,
์ฝ๊ฐ์ ํธ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ ์ฟ ํค์ ๋ณด๊ดํ๋ค.
- '์ค๋ ํ๋ฃจ ์ด ์ฐฝ ์ด์ง ์๊ธฐ', '์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก'
- ๋ชจ๋ฐ์ผ์์์ '์๋ ๋ก๊ทธ์ธ'
Todo ๋ชฉ๋ก์์ ์กฐํํ๋ Todo ๋ฒํธ(tno)๋ค์ ์ฟ ํค๋ฅผ ์ด์ฉํด์ ๋ณด๊ดํ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์ ์ก๋ ์ฟ ํค๊ฐ ์๋์ง (์๋ฒ์์) ํ์ธ - ์๋ค๋ฉด ํด๋น ์ฟ ํค์ ๊ฐ(value)์ ํ์ฉํ๊ณ ์๋ค๋ฉด ์๋ก์ด ๋ฌธ์์ด์ ์์ฑ
- ์ฟ ํค ์ด๋ฆ์ 'viewTodos'
- ๋ฌธ์์ด ๋ด์ ํ์ฌ Todo์ ๋ฒํธ๋ฅผ ๋ฌธ์์ด๋ก ์ฐ๊ฒฐ
- '3-4-5' ๊ฐ์ ํํ. ์ด๋ฏธ ์กฐํํ ๋ฒํธ๋ ์ถ๊ฐX
- ์ฟ ํค์ ์ ํจ๊ธฐ๊ฐ 24์๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ฟ ํค๋ฅผ ๋ด์์ ์ ์ก
controller.TodoReadController.java
์ ๋ค์ ์ฝ๋ ์ถ๊ฐ
- ํ์ฌ ์์ฒญ(Request)์ ์๋ ๋ชจ๋ ์ฟ ํค ์ค์ ์กฐํ ๋ชฉ๋ก ์ฟ ํค(viewTodos)๋ฅผ ์ฐพ์๋ด๋ ๋ฉ์๋
- ํน์ ํ tno๊ฐ ์ฟ ํค์ ๋ด์ฉ๋ฌผ์ด ์๋์ง ํ์ธํ๋ ์ฝ๋
doGet()
์์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ 'viewTodos' ์ด๋ฆ์ ์ฟ ํค๋ฅผ ์ฐพ๊ณ (findCookie()
), ์ฟ ํค์ ๋ด์ฉ๋ฌผ์ ๊ฒ์ฌํ ํ์ ์กฐํํ ์ ์๋ ๋ฒํธ๋ผ๋ฉด ์ฟ ํค์ ๋ด์ฉ๋ฌผ์ ๊ฐฑ์ ํด์ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ.
โญ์ฟ ํค๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๋ค์ ๊ฒฝ๋ก๋ ์ ํจ์๊ฐ์ ์ธํ ํด์ผ ํ๋ค.
ํ์ฌ /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)
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()์๋ ๋ก๊ทธ์ธ ํ์ ๋ฐ์
์ฟ ํค ์์ 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.java
ํด๋์ค์ ๊ตฌํ๋ ๊ธฐ๋ฅ :
โถHttpSession
์ loginInfo
๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๊ฒ์ธ์ง ํ์ธํ๋ ๊ธฐ๋ฅ
์๋กญ๊ฒ ์ถ๊ฐํด์ผํ ๊ธฐ๋ฅ:
โท HttpSession์๋ ์๊ณ , ์ฟ ํค์ UUID ๊ฐ๋ง ์๋ ๊ฒฝ์ฐ
๋ก๊ทธ์ธ ์ฒดํฌ ์ ์ฒด ์งํ๊ณผ์
- HttpServletRequest๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ์ฟ ํค ์ค์์
remember-me
์ด๋ฆ์ ์ฟ ํค ๊ฒ์
- ํด๋น ์ฟ ํค์ value(UUID) ์ด์ฉํด์ MemberService๋ฅผ ํตํด MemberDTO ๊ตฌ์ฑ
- HttpSession์ ์ด์ฉํด์ 'loginInfo'๋ผ๋ ์ด๋ฆ์ผ๋ก MemberDTO๋ฅผ
setAttribute()
- ์ ์์ ์ผ๋ก FilterChain์
doFilter()
์ํ
LoginCheckFilter์ ์ฝ๋ ๊ฐ์ ์ ์ฉ ์ดํ ๊ฒฐ๊ณผ
- HttpSession ๋ด์ loginInfo๋ก ์ ์ฅ๋ ๊ฐ์ฒด๋ ์๊ณ , remember-me ์ฟ ํค์๋ ์๋ฌด๊ฒ๋ ์๋ ์ํฉ : ๋ก๊ทธ์ธ ๊ฒฝ๋ก๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ฒ๋ฆฌ
- HttpSession์๋ ์์ง๋ง ์ฟ ํค๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ:
DB์ uuid๊ฐ ์กด์ฌํ๊ณ ์ฟ ํค๊ฐ ์ ์ก๋๋ค๋ฉด ์ ์์ ์ผ๋ก ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
๋จ, ์ฃผ๊ธฐ์ ์ผ๋ก UUID ๊ฐ์ ๋ฐ๊พธ๋ ๋ฐฉ์์ ์ ์ฉํด์ ๋ ์์ ํ ์๋ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํจ.
์ด๋ค ์์ ์ ์ํฅ์ผ๋ก ๋ค๋ฅธ ์์ ์ด ๊ฐ์ด ์คํ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ๋ค.
- ex) ํ์ฌ ์๋ฒ์ ์ ์ํ ๋ชจ๋ ์ฌ์ฉ์์ IP๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ
์ต์ ๋ฒ(observer) ํจํดโญ :
ํน์ ํ ๋ณํ๋ฅผ '๊ตฌ๋
(subscribe)'ํ๋ ๊ฐ์ฒด๋ค์ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ ๋ณํ๊ฐ ๋ฐ์(๋ฐํ, publish)ํ๋ฉด ๊ตฌ๋
๊ฐ์ฒด๋ฅผ ์คํ
- ex) ์ฌ๋ ๊ฐ์ ์์คํ
์๋ธ๋ฆฟ API๋ ์ฌ๋ฌ ์ด๋ฒคํธ(Event)์ ๋ง๋ ๋ฆฌ์ค๋๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ํด ๋์๋ค. ์ด๋ฅผ ์ด์ฉํด์ ๋ค์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ํด๋น ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๊ฑฐ๋ ์ข ๋ฃ๋ ๋ ํน์ ํ ์์ ์ ์ํ
- HttpSession์ ํน์ ์์ ์ ๋ํ ๊ฐ์์ ์ฒ๋ฆฌ
- HttpServletRequest์ ํน์ ํ ์์ ์ ๋ํ ๊ฐ์์ ์ฒ๋ฆฌ
- ๋ฆฌ์ค๋ ํด๋์ค์
@WebListener
์ ๋ํ ์ด์ ๋ถ์.ServletContextListenr
๊ตฌํvoid contextInitialized(ServletContextEvent sce)
์
void contextDestroyed(ServletContextEvent sce)
์ ์ถ์๋ฉ์๋๋ฅผ ๊ตฌํ
contextInitailized()์ contextDestroyed()์ ํ๋ผ๋ฏธํฐ๋ก ํน๋ณ ๊ฐ์ฒด์ธ ServletContextEvent๋ผ๋ ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋๋ค.
ServletContextEventโญ๋ฅผ ์ด์ฉํ๋ฉด ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๊ณต๊ฐ์ธ ServletContext์ ์ ๊ทผํ ์ ์๋ค.
ServletContext์๋ Http์์ฒญ๊ฐ์ฒด๋ Http์ธ์ ๊ฐ์ฒด ๋ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ ํ ์์ฑ์ ํค-๋ฐธ๋ฅ๋ก ์ง์ ํ ์ ์๋ค.
- ServletContext์ ์ ์ฅ๋๋ ๊ฐ์ฒด๋ ์๋ธ๋ฆฟ JSP/EL์ ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋ค.
(๐์ ์ญ๋ณ์ ๋๋)
ServletContextListener์ ServletContext๋ฅผ ์ด์ฉํ๋ฉด ํ๋ก์ ํธ๊ฐ ์คํ๋ ๋ ํ์ํ ๊ฐ์ฒด๋ค์ ์ค๋นํ๋ ์์ ์ ํ ์ ์๋ค.
- ์) ์ปค๋ฅ์ ํ ์ด๊ธฐํ / TodoService์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ enum์ผ๋ก ์์ฑํด์ ๋ณด๊ด ๋ฑ
์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์น ํ๋ก์ ํธ์์ ๋ฏธ๋ฆฌ ๋ก๋ฉํ๋ ์์ ์ ์ฒ๋ฆฌํ ๋ ServletContextListener๋ฅผ ์ด์ฉํ๋ค.
HttpSessionListner
๋HttpSessionAttributeListener
๋ฅผ ์ด์ฉํด์ HttpSession์ด ์์ฑ๋๊ฑฐ๋ setAttribute()๋ฑ์ ์์ ์ด ์ด๋ฃจ์ด์ง ๋ ์ด๋ฅผ ๊ฐ์ํ ์ ์๋ค. (๊ฐ์ํ์ฌ ์ด ์ฌ๊ฑด์ด ๋ฐ์ํ๋ฉด ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์๋ ์๋ค.)
HttpSessionAttributeListener
๋ฅผ ๊ตฌํ ํ๋ค.
ํด๋์ค๋ ๋ฒจ์ @WebListener
์ ๋ํ
์ด์
์ ๋ถ์ธ๋ค.
attributedAdded()
, attributedRemoved()
, attributedReplaced()
๋ฅผ ์ด์ฉํด์ HttpSession์ setAttributed()๋ removeAttribute() ๋ฑ์ ์์
์ ๊ฐ์งํ ์ ์๋ค.
- ์ด ๋ฉ์๋๋ค์ ๊ตฌํํ๋ฉด ์ธ์๋ก HttpSessionBindingEvent ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ๋๋ฐ ์ด ๊ฐ์ฒด์
getName()
๊ณผgetValue()
๋ฅผ ํตํด ์ถ๊ฐ/์ญ์ ๋ ์์ฑ์ ํค-๋ฐธ๋ฅ ๊ฐ์ ํ์ธํ ์ ์๋ค.