DRF에서 WebSocket을 지원하는 방법과 Django Channels 기본 설정
Django 프로젝트에서 Django Channels를 사용하여 WebSocket을 지원하는 방법과 기본 설정에 대해 다룹니다. WebSocket과 REST API의 차이점, Django Channels 설치 및 설정, WebSocket 라우팅 설정 등을 단계별로 설명합니다.
1. WebSocket이란? REST API와의 차이점
웹 애플리케이션에서 데이터를 주고받는 대표적인 방식으로 REST API와 WebSocket이 있습니다. 하지만 WebSocket은 REST API와는 근본적으로 다르게 동작합니다.
REST API
- HTTP 요청/응답 기반의 통신
- 클라이언트가 요청을 보내야 서버가 응답을 함 (Request-Response 모델)
- 비동기 실시간 통신이 어렵고, 주기적인 폴링이 필요함
WebSocket
- 클라이언트와 서버가 항상 연결된 상태 유지
- 실시간 양방향 통신 지원
- 채팅, 알림, 스트리밍 같은 실시간 기능에 적합
즉, WebSocket을 사용하면 Django 기반의 DRF 프로젝트에서도 실시간 기능을 추가할 수 있습니다. 하지만, DRF는 기본적으로 WebSocket을 지원하지 않기 때문에 Django Channels를 사용해야 합니다다.
2. Django에서 WebSocket을 지원하려면?
Django는 기본적으로 동기식(WSGI 기반) 웹 프레임워크이기 때문에, 비동기 WebSocket을 직접 지원하지 않습니다. 이를 해결하기 위해 Django Channels를 사용하면 됩니다.
Django Channels란?
Django를 비동기 방식으로 확장하여 WebSocket과 같은 실시간 기능을 추가할 수 있도록 해주는 라이브러리
Django Channels를 사용하면 WebSocket 통신을 처리할 수 있는 비동기 Consumer를 만들 수 있습니다. 또한, Redis를 활용하여 여러 개의 WebSocket 연결을 관리할 수 있습니다.
3. 프로젝트 설정 및 필수 라이브러리 설치
먼저 Django 프로젝트를 생성하고, Django Channels와 Redis를 설치합니다.
3.1. 프로젝트 생성
1
2
3
4
5
6
7
8
9
10
11
# 가상환경 활성화 (선택 사항)
python -m venv venv
source venv/bin/activate # Mac/Linux
venv\Scripts\activate # Windows
# Django 프로젝트 생성
django-admin startproject myproject
cd myproject
# 앱 생성 (예: 채팅 기능을 위한 앱)
python manage.py startapp chat
3.2. Django Channels 및 Redis 설치
1
pip install channels channels-redis
설치가 완료되면, Django의 ASGI 설정을 변경해야 합니다.
4. Django 프로젝트에 Channels 적용
4.1. settings.py
설정
Django 프로젝트에서 Channels를 활성화하려면 settings.py
파일을 수정해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'channels', # Django Channels 추가
'chat', # 생성한 앱 추가
]
# ASGI 설정
ASGI_APPLICATION = 'myproject.asgi.application'
# Redis를 WebSocket 메시지 브로커로 사용
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer", # 개발용: InMemory 사용
# 실제 배포에서는 Redis 사용
# "BACKEND": "channels_redis.core.RedisChannelLayer",
# "CONFIG": {"hosts": ["redis://localhost:6379"]},
},
}
ASGI 설정: Django 기본 WSGI를 ASGI로 변경해야 WebSocket을 사용할 수 있음.
CHANNEL_LAYERS 설정: 메시지 브로커 역할을 하는 백엔드를 설정해야 WebSocket이 여러 사용자에게 동작할 수 있음.
5. asgi.py
파일 수정
Django 프로젝트의 asgi.py
파일을 수정하여 Channels를 사용할 수 있도록 설정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# asgi.py
import os
import django
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
application = ProtocolTypeRouter({
"http": get_asgi_application(), # 기존 HTTP 요청 처리
# WebSocket은 나중에 추가할 예정
})
이제 Django가 WSGI 대신 ASGI 애플리케이션으로 실행될 준비가 되었습니다.
6. WebSocket 라우팅 설정 (초기 설정)
Django Channels는 WebSocket 요청을 처리하기 위해 라우팅 파일이 필요합니다.
6.1. routing.py
파일 생성
chat
앱 내부에 routing.py
파일을 만들어 WebSocket URL을 설정합니다.
1
2
3
4
5
6
7
8
# chat/routing.py
from django.urls import re_path
from chat import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/$', consumers.ChatConsumer.as_asgi()),
]
6.2. asgi.py
에서 WebSocket 라우팅 추가
이제 asgi.py
에 WebSocket 라우팅을 추가해야 합니다.
1
2
3
4
5
6
7
8
9
# asgi.py
from channels.routing import ProtocolTypeRouter, URLRouter
from chat.routing import websocket_urlpatterns
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(websocket_urlpatterns), # WebSocket 라우팅 추가
})
이제 WebSocket 요청을 받을 준비가 완료되었습니다.
7. 다음 단계
이제 Django 프로젝트에 Django Channels 및 WebSocket 라우팅이 설정됨. 하지만 아직 WebSocket 요청을 처리하는 Consumer(핸들러)가 없기 때문에, 다음 글에서 Django WebSocket Consumer 구현 및 DRF와의 연동을 다룰 예정입니다.
다음 글: Django에서 WebSocket Consumer 구현 및 DRF와 연결
- WebSocket을 처리하는 Consumer 생성
- 메시지를 송수신하는 로직 구현
- Django에서 WebSocket 요청을 관리하는 방법
정리 WebSocket은 REST API보다 실시간 통신에 적합함
Django에서 WebSocket을 사용하려면 Django Channels가 필요함
ASGI 설정 및 Redis를 활용한 메시지 브로커 설정 완료
WebSocket 요청을 처리할 라우팅 설정 완료