[Python] REST API ๊ฐœ๋ฐœ๋กœ ์•Œ์•„๋ณด๋Š” WSGI, ASGI

๋ฐ˜์‘ํ˜•

REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์ œ ํŠน์ • ์–ธ์–ด๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•  ํ•„์š” ์—†์ด ์›ํ•˜๋Š” ์–ธ์–ด๋กœ ์ž์œ ๋กญ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ์ƒ์ด ์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Python ์–ธ์–ด ๋˜ํ•œ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ REST API ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋งŽ์ด ์กด์žฌํ•˜์ง€๋งŒ ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋ณดํŽธํ™” ๋˜์–ด ์•Œ๋ ค์ง„ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

  • Django
  • Flask

Django๋Š” MTV ํŒจํ„ด์„ ์ œ๊ณตํ•˜์—ฌ API ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•˜์—ฌ ์ •์  HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋ทฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜์—ฌ ๋น ๋ฅธ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ๋†’์€ ์ƒ์‚ฐ์„ฑ์„ ์ž๋ž‘ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Flask๋Š” ์˜ค์ง API๋งŒ์„ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•˜์—ฌ ๋น ๋ฅธ API ์„œ๋ฒ„๋งŒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด์ฃ .

 

Spring ๊ณ„์—ด์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์›น ์„œ๋น„์Šค๋ฅผ Tomcat ๋“ฑ์˜ WAS๋กœ ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”. ๊ณต๊ต๋กญ๊ฒŒ๋„ Python์—์„œ๋Š” ์ด๋Ÿฌํ•œ WAS๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์›น ์„œ๋ฒ„์™€ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

 

 

 

CGI์™€ FastCGI

์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์›น ์„œ๋ฒ„(nginx, Apache ๋“ฑ)์™€ ์—ฐ๊ฒฐํ•  ๋–„ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณดํ†ต CGI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค 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์™€๋Š” ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

์ด๋Ÿฌํ•œ WSGI๋กœ ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  1. nginx, apache์—์„œ ๋‚ด์žฅ ๋ชจ๋“ˆ๋กœ ์ œ๊ณตํ•˜๋Š” server-often high profile ๋ฐฉ์‹ (ex: mod-wsgi, mod-python ๋“ฑ)
  2. Python ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ Web App Server (ex: gunicorn, 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์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” Websocket ํ”„๋กœํ† ์ฝœ๊ณผ HTTP 2.0์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. 

 

 

Uvicorn

The lightning-fast ASGI server. Introduction Uvicorn is a lightning-fast ASGI server implementation, using uvloop and httptools. Until recently Python has lacked a minimal low-level server/application interface for asyncio frameworks. The ASGI specificatio

www.uvicorn.org

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

 

 

 

 

๋งˆ์น˜๋ฉฐ...

Python์„ ์ด์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. 

 

Python์—์„œ๋„ Java์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๋ณด์ด๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ์— ๋Œ€์•ˆ์œผ๋กœ WSGI์˜ ์ƒ์œ„์ธ ASGI๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๊ณ , ์ด๋ฏธ ๋ช‡๋ช‡ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ง€์›์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ Python ์ง„์˜์— ์™€์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ๋งก๊ฒŒ ๋˜์—ˆ์ง€๋งŒ Python๋„ Java์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹ ๊ฒฝ์จ์ค˜์•ผ ํ•  ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ์ด๊ฒƒ์ €๊ฒƒ ๊ณต๋ถ€๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ ‡๊ฒŒ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”. ์ฐจํ›„ Python ํฌ์ŠคํŠธ๋กœ REST API ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•œ ์‚ฝ์งˆ๊ธฐ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ธ€์„ ์จ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments