비동기 서버 게이트웨이 인터페이스
IT 위키
ASGI(비동기 서버 게이트웨이 인터페이스, Asynchronous Server Gateway Interface)는 Python 웹 프레임워크와 서버 간의 비동기 통신을 가능하게 해주는 표준 인터페이스로, 기존 WSGI(Web Server Gateway Interface)의 한계를 극복하고 웹소켓, HTTP/2 등 비동기 기능을 지원하기 위해 설계되었다.
1 개요[편집 | 원본 편집]
ASGI는 Django, FastAPI, Starlette 같은 현대적인 Python 웹 프레임워크가 고성능 네트워크 프로그래밍과 실시간 웹 기능(예: 웹소켓)을 지원할 수 있도록 해준다. 비동기 함수(async def)와 함께 사용할 수 있으며, 멀티프로토콜 처리 구조를 가지고 있다.
2 역사[편집 | 원본 편집]
- WSGI는 Python 웹 표준으로 널리 사용되었으나, 동기 방식만 지원
- ASGI는 2016년 Django Channels 프로젝트의 일환으로 등장
- 현재는 Django, FastAPI, Starlette, Quart 등에서 사용되고 있음
3 특징[편집 | 원본 편집]
- 비동기/동기 모두 지원 — async/await 기반의 처리를 기본으로 하고, 기존 WSGI 앱과의 호환성도 제공
- 웹소켓 지원 — 실시간 채팅, 스트리밍 등에 적합
- 멀티 프로토콜 — HTTP, HTTP/2, WebSocket 등 다양한 프로토콜 처리 가능
- 스코프(Scope) 구조 — 요청, 연결 등에 대한 정보를 딕셔너리 형태로 전달
- 이벤트 기반 구조 — 요청 처리 흐름이 event loop를 기반으로 비동기 실행됨
4 구조[편집 | 원본 편집]
ASGI 애플리케이션은 다음과 같은 구조를 가진다.
async def app(scope, receive, send):
assert scope["type"] == "http"
await receive() # 요청 수신
await send({ # 응답 전송
"type": "http.response.start",
"status": 200,
"headers": [[b"content-type", b"text/plain"]],
})
await send({
"type": "http.response.body",
"body": b"Hello, ASGI!",
})
5 사용 예시[편집 | 원본 편집]
ASGI 앱은 일반적으로 Uvicorn, Daphne, Hypercorn 같은 ASGI 서버를 통해 실행된다.
5.1 FastAPI 예제 실행[편집 | 원본 편집]
uvicorn main:app --reload
5.2 Django ASGI 설정 (asgi.py)[편집 | 원본 편집]
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()
6 주요 ASGI 서버[편집 | 원본 편집]
- Uvicorn — 빠르고 가벼운 ASGI 서버, FastAPI와 자주 사용됨
- Daphne — Django Channels용으로 개발된 ASGI 서버
- Hypercorn — Quart 프레임워크에서 주로 사용됨
7 같이 보기[편집 | 원본 편집]
8 참고 문헌[편집 | 원본 편집]
- https://asgi.readthedocs.io
- https://www.python.org/dev/peps/pep-3333/ (WSGI)
- https://www.python.org/dev/peps/pep-484/ (Type Hints)
- Django Channels, ASGI Introduction