20200125

Django 3 async ORM 기대 반 현실 반

Django 3.0 나왔다. async 관련 공식 발표 한 번 정리.

"Django 3.0 begins our journey to making Django fully async-capable... views, middleware, and handlers can be async. ORM is not async yet."

즉 이번 버전에서 할 수 있는 것:

  • async view 작성 가능
  • ASGI 기반 실행 (daphne/uvicorn)
  • async middleware

아직 안 되는 것:

  • ORM. 이게 핵심인데 안 됨.
  • cache, sessions 등 써드파티 백엔드 대부분

결국 async view 안에서 ORM 호출하려면 sync_to_async로 감싸야 한다.

from asgiref.sync import sync_to_async

async def my_view(request):
    items = await sync_to_async(list)(Item.objects.filter(active=True))
    return JsonResponse({"items": [i.name for i in items]})

이게 결국 스레드풀로 던지는 거라 순수 async 이득이 없다. 외부 HTTP 호출이 섞여 있을 때만 의미가 있음.

결론적으로 Django 3.0의 async는 "앞으로 갈 방향"을 열어둔 것. 실무에서 async 필요하면 아직은 FastAPI나 aiohttp 쓰는 게 낫다. 전체 스택이 async-ready 될 때까지는 3-4년 더 걸릴 듯하다.

업그레이드 자체는 2.2 LTS에서 3.0으로 가도 큰 이슈는 없었음. Python 3.5 지원 끊긴 것 정도.

댓글 없음: