Software Engineering

Part.1 ์›น์„œ๋ฒ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€

Hyunseokim 2022. 8. 23. 11:16

๐Ÿ“Œ ์ด ๊ธ€์„ ์™œ ์“ฐ๋Š”๊ฐ€

2์›” ์ดˆ ํ”ํžˆ ๋งํ•˜๋Š” ๋ฐฑ์—”๋””๋ฅผ ๋ชจ๋‘ ๊ฒฝํ—˜ํ•ด ๋ดค๋‹ค. flask๋ฅผ ์ด์šฉํ•ด ์›น์„ ๋งŒ๋“ค๋ฉด์„œ ํ”„๋ก ํŠธ์—”๋“œ์— ๋Œ€ํ•œ ๋งค๋ ฅ๋„ ๋А๋ผ๊ณ  DB์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ  ์‹ถ๊ณ  ๋˜ ๊ฐ€์žฅ ๋ฒ ์ด์Šค์ธ ๋ฐฑ์—”๋“œ ๊ณต๋ถ€๋„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹จ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 4์›” ์ดˆ ์šด์ด ์ข‹๊ฒŒ๋„ django๋ฅผ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ œ๋Œ€๋กœ ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๋“  ์ƒ๊ฐ์˜ ์ฒซ ์‹œ์ž‘์€ ๊ทผ๋ฐ, ๋„๋Œ€์ฒด ์„œ๋ฒ„๊ฐ€ ๋ญ์•ผ?์˜€๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์„œ๋ฒ„๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ HTTP๋Š” ๋ญ”๋ฐ? ๋กœ ๋น ์ ธ ๊ฒฐ๊ตญ ์„œ๋ฒ„์™€ ๋„คํฌ์›Œํฌ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์ผ์ฃผ์ผ ๋™์•ˆ ๊ณต๋ถ€ํ–ˆ๋”๋ž€๋‹ค. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์™œ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€, http ํ”„๋กœํ† ์ฝœ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ์›น ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ดํ•ด์™€ db๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” api์— ๋Œ€ํ•œ ์ดํ•ด๊นŒ์ง€ ๋˜ ์ด๊ฑธ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ python webframework ๊นŒ์ง€ ๊ทธ ์ฒซ ํŽ˜์ด์ง€๋กœ์„œ ์›น์„œ๋ฒ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋‹ค ์“ฐ๊ณ  ๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ๋ณ„๊ฒŒ ์—†๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ  ๊ทผ๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ์–ด๋ ค์› ์„๊นŒ? ํ•˜๋‚˜์˜ document๋ฅผ ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜์ง€ ๋ชปํ•ด์„œ ๊ทธ๋Ÿฐ๊ฐ€ใ… ใ… 
์—ฌํŠผ ์ด๊ฑด ์›น์„œ๋ฒ„์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ๋‘ ๋ฒˆ์งธ๋Š” ์ง„์งœ HTTP ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ… ์„ธ ๋ฒˆ์งธ๋Š” ๊ทธ๋ ‡๊ฒŒ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ ๋Œ€์šฉ๋Ÿ‰ ์„œ๋ฒ„ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๊ฐ€ ๊ถ๊ธˆํ•ด์ ธ ๋˜ ๊ณต๋ถ€ํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ์„œ๋ฒ„์™€ ์•„ํ‚คํ…์ฒ˜๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋œ ์ด์•ผ๊ธฐ๊นŒ์ง€... ์•„ํ‚คํ…์ฒ˜, ์„œ๋ฒ„, ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ์‹œ์ž‘ํ•ด ๋ณด๋ ค ํ•œ๋‹ค!



๋ชฉํ‘œ
์ด ๊ธ€์„ ์ฝ๊ณ  web server/ http/ web server์™€ was์˜ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ  WSGi/python framework/ API
์ฆ‰ ๋ฐฑ์—”๋“œ ๋กœ์ง์— ๋Œ€ํ•ด ์ „๋ฐ˜์ ์ธ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

 

1. web server?

์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ
HTTP ํ”„๋กœํ† ์ฝœ๋กœ ์š”์ฒญ์„ ๋ฐ›์•„,
HTML ๋ฌธ์„œ ๋“ฑ๊ณผ ๊ฐ™์€ ์ •์  ์›น ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด

1-1. ํ•˜๋“œ์›จ์–ด vs ์†Œํ”„ํŠธ์›จ์–ด

  • ํ•˜๋“œ์›จ์–ด ์ธก๋ฉด,
    • web server๋Š” web server์˜ ์†Œํ”„ํŠธ์›จ์–ด์™€ website์˜ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜๋Š” ์ปดํ“จํ„ฐ (์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์—๋Š” HTML ๋ฌธ์„œ, images, CSS stylesheets, ๊ทธ๋ฆฌ๊ณ  JavaScript files ๋“ฑ)
    • Web server๋Š” ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜์–ด ์›น์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ๋“ค์ด ์›น ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ(์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋“ค)๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ์†Œํ”„ํŠธ์›จ์–ด ์ธก๋ฉด,
    • web server๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ŠคํŠธ ํŒŒ์ผ๋“ค์— ์ ‘๊ทผํ•˜๋Š”์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • HTTP ์„œ๋ฒ„๋Š” URL(Web addresses)๊ณผ HTTP(๋‹น์‹ ์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ)์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ผ๋ถ€์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋ฒ„์—์„œ ๋ถˆ๋ ค์ง„ ํŒŒ์ผ์„ ํ•„์š”๋กœ ํ• ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์š”์ฒญ-> ์š”์ฒญ์ด ์˜ฌ๋ฐ”๋ฅธ ์›น ์„œ๋ฒ„(ํ•˜๋“œ์›จ์–ด)์— ๋„๋‹ฌํ•˜์˜€์„ ๋•Œ -> HTTP ์„œ๋ฒ„(software)๋Š” ์š”์ฒญ๋œ ๋ฌธ์„œ๋ฅผ HTTP๋ฅผ ์ด์šฉํ•ด ์ „๋‹ฌ

์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ณต๊ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋‹น์‹ ์€ ์ •์  ํ˜น์€ ๋™์  ์›น ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

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

1-2. ํ˜ธ์ŠคํŒ… ํŒŒ์ผ๋“ค

์›น ์„œ๋ฒ„๋Š” ์ฒ˜์Œ์— HTML ๋ฌธ์„œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์›น ์‚ฌ์ดํŠธ์˜ ํŒŒ์ผ๋“ค๊ณผ ์ด๋ฏธ์ง€, CSS ์Šคํƒ€์ผ์‹œํŠธ, JavaScript ํŒŒ์ผ, ํฐํŠธ, ๋น„๋””์˜ค๋ฅผ ํฌํ•จํ•œ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค์„ ์ €์žฅํ•ด์•ผํ•œ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ, ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ๊ทธ ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์„ ์ „๋‹ดํ•˜๋Š” ์›น ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•จ.

์ „๋‹ดํ•˜๋Š” ์›น์„œ๋ฒ„๋Š”:

  • ํ•ญ์ƒ ์‹คํ–‰ ์ค‘์ด๊ณ 
  • ํ•ญ์ƒ ์ธํ„ฐ๋„ท๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ 
  • ํ•ญ์ƒ ๊ฐ™์€ IP์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ(๋ชจ๋“  ISPs (en-US)๊ฐ€ ํ™ˆ ๋ผ์ธ์— ๋Œ€ํ•ด ๊ณ ์ •๋œ IP์ฃผ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.)
  • ์ œ 3์ž์— ์˜ํ•ด ์œ ์ง€๋ณด์ˆ˜ ๋œ๋‹ค.

์ข‹์€ ํ˜ธ์ŠคํŒ… ์ œ๊ณต์ž๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ๋‹น์‹ ์˜ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„.
์›น ํ˜ธ์ŠคํŒ… ์†”๋ฃจ์…˜์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, ๊ทธ์ € ์›น ์„œ๋ฒ„์— ํŒŒ์ผ๋“ค์„ ์—…๋กœ๋“œ ํ•˜๋ฉด ๋œ๋‹ค.

1-3. HTTP

์›น ์„œ๋ฒ„๋Š” HTTP (hypertext transfer protocol)์„ ์œ„ํ•œ ์ง€์›. ์ด๋ฆ„์ด ์˜๋ฏธํ•˜๋“ฏ์ด, HTTP๋Š” ์–ด๋–ป๊ฒŒ ๋‘ ์ปดํ“จํ„ฐ๊ฐ„์˜ hypertext(์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฐ๊ฒฐ๋œ ์›น ๋ฌธ์„œ)๋ฅผ ์ „์†กํ•˜๋Š” protocol.

