마주침
웹 개발을 본격적으로 시작하기 전, 주 언어가 python이였고 그렇기에 한 번쯤은 django를 이용하여 웹 개발을 해야하지 않을까 해서 공부를 하기 시작했다.
처음 들어갈 때 기본이 되는 파일들을 공부를 하고 있을 때, 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