WSGI & ASGI

GreenBeanยท2022๋…„ 1์›” 19์ผ
6
post-thumbnail

WSGI & ASGI

CGI์™€ FastCGI

  • ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์›น ์„œ๋ฒ„ (Nginx, Apache ๋“ฑ) ์™€ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณดํ†ต CGI ๋ฅผ ์‚ฌ์šฉ
    • ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋งŒ์•ฝ ์„œ๋ฒ„๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ธ์–ด๋งˆ๋‹ค ๋‹ค๋ฅธ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด ๋  ํ…Œ๋‹ˆ ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต์˜ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•จ
      • ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ CGI, Common Gateway Interface ์ž„
    • CGI ๋Š” Common Gateway Interface ์˜ ์•ฝ์ž๋กœ ์›น ์„œ๋ฒ„์™€ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ‘œ์ค€ํ™”๋œ ํ”„๋กœํ† ์ฝœ

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

  • ๊ทธ๋Ÿฌ๋‚˜ CGI๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๊ฒŒ ๋จ
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์š”์ฒญํ•  ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋นˆ๋ฒˆํ•ด์ง€๋Š”๋ฐ ์ด๋Š” ์ปค๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์† ์ƒ์„ฑโ€ข์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์‹ฌํ•ด์ง€๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•จ
  • ํ˜„๋Œ€์˜ ์›น ์„œ๋น„์Šค์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ REST API๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ˆ˜์‹œ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์—์„œ ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ณ๋Š” ๋งž์ง€ ์•Š์Œ
    • ๊ทธ๋ž˜์„œ ์ƒ๊ธด ๊ฒƒ์ด ๋ฐ”๋กœ FastCGI

  • FastCGI๋Š” ๋ช‡ ๋ฒˆ์˜ ์š”์ฒญ์ด ๋“ค์–ด์™€๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋จ
    • ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹จ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ๋งŒ์„ ์ ์žฌํ•˜์—ฌ ๊ณ„์† ์žฌํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— CGI์— ๋น„ํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์›”๋“ฑํ•˜๊ฒŒ ๊ฐ์†Œ
  • Java์˜ Tomcat ๋˜ํ•œ Web Server + FastCGI๋ฅผ ์ฑ„ํƒํ•œ ํ˜•ํƒœ๋กœ ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž ์ ‘์†์— ์œ ๋ฆฌ
    • JVM ๊ณ„์—ด์˜ ์–ธ์–ด๋กœ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด JBoss, Tomcat ๋“ฑ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋ณดํŽธ์ ์ด์ง€๋งŒ ์ด์™ธ์—๋„ CGI๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ
  • ๊ทธ๋Ÿฌ๋‚˜ Python์—์„œ๋Š” ์ด๋Ÿฌํ•œ WAS๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒฐ๊ตญ CGI, FastCGI ๋“ฑ์„ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” WAS ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์‹ค์ œ๋กœ Python์—์„œ๋Š” Python๋งŒ์˜ ๊ฒŒ์ดํŠธ์›จ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌ

WSGI

  • Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ CGI ๋””์ž์ธ ํŒจํ„ด์„ ๋ชจํƒœ๋กœ ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ CGI์™€๋Š” ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ์Œ
    • CGI์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ, ์ด๋Ÿฐ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณ ์•ˆ๋œ ๊ฐœ๋…

  • Python Web App์„ MTV ํŒจํ„ด๊ณผ ๊ฐ™์ด ๋ทฐ๊ฐ€ ๋™์‹œ์— ์ ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ๋ชจ์Šต
    • WSGI๋Š” CGI์™€ ๋™์ผํ•˜๊ฒŒ ์›น ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค‘๊ฐ„์— ์œ„์น˜ํ•˜๋Š”๋ฐ, CGI์™€ ๋‹ค๋ฅธ ์ ์€ CGI๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์ด๊ณ , WSGI๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ
    • ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด CGI๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค Fork ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปค๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€โ€ข๋ฐ˜๋‚ฉํ•˜๊ณ , WSGI๋Š” ๋งŽ์€ ์š”์ฒญ์„ ์ฝœ๋ฐฑ (Callback) ์œผ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌ
  • WSGI๋กœ ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์žˆ์Œ

    • โ‘  Nginx, Apache์—์„œ ๋‚ด์žฅ ๋ชจ๋“ˆ๋กœ ์ œ๊ณตํ•˜๋Š” server-often high profile ๋ฐฉ์‹
      • ์˜ˆ์‹œ: mod-wsgi, mod-python ๋“ฑ
    • โ‘ก Python ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ Web App Server
      • ์˜ˆ์‹œ: gunicorn, uvicorn, cherrypy ๋“ฑ
  • ๊ฒฐ๊ตญ WSGI๋Š” ์›น ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์— ๋ฏธ๋“ค์›จ์–ด ์—ญํ• ์„ ํ•˜๋ฉฐ ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์›น ์„œ๋ฒ„๋„ WSGI์— ๋Œ€ํ•œ ์ž‘๋™ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜ํ•œ WSGI์— ๋Œ€ํ•œ ์ž‘๋™ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ Client-Server Model์„ ์‘์šฉํ•œ ๊ฒƒ

    • ์ข€ ๋” ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋ณด๋ฉด, ์›น ์„œ๋ฒ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ค‘๊ฐ„์˜ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์‹  ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• 

ASGI

  • WSGI๋งŒ์œผ๋กœ๋„ ์šฐ๋ฆฌ๋Š” ์ถฉ๋ถ„ํžˆ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์›น ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Œ
    • ํ•˜์ง€๋งŒ ๊ณต๊ต๋กญ๊ฒŒ๋„ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํ˜„๋Œ€ ์›น ์„œ๋น„์Šค์˜ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋งŒ์กฑ๋œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๊ธฐ ์–ด๋ ค์šด ์ ์ด ์žˆ์Œ
  • Python์—์„œ๋Š” asyncio, coroutine๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›
    • ๊ทธ๋Ÿฌ๋‚˜ WSGI๋Š” ๋™๊ธฐ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋งŒ์„ ์ง€์›ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ
    • ๊ฐ€๋ น ํ˜„๋Œ€ ์›น ์„œ๋น„์Šค์—์„œ๋Š” ์›น ์†Œ์ผ“ ๋“ฑ์„ ์‚ฌ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค ๋“ฑ์„ ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, WSGI๋กœ๋Š” ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€
  • ๋ฌผ๋ก  ์•ˆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
    • ๋น„๋™๊ธฐ ํ์™€ ๊ฐ™์€ Celery๋ฅผ ์ž˜๋งŒ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ์„œ๋น„์Šค ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํŠธ๋ ˆ์ด์‹ฑ ๋“ฑ๊ณผ ๊ฐ™์€ ์œ ์ง€ ๋ณด์ˆ˜, ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์ด ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ์ ์ด ์žˆ์Œ
    • ๋”ฐ๋ผ์„œ ์ตœ๊ทผ์—๋Š” Django 3.0 ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ FastAPI ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ASGI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜์˜€์œผ๋ฉฐ ๋’ค๋”ฐ๋ผ Falcon ํ”„๋ ˆ์ž„์›Œํฌ๋„ 3.0๋ถ€ํ„ฐ ASGI ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ”์Œ

  • ์šด์˜ ์•„ํ‚คํ…์ณ๋กœ ๋ดค์„ ๋•Œ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Œ
    • ๊ทธ๋Ÿฌ๋‚˜ WSGI์™€ ๋‹ค๋ฅด๊ฒŒ ASGI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์ ์ด ํผ
    • ๋”ฐ๋ผ์„œ WSGI์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ์›น ์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ๊ณผ HTTP 2.0์„ ์ง€์›
  • ์ด๋Ÿฌํ•œ ๋Œ€ํ‘œ์ ์ธ ASGI Web App์—๋Š” uvicorn์ด ์žˆ์Œ
    • uvicorn์€ ASGI ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ์จ ๊ทธ ๋‚ด์žฅ ๋ชจ๋“ˆ๋กœ uvloop์„ ์‚ฌ์šฉ
    • uvloop์—์„œ uv๋Š” libuv ์ฆ‰, Javascript V8์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋น„๋™๊ธฐ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ ๊ฒƒ
    • ASGI๋Š” Cython ๊ธฐ๋ฐ˜์œผ๋กœ C++ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ธ๋ฐ๋‹ค๋‹ค๊ฐ€ libuv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‹ˆ Node.js์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์–ด๋Š ์ •๋„ ๋ˆ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ

Tip! ์ถ”๊ฐ€ ๋‚ด์šฉ

์—ญ์‚ฌ