ํ”„๋กœํ† ์ฝœ์€ ๋‘ ์ปดํ“จํ„ฐ๊ฐ„์˜ ํ†ต์‹ ๋ฅผ ์œ„ํ•œ ๊ทœ์น™์˜ ์ง‘ํ•ฉ. HTTP๋Š” ๋ฌธ์ž๋กœ ๋œ, ๋…๋ฆฝ์ ์ธ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

  • Textual(๋ฌธ์ž๋กœ ๋œ): ๋ชจ๋“  ๋ช…๋ น์–ด๋“ค์€ ๊ธฐ๋ณธ ๋ฌธ์ž์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Stateless(๋…๋ฆฝ์ ์ธ): ์„œ๋ฒ„ ํ˜น์€ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ „์˜ ํ†ต์‹ ์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๋Š”๋‹ค/ HTTP์—๋งŒ ์˜์กดํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ๋‹น์‹ ์ด ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ˜น ๋‹น์‹ ์ด ์ฒ˜๋ฆฌํ•œ ๋‹จ๊ณ„๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ๊ทธ๋Ÿฌํ•œ ์ผ๋“ค์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

HTTP๋Š” ์–ด๋–ป๊ฒŒ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•œ ๊ทœ์น™์„ ์ œ๊ณต

  • ์˜ค์ง ํด๋ผ์ด์–ธํŠธ๋งŒ์ด HTTP ์š”์ฒญ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„์—๊ฒŒ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์˜ค์ง ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์š”์ฒญํ• ๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ˜๋“œ์‹œ URL ํŒŒ์ผ๋“ค์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์›น ์„œ๋ฒ„๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ์†Œํ•œ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  HTTP ์š”์ฒญ์— ์‘๋‹ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•˜๊ฒŒ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ… ์ฐธ๊ณ 

2. Back-end

2-1. Static Pages์™€ Dynamic Pages

  • Static Pages
    Web Server๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ๋ฐ›์•„ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” file contents๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ํ•ญ์ƒ ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    Ex) image, html, css, javascript ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๋“ค
  • Dynamic Pages
    ์ธ์ž์˜ ๋‚ด์šฉ์— ๋งž๊ฒŒ ๋™์ ์ธ contents๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ์ฆ‰, ์›น ์„œ๋ฒ„์— ์˜ํ•ด์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋ฌผ * Servlet: WAS ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” Java Program
    ๊ฐœ๋ฐœ์ž๋Š” Servlet์— doGet()์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

2-2. Web Server์™€ WAS์˜ ์ฐจ์ด

Web Server

  • Web Server์˜ ๊ฐœ๋…: ์†Œํ”„ํŠธ์›จ์–ด์™€ ํ•˜๋“œ์›จ์–ด๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
    • 1) ํ•˜๋“œ์›จ์–ด: Web ์„œ๋ฒ„๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ
    • 2) ์†Œํ”„ํŠธ์›จ์–ด: ์›น ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ HTTP ์š”์ฒญ์„ ๋ฐ›์•„ ์ •์ ์ธ ์ปจํ…์ธ (.html .jpeg .css ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ
    • Web Server์˜ ๊ธฐ๋Šฅ
    • HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ์›น ํฌ๋กค๋Ÿฌ)์˜ ์š”์ฒญ์„ ์„œ๋น„์Šค ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.
    • ์š”์ฒญ์— ๋”ฐ๋ผ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ค‘ ์ ์ ˆํ•˜๊ฒŒ ์„ ํƒํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ๊ธฐ๋Šฅ 1)
      • ์ •์ ์ธ ์ปจํ…์ธ  ์ œ๊ณต
      • WAS๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ž์›์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๊ธฐ๋Šฅ 2)
      • ๋™์ ์ธ ์ปจํ…์ธ  ์ œ๊ณต์„ ์œ„ํ•œ ์š”์ฒญ ์ „๋‹ฌ
      • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ(Request)์„ WAS์— ๋ณด๋‚ด๊ณ , WAS๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ(์‘๋‹ต, Response)ํ•œ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • Web Server์˜ ์˜ˆ
      Ex) Apache Server, Nginx, IIS(Windows ์ „์šฉ Web ์„œ๋ฒ„) ๋“ฑ

