Servlet
๊ฐ์ ์์ฝ: ์๋ฐ ์น ๊ฐ๋ฐ์ ํต์ฌ, ์๋ธ๋ฆฟ ์ดํดํ๊ธฐ!
์ด ์์์ ์๋ฐ ๊ธฐ๋ฐ ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ๋์ ์ธ ์นํ์ด์ง๋ฅผ ๋ง๋๋ ํต์ฌ ๊ธฐ์ ์ธ **์๋ธ๋ฆฟ(Servlet)**์ ๋ํด ์์ธํ ์ค๋ช
ํฉ๋๋ค. ์๋ธ๋ฆฟ์ ๊ฐ๋
๋ถํฐ ๋์ ํ๊ฒฝ, ์๋ช
์ฃผ๊ธฐ, ์์ฒญ ์ฒ๋ฆฌ, ์๋ต ์์ฑ, ๊ทธ๋ฆฌ๊ณ ํ์ด์ง ์ด๋ ๋ฐฉ๋ฒ๊น์ง ๋จ๊ณ๋ณ๋ก ์น์ ํ๊ฒ ์๋ ค์ค๋๋ค. ์ค์ต ์์ ๋ ํฌํจ๋์ด ์์ด ์ดํด๋ฅผ ๋์ต๋๋ค.
๋ชฉ์ฐจ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
์๋ธ๋ฆฟ์ด๋? [00:00:17]
โข
*์๋ธ๋ฆฟ(Servlet)**์ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ด์ฉํด ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ ๊ธฐ์ ์
๋๋ค.
โข
ํด๋ผ์ด์ธํธ(์ฌ์ฉ์)์ ์์ฒญ์ ๋ฐ์ ์๋ฒ์์ ์ฒ๋ฆฌํ๊ณ , ๋์ ์ผ๋ก HTML์ด๋ JSON ๊ฐ์ ์๋ต์ ๋ง๋ค์ด ๋๋ ค์ค๋๋ค.
โข
์ฝ๊ฒ ๋งํด, "์น์์ ๋์ ์ธ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์๋ฐ ํ๋ก๊ทธ๋จ"์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์๋ธ๋ฆฟ ๋์ ํ๊ฒฝ๊ณผ ํฐ์บฃ [00:05:20]
โข
์๋ธ๋ฆฟ์ **์น ์ปจํ
์ด๋(์๋ธ๋ฆฟ ์ปจํ
์ด๋)**๋ผ๋ ํ๊ฒฝ์์ ์คํ๋ฉ๋๋ค.
โข
์น ์ปจํ
์ด๋๋ ์๋ธ๋ฆฟ๊ณผ JSP ๊ฐ์ ๋์ ์น ์ฝํ
์ธ ๋ฅผ ์คํํ๊ณ , HTTP ํ๋กํ ์ฝ์ ๋ฐ๋ผ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ํํธ์จ์ด์
๋๋ค.
โข
๋ํ์ ์ธ ์น ์ปจํ
์ด๋๊ฐ **ํฐ์บฃ(Tomcat)**์
๋๋ค. ํฐ์บฃ์ ์น ์๋ฒ์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ์ญํ ์ ๋์์ ํ๋ฉฐ, ์๋ฐ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
์๋ธ๋ฆฟ ์๋ช
์ฃผ๊ธฐ [00:07:38]
์๋ธ๋ฆฟ์ ๋ค์ 4๋จ๊ณ๋ก ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค:
1.
๋ก๋ฉ(Loading): ์ต์ด ์์ฒญ ์ ์๋ธ๋ฆฟ ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค.
2.
์ด๊ธฐํ(Init):ย init()ย ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์ด๊ธฐ ์ค์ ์ ํฉ๋๋ค. ์ต์ด ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
3.
์คํ(Service): ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๋ผย doGet(),ย doPost()ย ๊ฐ์ ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
4.
์๋ฉธ(Destroy): ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ๋ย destroy()ย ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์์์ ํด์ ํฉ๋๋ค.
HTTP ์์ฒญ ๋ฐฉ์๊ณผ ๋ฉ์๋ [00:11:31]
โข
์น์์ ์๋ฒ์ ์์ฒญํ๋ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋๋ฐ, ๋ํ์ ์ผ๋ก:
โฆ
GET: ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ (์: ์นํ์ด์ง ๋ณด๊ธฐ)
โฆ
POST: ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ๋ณด๋ผ ๋ ์ฌ์ฉ (์: ํ์๊ฐ์
ํผ ์ ์ถ)
โฆ
PUT, DELETEย ๋ฑ๋ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก GET๊ณผ POST๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ์
๋๋ค.
โข
์๋ธ๋ฆฟ์์๋ ์ด ์์ฒญ ๋ฐฉ์์ ๋ฐ๋ผย doGet(),ย doPost()ย ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
์์ฒญ ๊ฒฝ๋ก ๋งคํ ๋ฐฉ๋ฒ (์น.xml vs ์ด๋
ธํ
์ด์
) [00:14:58]
โข
์๋ธ๋ฆฟ์ด ์ด๋ค URL ์์ฒญ์ ์ฒ๋ฆฌํ ์ง ์ฐ๊ฒฐํ๋ ๊ฒ์ย ์์ฒญ ๊ฒฝ๋ก ๋งคํ์ด๋ผ๊ณ ํฉ๋๋ค.
โข
๊ณผ๊ฑฐ์๋ย web.xmlย ํ์ผ์ XML ํ๊ทธ๋ก ๋งคํํ์ง๋ง, ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ๋นํจ์จ์ ์ด์์ต๋๋ค.
โข
์ต์ ๋ฐฉ์์ **์ด๋
ธํ
์ด์
(@WebServlet)**์ ์๋ธ๋ฆฟ ํด๋์ค ์์ ๋ถ์ฌ์ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
โฆ
์:ย @WebServlet("/login")ย โ "/login" ๊ฒฝ๋ก ์์ฒญ์ ์ด ์๋ธ๋ฆฟ์ด ์ฒ๋ฆฌํจ.
โข
์ด๋
ธํ
์ด์
๋ฐฉ์์ด ํจ์ฌ ์ง๊ด์ ์ด๊ณ ํธ๋ฆฌํฉ๋๋ค.
HTTP ์์ฒญ ์ ๋ณด ํ์ธํ๊ธฐ (Request ๊ฐ์ฒด) [00:20:03]
โข
ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋ณด๋ย HttpServletRequestย ๊ฐ์ฒด๋ก ์ ๋ฌ๋ฉ๋๋ค.
โข
์ฃผ์ ๊ธฐ๋ฅ:
โฆ
์์ฒญ ๋ฉ์๋(GET, POST ๋ฑ) ํ์ธ (getMethod())
โฆ
์์ฒญ URL, URI ํ์ธ (getRequestURL(),ย getRequestURI())
โฆ
์์ฒญ ํ๋ผ๋ฏธํฐ(ํผ ๋ฐ์ดํฐ ๋ฑ) ๊ฐ์ ธ์ค๊ธฐ (getParameter("name"))
โฆ
ํค๋ ์ ๋ณด(๋ธ๋ผ์ฐ์ ์ข
๋ฅ, IP ์ฃผ์ ๋ฑ) ํ์ธ (getHeader("User-Agent"),ย getRemoteAddr())
โข
์๋ฅผ ๋ค์ด, ์ฃผ์์ฐฝ์ย ?name=ํ๊ธธ๋์ ๋ถ์ด๋ฉดย getParameter("name")์ผ๋ก "ํ๊ธธ๋"์ ์ฝ์ ์ ์์ต๋๋ค.
์๋ฒ ์๋ต ์์ฑํ๊ธฐ (Response ๊ฐ์ฒด์ PrintWriter) [00:23:02]
โข
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด๋ ์๋ต์ย HttpServletResponseย ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํฉ๋๋ค.
โข
ํ
์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ(HTML, JSON ๋ฑ)๋ฅผ ๋ณด๋ด๋ ค๋ฉดย PrintWriter๋ฅผ ์ฌ์ฉํด ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์๋๋ค.
โข
์๋ต์ย ์ปจํ
์ธ ํ์
(์:ย text/html)์ ์ง์ ํด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด์ฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ํ๋๋ก ํฉ๋๋ค.
โข
์์:ย response.setContentType("text/html");ย โ HTML ํ์์ผ๋ก ์๋ตํ๋ค๋ ์๋ฏธ.
์๋ธ๋ฆฟ ์ค์ต: ํ๋ก์ ํธ ์์ฑ๊ณผ ๊ธฐ๋ณธ ์๋ธ๋ฆฟ ๋ง๋ค๊ธฐ [00:36:07]
โข
์ดํด๋ฆฝ์ค์์ ๋ค์ด๋๋ฏน ์น ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ , ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
โข
์๋ธ๋ฆฟ ํด๋์ค๋ย HttpServlet์ ์์๋ฐ์ ๋ง๋ค๊ณ ,ย @WebServletย ์ด๋
ธํ
์ด์
์ผ๋ก URL ๋งคํ์ ํฉ๋๋ค.
โข
doGet()ย ๋ฉ์๋ ์์ ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
โข
ํฐ์บฃ ์๋ฒ๋ฅผ ์คํํด ์๋ธ๋ฆฟ์ ํ
์คํธํ ์ ์์ต๋๋ค.
ํ์ด์ง ์ด๋ ๋ฐฉ๋ฒ: ํฌ์๋ vs ๋ฆฌ๋ค์ด๋ ํธ [01:01:41]
โข
ํฌ์๋(Forward): ์๋ฒ ๋ด๋ถ์์ ์์ฒญ๊ณผ ์๋ต์ ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ ๋ฌํฉ๋๋ค.
โฆ
ํด๋ผ์ด์ธํธ๋ URL์ด ๋ฐ๋์ง ์๊ณ , ์์ฒญ ์ ๋ณด๋ ์ ์ง๋ฉ๋๋ค.
โฆ
์: ๋ก๊ทธ์ธ ํ ๋ด๋ถ ํ์ด์ง๋ก ์ด๋ํ ๋ ์ฌ์ฉ.
โข
๋ฆฌ๋ค์ด๋ ํธ(Redirect): ํด๋ผ์ด์ธํธ์๊ฒ ์๋ก์ด URL๋ก ์ฌ์์ฒญํ๋ผ๊ณ ์ง์ํฉ๋๋ค.
โฆ
ํด๋ผ์ด์ธํธ URL์ด ๋ฐ๋๊ณ , ์์ฒญ ์ ๋ณด๋ ์ด๊ธฐํ๋ฉ๋๋ค.
โฆ
์: ๊ฒ์๊ธ ๋ฑ๋ก ํ ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ํ ๋ ์ฌ์ฉ.
โข
์๋ฐ ์ฝ๋ ์:
โฆ
ํฌ์๋:ย request.getRequestDispatcher("/nextServlet").forward(request, response);
โฆ
๋ฆฌ๋ค์ด๋ ํธ:ย response.sendRedirect(request.getContextPath() + "/index.jsp");
๋ง๋ฌด๋ฆฌ ์์ฝ [01:21:03]
โข
์๋ธ๋ฆฟ์ ์๋ฐ๋ก ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋์ ์นํ์ด์ง๋ฅผ ๋ง๋๋ ํต์ฌ ๊ธฐ์ ์
๋๋ค.
โข
ํฐ์บฃ ๊ฐ์ ์น ์ปจํ
์ด๋์์ ์คํ๋๋ฉฐ, ์๋ช
์ฃผ๊ธฐ(๋ก๋ฉโ์ด๊ธฐํโ์คํโ์๋ฉธ)๋ฅผ ๊ฐ์ง๋๋ค.
โข
HTTP ์์ฒญ ๋ฐฉ์(GET, POST ๋ฑ)์ ๋ฐ๋ผ ๋ฉ์๋๋ฅผ ๊ตฌํํด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
โข
์์ฒญ ๊ฒฝ๋ก ๋งคํ์ ์ด๋
ธํ
์ด์
๋ฐฉ์์ด ์ต์ ์ด๋ฉฐ, ์์ฒญ ์ ๋ณด๋ย HttpServletRequest๋ก, ์๋ต์ย HttpServletResponse๋ก ๋ค๋ฃน๋๋ค.
โข
ํ์ด์ง ์ด๋์ ํฌ์๋์ ๋ฆฌ๋ค์ด๋ ํธ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ผ๋ฉฐ, ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํฉ๋๋ค.
โข
์์์์๋ ์ค์ต ์์ ๋ก ์ง์ ์๋ธ๋ฆฟ์ ๋ง๋ค์ด ๋ณด๊ณ ํฐ์บฃ ์๋ฒ์์ ์คํํ๋ ๋ฐฉ๋ฒ๋ ์์ธํ ๋ค๋ฃน๋๋ค.
์๋ธ๋ฆฟ์ ์น ๊ฐ๋ฐ์ ๊ธฐ๋ณธ ์ค ํ๋๋ผ ๊ผญ ์ตํ๋๋ฉด ์ข์์! ์์๊ณผ ํจ๊ป ์ฐจ๊ทผ์ฐจ๊ทผ ์ค์ตํด ๋ณด๋ฉด์ ์ดํด๋ฅผ ๋์ฌ ๋ณด์ธ์. ๊ถ๊ธํ ์ ์์ผ๋ฉด ์ธ์ ๋ ์ง๋ฌธํด ์ฃผ์ธ์! 