[Python] CGI, WSGI, ASGI

Geunhyung Pyun·2023년 9월 16일

Python

목록 보기
1/1

마주침

웹 개발을 본격적으로 시작하기 전, 주 언어가 python이였고 그렇기에 한 번쯤은 django를 이용하여 웹 개발을 해야하지 않을까 해서 공부를 하기 시작했다.

처음 들어갈 때 기본이 되는 파일들을 공부를 하고 있을 때, asgi.py라는 친구를 보게 된다.

# asgi.py

import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTIGNS_MODULE', 'djangoProject.settings')

application = get_asgi_application()

ASGI가 무엇이길래 기본으로 생성이 되며 어떤 역할을 하는지 의미는 어떤건지 알아보면서 더 나오는 내용들이 있길래 한 번 간단하게 정리해볼까 한다.

CGI (Common Gateway Interface)

  • 웹 서버 상에서 사용자 프로그램을 동작시키기 위한 조합
  • 서버에서 다른 프로그램을 불러낼 수 있고 그에 대한 결과를 클라이언트에 송신한다.
  • 가장 큰 단점으로 요청이 하나씩 들어올 때마다 프로세스가 하나씩 실행이 된다는 것이다. 이 부분은 스크립트 언어에서는 가장 큰 벽으로 다가온다. 스크립트 언어에서는 인터프리터를 사용하기 때문에 코드를 실행할 때마다 매번 해석해야 하기 때문이다.
  • 또한 유지보수가 단점으로 꼽힌다.
  • 이의 대표적인 예로는 Apache, Nginx가 있다.

WSGI (Web Server Gateway Interface)

  • 웹 서버 소프트웨어와 파이썬으로 작성된 응용 프로그램 간의 표준 인터페이스
  • 매개변수로는 2가지가 있고 application 함수를 제공하여 모든 구성요소가 자동으로 연결된다.
    • environ : 웹 서버가 제공하는 환경 변수와 현재 요청에 대한 정보가 포함된 사전
    • start_response : 클라이언트로 HTTP 응답을 보내는 작업을 시작하는 데 사용하는 함수
def application(environ, start_response):
	start_response('200 OK', [('Content-Type', 'text/plain')])
    return [b'Greetings universe']
  • 기존 Python 웹 어플리케이션 프레임워크는 웹 서버를 선택함에 있어서 제약이 있었다.
    - 상기 CGI의 단점이 있었고 CGI, FastCGI 등 커스텀 API 중 하나만 선택할 수 있었다.
  • CGI 디자인 패턴에 기반하여 업그레이드한 인터페이스
    - low-level에서 만들어졌기에 서버와 애플리케이션, 프레임워크 간의 벽이 어느 정도 허물어져서 사용하기가 CGI보다 편해졌다.
    • CGI와 달리 프로세스를 동시에 여러 개 처리할 수 있다.
  • 다만 단점도 존재한다.
    - 여러 프로세스를 동시에 처리할 수 있다 하지만 한 번에 하나의 요청과 응답을 처리하며 응답이 즉시 반환된다고 하기에 websocket, http 연결과 같이 장시간 지속되는 연결을 처리하는 방법이 없다.
    • 동기 전용이기에 멀티스레드여도 응답이 반환될 때 까지 각각의 연결들이 차단된다. 즉, 비동기로 프로세스를 처리를 하지 못한다.

ASGI (Async Server Gateway Interface)

  • WSGI는 비동기적으로 프로세스를 처리할 수 없는 단점이 있기 때문에 생겨난 인터페이스
  • 비동기 인터페이스로 WSGI와 같이 application 함수를 제공하며 3가지의 매개변수가 있다.
    • scope : 현재 요청에 대한 정보가 포함된 사전. enviorn과 비슷하나 세부적인 명명 규칙이 다르다.
    • send : 애플리케이션이 클라이언트로 메시지를 돌려보낼 수 있게 해주는 함수
    • receive : 애플리케이션이 클라이언트로 메시지를 받을 수 있게 해주는 함수
async def applcation(scope, send, receive):
	await send({
    	'type': 'http.response.start',
        'status': 200,
        'headers': [
        	[b'content-type', b'text/plain']
        ]
    })
  • 장기 실행 동기 호출같은 경우에는 asyncio.run_in_executor를 사용하여 해당 호출을 맡긴다. 그 외에는 비동기 친화적인 라이브러리를 사용하여 비동기 호출을 주로 한다.
  • Starlette, FastAPI, Quart, Django(3.0 이상)에서 지원한다.

참고

https://www.itworld.co.kr/news/245062

profile
개발자를 원하는 사람.

0개의 댓글