WAS(Web Application Server)

  • WAS์˜ ๊ฐœ๋…
    • DB ์กฐํšŒ๋‚˜ ๋‹ค์–‘ํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋™์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ Application Server
    • HTTP๋ฅผ ํ†ตํ•ด ์ปดํ“จํ„ฐ๋‚˜ ์žฅ์น˜์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด(์†Œํ”„ํŠธ์›จ์–ด ์—”์ง„)์ด๋‹ค.
    • “์›น ์ปจํ…Œ์ด๋„ˆ(Web Container)” ํ˜น์€ “์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(Servlet Container)”๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.
      • Container๋ž€ JSP, Servlet์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งํ•œ๋‹ค.
      • ์ฆ‰, WAS๋Š” JSP, Servlet ๊ตฌ๋™ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค.
  • WAS = Web Server + Web Container
    • Web Server ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ ์žํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์ œ์‹œ๋˜์—ˆ๋‹ค.
      • ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜, ๋ณด์•ˆ, ๋ฉ”์‹œ์ง•, ์“ฐ๋ ˆ๋“œ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
      • ์ฃผ๋กœ DB ์„œ๋ฒ„์™€ ๊ฐ™์ด ์ˆ˜ํ–‰๋œ๋‹ค.
    • ํ˜„์žฌ๋Š” WAS๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Web Server๋„ ์ •์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ƒ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.
  • WAS์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ DB ์ ‘์† ๊ธฐ๋Šฅ ์ œ๊ณต
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜(๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„) ๊ด€๋ฆฌ ๊ธฐ๋Šฅ
    • ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰
  • WAS์˜ ์˜ˆ
    Ex) Tomcat, JBoss, Jeus, Web Sphere ๋“ฑ

2-3. Web Server์™€ WAS๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด์œ 

  • Web Server๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?
    ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ €)์— ์ด๋ฏธ์ง€ ํŒŒ์ผ(์ •์  ์ปจํ…์ธ )์„ ๋ณด๋‚ด๋Š” ๊ณผ์ •์—์„œ
    ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ •์ ์ธ ํŒŒ์ผ๋“ค์€ ์›น ๋ฌธ์„œ(HTML ๋ฌธ์„œ)๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์งˆ ๋•Œ ํ•จ๊ป˜ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” HTML ๋ฌธ์„œ๋ฅผ ๋จผ์ € ๋ฐ›๊ณ  ๊ทธ์— ๋งž๊ฒŒ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋ฉด ๊ทธ๋•Œ์„œ์•ผ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ฐ›์•„์˜จ๋‹ค. Web Server๋ฅผ ํ†ตํ•ด ์ •์ ์ธ ํŒŒ์ผ๋“ค์„ Application Server๊นŒ์ง€ ๊ฐ€์ง€ ์•Š๊ณ  ์•ž๋‹จ์—์„œ ๋น ๋ฅด๊ฒŒ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Web Server์—์„œ๋Š” ์ •์  ์ปจํ…์ธ ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ๋ถ„๋ฐฐํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • WAS๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?
    ์›น ํŽ˜์ด์ง€๋Š” ์ •์  ์ปจํ…์ธ ์™€ ๋™์  ์ปจํ…์ธ ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ๋™์  ์ปจํ…์ธ ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, Web Server๋งŒ์„ ์ด์šฉํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ชจ๋‘ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์„œ๋น„์Šค๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ์—๋Š” ์ž์›์ด ์ ˆ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑํ•˜๋‹ค. ๋”ฐ๋ผ์„œ WAS๋ฅผ ํ†ตํ•ด ์š”์ฒญ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ DB์—์„œ ๊ฐ€์ ธ์™€์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๊ฒŒ ๊ทธ๋•Œ ๊ทธ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด WAS๊ฐ€ Web Server์˜ ๊ธฐ๋Šฅ๋„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

๊ฒฐ๊ตญ์€ ์ž์› ์ด์šฉ์˜ ํšจ์œจ์„ฑ ๋ฐ ์žฅ์•  ๊ทน๋ณต, ๋ฐฐํฌ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ์˜์„ฑ ์„ ์œ„ํ•ด Web Server์™€ WAS๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ. Web Server๋ฅผ WAS ์•ž์— ๋‘๊ณ  ํ•„์š”ํ•œ WAS๋“ค์„ Web Server์— ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ์„ค์ •ํ•˜๋ฉด ๋”์šฑ ํšจ์œจ์ ์ธ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