CGI

  • ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์›น์„œ๋ฒ„ (Nginx, Apache) ์™€ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ์ •์  HTML ํ•˜๋‚˜๋กœ ์›น ์„œ๋น„์Šค (์›น ์„œ๋ฒ„๊ฐ€ ์ •์  ํŒŒ์ผ ๋“ฑ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต) ๋ฅผ ํ•˜๋˜ ๊ณผ๊ฑฐ์™€๋Š” ๋‹ฌ๋ฆฌ, ์›น์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์›น ์„œ๋ฒ„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•  ์ˆ˜ ์žˆ๋„๋ก CGI๊ฐ€ ์ค‘๊ณ„ ์—ญํ• ์„ ํ•ด์คŒ
    • ํ•˜์ง€๋งŒ CGI๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”๊ฐ€โ€ข์ƒ์„ฑโ€ข์‚ญ์ œ๋ฅผ ํ•ด์•ผ ํ•จ
    • ๊ทธ๋ž˜์„œ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒ

FastCGI

  • ํ˜„๋Œ€์˜ ์›น ์„œ๋น„์Šค๋Š” REST API๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋ฉฐ, ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ˆ˜ ์—†์ด ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•จ
    • ๊ทธ๋Ÿฐ ์ด์œ ๋กœ FastCGI๊ฐ€ ๋“ฑ์žฅ
    • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

WSGI

  • ํŒŒ์ด์ฌ์—๋Š” ํŒŒ์ด์ฌ ๋งŒ์˜ ๊ฒŒ์ดํŠธ์›จ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ์ด WSGI
  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ, CGI ๋””์ž์ธ ํŒจํ„ด์„ ์ฐธ๊ณ ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ CGI์™€๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ
  • ์›น ์„œ๋ฒ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๊ฐ„์—์„œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์‹  ๋ฐ˜ํ™˜

WSGI & ASGI

  • django-admin startproject ๋ฅผ ํ†ตํ•ด ์ƒ๊ธฐ๋Š” ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” asgi.py์™€ wsgi.py๊ฐ€ ์ƒ์„ฑ๋จ
  • django๋Š” ์›นํ”„๋ ˆ์ž„์›Œํฌ์ผ ๋ฟ์ด๋ฏ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์›น ์„œ๋ฒ„๊ฐ€ ํ•„์š”
    • ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์›น ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Python์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
    • ๊ทธ๋ž˜์„œ ๊ทธ ์‚ฌ์ด์—์„œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ด๋ฃจ์–ด์ค„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”
      • ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋˜์–ด์ฃผ๋Š” ๊ฒƒ์ด WSGI์™€ ASGI

WSGI

  • ์›น ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์ฃผ์š” ํŒŒ์ด์ฌ ํ‘œ์ค€
    • ๋™๊ธฐ(Synchronous)์‹ ์ฝ”๋“œ๋งŒ ์ง€์›
  • WSGI๋Š” HTTP ์Šคํƒ€์ผ๋กœ request/response ํ˜•์‹์— ๊ณ ์ •๋˜์–ด ์žˆ์Œ
    • ์ฆ‰ , ๋‹จ์ผ ์ฒ˜๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•œ ๋™๊ธฐ ํ˜ธ์ถœ ๋ฐฉ์‹
    • ๊ทธ๋ž˜์„œ ๊ธด ๋Œ€๊ธฐ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š” HTTP ์—ฐ๊ฒฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ
  • HTTP๋Š” Connection์ด ์งง๊ฒŒ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Long-Polling HTTP์™€ Web Socket ๊ฐ™์ด ์ƒ๋Œ€์ ์œผ๋กœ connection์ด ๊ธด ํŠน์„ฑ์„ ์ง€๋‹Œ Protocol๊ณผ๋Š” ๋งž์ง€ ์•Š์•˜์Œ
  • HTTP Request๋Š” application ๋‚ด๋ถ€์—์„œ ์˜ค์ง ํ•˜๋‚˜์˜ path๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๊ฐœ์˜ path๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” Web Socket์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์—ˆ์Œ

ASGI

  • Django ์‚ฌ์ดํŠธ์—์„œ ๋น„๋™๊ธฐ Python ๊ธฐ๋Šฅ๊ณผ ๋น„๋™๊ธฐ Django ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ์นœํ™”์  ํ‘œ์ค€
  • request/response๋กœ ์ด๋ฃจ์–ด์ง„ WSGI์™€ ๋‹ฌ๋ฆฌ ASGI๋Š” send/receive๋กœ ๋˜์–ด ์žˆ์–ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, ๊ทธ๋กœ์ธํ•ด ์—ฌ๋Ÿฌ ์†ก์ˆ˜์‹  ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ€๋Šฅ
  • WSGI์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์„ค๊ณ„๋˜์–ด์žˆ์œผ๋ฉฐ asgiref ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ASGI ์„œ๋ฒ„ ๋‚ด์—์„œ WSGI๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•จ
  • django 3.0 ์—์„œ๋ถ€ํ„ฐ Channels ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์€ ASGI ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด ์ง„ ๊ฒƒ
    • ๊ธฐ์กด์˜ HTTP ํ†ต์‹ ์„ ๋„˜์–ด, ์›น ์†Œ์ผ“, ์ฑ„ํŒ… ํ”„๋กœํ† ์ฝœ, ioT ํ”„๋กœํ† ์ฝœ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

Tip! ์ถ”๊ฐ€ ๋‚ด์šฉ

Nginx & Gunicorn

  • WSGI๋Š” Python์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์›น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • WSGI Server๋Š” ์›น ์„œ๋ฒ„์™€ WSGI๋ฅผ ์ง€์›ํ•˜๋Š” ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•˜๊ณ  gunicorn, uwsgi ๋“ฑ์ด ์žˆ์Œ
  • gunicorn๋งŒ ์žˆ์–ด๋„ http request๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆœ ์žˆ์ง€๋งŒ, gunicorn์—๋Š” ์—†๊ณ  nginx์—๋Š” ์žˆ๋Š” ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ๋‘˜์„ ์—ฐ๋™ํ•ด์„œ ์”€
    • โ‘  djangodml media, css ๋“ฑ staticํ•œ ์š”์ฒญ์€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์ด๋‚˜๋ฏนํ•œ ์š”์ฒญ์„ gunicorn์— ๋„˜๊น€
      • gunicorn์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ˆœ๊ฐ„ ์ž์› ์‚ฌ์šฉ์ด ํฌ๊ฒŒ ๋Š˜์–ด staticํ•œ ์š”์ฒญ์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š”๊ฒŒ ์ค‘์š”
    • โ‘ก nginx๋Š” C๋กœ ๊ตฌํ˜„๋˜์–ด ์†๋„์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ๋›ฐ์–ด๋‚จ
  • ๋‘˜์„ ์—ฐ๋™ํ•˜๋ฉด ๋™์‹œ์— ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ณ , ํ›จ์”ฌ ์•ˆ์ •ํ™”๋œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
  • Django์˜ runserver๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค, ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ๋ผ nginx์—์„œ ์•„๋ฌด๋ฆฌ ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด๋„ ๊ฒฐ๊ตญ Django ๋‚ด์žฅ ์„œ๋ฒ„์—์„œ ๋ณ‘๋ชฉ์ด ์ƒ๊น€

Synchronous vs Asynchronous

  • ๋™๊ธฐ(Synchronous)์‹ ์ฝ”๋“œ๋ž€ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋ถ€ํ„ฐ ๋‚ด๋ ค์˜ค๋ฉฐ ์ฝ”๋“œ ์‹คํ–‰์ด ์ง„ํ–‰๋˜๋Š” ๋ฐฉ์‹์„ ๋งํ•จ
  • ๊ทธ์™€ ๋ฐ˜๋Œ€๋กœ ๋น„๋™๊ธฐ(Asynchronous)์  ์ฝ”๋“œ๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ๋™๊ธฐ์‹ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
  • ๋‘˜์€ ๋Ÿฐํƒ€์ž„์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ์‹œ๊ฐ„์— ๊ฐ€์žฅ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Œ
  • ๋™๊ธฐ์‹ ์ฝ”๋“œ๋Š” ์•ž์˜ ์ž‘์—…์ด ์•„์ง ๋๋‚˜์ง€ ์•Š์œผ๋ฉด ๋’ค๋Š” ๊ฐ€๋งŒํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์•ผ ํ•จ
    • ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€์™€ ๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ , ์ฝ”๋“œ์˜ ํŒŒ์•…์ด ์‰ฌ์›€
    • ๊ทธ๋ž˜์„œ ํ‰์†Œ python์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งค๋•Œ print() ๋“ฑ์œผ๋กœ breakpoint ๋ฅผ ๋‘ฌ์„œ ํ•œ ๋‹จ๊ณ„์”ฉ ๋””๋ฒ„๊น…์„ ํ•˜๋ฉฐ ์—๋Ÿฌ๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Œ
  • ๋ฐ˜๋ฉด ๋น„๋™๊ธฐ์‹ ์ฝ”๋“œ๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ์ž‘์—…์ด๋ผ๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๋™์‹œ์— ์ข…๋ฃŒ๋  ํ•„์š”๋„ ์—†์Œ
    • ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์‹œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ
profile
๐ŸŒฑ Backend-Dev | hwaya2828@gmail.com

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