Search

Servlet

Servlet

๊ฐ•์˜ ์š”์•ฝ: ์ž๋ฐ” ์›น ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ, ์„œ๋ธ”๋ฆฟ ์ดํ•ดํ•˜๊ธฐ!

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

๋ชฉ์ฐจ

1.
์„œ๋ธ”๋ฆฟ์ด๋ž€? [00:00:17]
2.
์„œ๋ธ”๋ฆฟ ๋™์ž‘ ํ™˜๊ฒฝ๊ณผ ํ†ฐ์บฃ [00:05:20]
3.
์„œ๋ธ”๋ฆฟ ์ƒ๋ช…์ฃผ๊ธฐ [00:07:38]
4.
HTTP ์š”์ฒญ ๋ฐฉ์‹๊ณผ ๋ฉ”์†Œ๋“œ [00:11:31]
5.
์š”์ฒญ ๊ฒฝ๋กœ ๋งคํ•‘ ๋ฐฉ๋ฒ• (์›น.xml vs ์–ด๋…ธํ…Œ์ด์…˜) [00:14:58]
6.
HTTP ์š”์ฒญ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ (Request ๊ฐ์ฒด) [00:20:03]
7.
์„œ๋ฒ„ ์‘๋‹ต ์ƒ์„ฑํ•˜๊ธฐ (Response ๊ฐ์ฒด์™€ PrintWriter) [00:23:02]
8.
์„œ๋ธ”๋ฆฟ ์‹ค์Šต: ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ ๊ธฐ๋ณธ ์„œ๋ธ”๋ฆฟ ๋งŒ๋“ค๊ธฐ [00:36:07]
9.
ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฉ๋ฒ•: ํฌ์›Œ๋“œ vs ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ [01:01:41]
10.
๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ [01:21:03]

์„œ๋ธ”๋ฆฟ์ด๋ž€? [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๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
โ€ข
ํŽ˜์ด์ง€ ์ด๋™์€ ํฌ์›Œ๋“œ์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์œผ๋ฉฐ, ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์˜์ƒ์—์„œ๋Š” ์‹ค์Šต ์˜ˆ์ œ๋กœ ์ง์ ‘ ์„œ๋ธ”๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ํ†ฐ์บฃ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ž์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
์„œ๋ธ”๋ฆฟ์€ ์›น ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ ์ค‘ ํ•˜๋‚˜๋ผ ๊ผญ ์ตํ˜€๋‘๋ฉด ์ข‹์•„์š”! ์˜์ƒ๊ณผ ํ•จ๊ป˜ ์ฐจ๊ทผ์ฐจ๊ทผ ์‹ค์Šตํ•ด ๋ณด๋ฉด์„œ ์ดํ•ด๋ฅผ ๋†’์—ฌ ๋ณด์„ธ์š”. ๊ถ๊ธˆํ•œ ์  ์žˆ์œผ๋ฉด ์–ธ์ œ๋“  ์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”!