Django에서의 비동기처리

송용진·2025년 6월 14일

Python / Django

목록 보기
5/23

Django에서의 비동기처리

Django 비동기 처리

기존의 Django는 전통적인 WSGI (동기적) 기반이었지만,
이제는 ASGI (비동기) 를 지원하면서 다음과 같은 장점이 생겼음
• 동시에 여러 요청을 효율적으로 처리 가능
• WebSocket, HTTP/2, SSE 같은 실시간 프로토콜 지원
• IO-bound 작업에서 성능 향상

Django 비동기 지원 영역

Django 구성요소 비동기 지원 여부 비고
Views (CBV/FBV) 지원 Django 3.1부터 async def 사용 가능
ORM 부분 지원 Django 4.1 이후 async ORM 일부 지원
Middleware 지원 async def middleware 작성 가능
Templates 미지원 여전히 동기적
WSGI vs ASGI ASGI 필요 Channels, Daphne

예제

1. 비동기 View

from django.http import JsonResponse
import asyncio

async def my_async_view(request):
    await asyncio.sleep(1)  # 비동기 작업 예시
    return JsonResponse({'message': 'Hello async!'})

2.비동기 ORM

from myapp.models import MyModel

async def my_view(request):
    obj = await MyModel.objects.aget(id=1)
    return JsonResponse({'name': obj.name})

기존의 get() 대신 aget() 을 사용
acreate(), aupdate(), adelete() 등 비동기 ORM 메서드 존재

3.WebSocket

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        ...

WebSocket 처리는 전형적인 비동기임
AsyncWebsocketConsumer 가 바로 비동기 컨슈머

비동기의 주의점

•	스레드 안정성 (Thread safety): ORM 등 일부 동기 코드와 섞일 때 주의
•	외부 라이브러리: 일부 라이브러리는 비동기를 지원하지 않음
•	병렬성: asyncio를 잘못 사용하면 오히려 병목 발생 가능

Django ASGI 전체 흐름 요약

사용자 요청 → ASGI 서버 (Daphne/Uvicorn 등) → Django ASGI Application → Async View, Async ORM, Channels 등 처리

Django에서 비동기를 왜 쓰는가?

동기적 처리 비동기적 처리
I/O 대기 동안 블로킹 I/O 대기 중 다른 작업 가능
단순함 성능 효율적
전통적인 웹 페이지에 적합 WebSocket, API 서버 등에 유리

실전에서는 언제 쓰는가?

•	실시간 채팅
•	알림 시스템
•	외부 API 호출
•	파일 업로드, 다운로드
•	크롤링 등 I/O-bound 작업

추가로 공부할 키워드

•	ASGI, Django Channels, Uvicorn, Daphne
•	asyncio, await, aiohttp
•	asgiref, database_sync_to_async()
profile
개발자

0개의 댓글