2-4. django

  • reverse proxy server: ์›น๋ธŒ๋ผ์šฐ์ €์˜ ์นด์šดํ„ฐ ํŒŒํŠธ๋„ˆ๋กœ์„œ ์„œ๋ฒ„ ์ชฝ์—์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์˜๋ฏธ. ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ HTTP์š”์ฒญ์„ ๋ฐ›์•„ ์ •์ ์ธ ํŽ˜์ด์ง€/ํŒŒ์ผ์„ ๋Œ๋ ค์ค€๋‹ค. ๊ฐ€๋ฒผ์›€๊ณผ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ์›น ์„œ๋ฒ„, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ๋ฉ”์ผ ํ”„๋ก์‹œ ๊ธฐ๋Šฅ. ๋Œ€ํ‘œ์ ์ธ ์›น์„œ๋ฒ„๋Š” Apache, Nginx
  • WAS(Web Application Server) ๋ณต์Šต
    ๋™์  ๋ฆฌ์†Œ์Šค ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ. ์›น ์„œ๋ฒ„(Nginx)์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Django)๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ค‘๊ณ„. (Nginx์—์„œ ๋ฐ›์€ ์š”์ฒญ์„ Django์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ค‘๊ณ„์ธ ์—ญํ• ์„ ํ•ด์ค€๋‹ค.) Nginx๋Š” Python์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— uWSGI๋Š” HTTP ์š”์ฒญ์„ python์œผ๋กœ, Django๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ Nginx๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
  • WSGI web apllication
  • Django๋Š” ์›น ์„œ๋ฒ„์ธ๊ฐ€?
    ์žฅ๊ณ ๋Š” ์žฅ๊ณ ๋งŒ์˜ ์›น์„œ๋ฒ„๋ฅผ ์“ด๋‹ค. ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ python์œผ๋กœ ์งœ์—ฌ์ง„ ๊ฐ€๋ฒผ์šด wsgi(web server gateway interface)๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฑธ ์›น์„œ๋ฒ„๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ณ  ์ž์ฒด๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ณ  runserver๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ž„. ๊ทธ๋Ÿฌ๋‹ˆ ์žฅ๊ณ  document์—์„œ ํ”„๋กœ๋•์…˜ ๊ณผ์ •์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•จ.
  • DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (We’re in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.) ์ด ์„œ๋ฒ„๋ฅผ ํ”„๋กœ๋•์…˜ ์„ธํŒ…์—์„œ ์‚ฌ์šฉํ•˜์ง€๋งˆ๋ผ. ์ด๊ฒƒ์€ ๋ณด์•ˆ ๊ฒ€์ˆ˜๋‚˜ ํผํฌ๋จผ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š์•˜๋‹ค. (์šฐ๋ฆฌ๋Š” ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋ ค๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์žฅ๊ณ  ์™ธ์˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ผ)
  • ๊ทธ๋ ‡๋‹ค๋ฉด WSGI ์„œ๋ฒ„๋Š” ๋ญ์•ผ?
    WSGI๋Š” Web Server Gateway Interface์˜ ์•ฝ์ž
    WSGI๋Š” python application(python script)์ด Web Server์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ Interface์ด๋ฉฐ Python Framework. WSGI๋Š” ์„œ๋ฒ„์™€ ๊ฒŒ์ดํŠธ์›จ์ด , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ ์–‘๋‹จ์œผ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ๋‹ค. WSGI ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ์„œ๋ฒ„๋‹จ์—์„œ ํ™˜๊ฒฝ์ •๋ณด์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹จ์— ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ทธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฏธ๋ฆฌ ์ œ๊ณต๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋‹จ์— ์‘๋‹ตํ•œ๋‹ค. WSGI ๋ฏธ๋“ค์›จ์–ด(๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.)๊ฐ€ WSGI ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด๋ฅผ ๋ณด์ถฉํ•ด์ฃผ๋Š”๋ฐ, ์ด ๋ฏธ๋“ค์›จ์–ด๋Š” ์„œ๋ฒ„์˜ ๊ด€์ ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€์ ์—์„œ๋Š” ์„œ๋ฒ„๋กœ ํ–‰๋™ํ•œ๋‹ค.

์ฆ‰, HTTP requests -> Web Server -> WSGI Server(Middleware) -> Django(WSGI๋ฅผ ์ง€์›ํ•˜๋Š” Web Application)

2-5. web server, API server