Django에서 WebSocket과 채팅 기능 구현 (Django Channels)
1. 개요
Django는 기본적으로 HTTP 요청/응답 모델을 기반으로 동작하지만, WebSocket을 이용하면 실시간 통신이 가능합니다. Django에서 WebSocket을 활용하기 위해서는 Django Channels를 사용해야 합니다. 이 글에서는 Django Channels를 이용하여 실시간 채팅 기능을 구현하는 방법을 설명하겠습니다.
2. Django Channels란?
Django Channels는 Django에 비동기 기능을 추가하는 확장 라이브러리로, WebSocket과 같은 프로토콜을 지원합니다. 기본적인 Django는 동기적인 WSGI 기반이지만, Channels를 사용하면 비동기 ASGI 서버를 활용할 수 있습니다.
3. 프로젝트 환경 설정
먼저 Django 프로젝트를 생성하고 Django Channels를 설치하겠습니다.
3.1 프로젝트 생성 및 설정
# 가상 환경 생성 및 활성화
python -m venv venv
source venv/bin/activate # Windows에서는 `venv\Scripts\activate`
# Django 및 Django Channels 설치
pip install django channels
3.2 Django 프로젝트 생성
django-admin startproject chat_project
cd chat_project
3.3 Django Channels 설정
Django 프로젝트를 ASGI 서버로 실행할 수 있도록 Django Channels를 설정해야 합니다. 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 = 'chat_project.asgi.application'
# Channels Layer 설정 (기본적으로 Redis를 사용함)
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
4. ASGI 설정 파일 작성
Django 프로젝트의 기본 실행 파일은 wsgi.py이지만, Django Channels를 사용하려면 asgi.py 파일을 수정해야 합니다.
chat_project/asgi.py 파일을 수정합니다.
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'chat_project.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(chat.routing.websocket_urlpatterns),
})
5. 채팅 앱 생성 및 WebSocket 설정
5.1 채팅 앱 생성
python manage.py startapp chat
5.2 chat/routing.py 작성
Django의 urls.py와 유사하게 WebSocket 라우팅을 위한 파일을 생성합니다.
from django.urls import path
from chat.consumers import ChatConsumer
websocket_urlpatterns = [
path("ws/chat/<str:room_name>/", ChatConsumer.as_asgi()),
]
5.3 WebSocket Consumer 구현
chat/consumers.py 파일을 생성하고 다음과 같이 WebSocket 핸들러를 작성합니다.
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = f'chat_{self.room_name}'
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
async def receive(self, text_data):
data = json.loads(text_data)
message = data['message']
username = data['username']
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message,
'username': username
}
)
async def chat_message(self, event):
await self.send(text_data=json.dumps({
'message': event['message'],
'username': event['username']
}))
6. 프론트엔드 (HTML + JavaScript)
이제 WebSocket을 이용한 간단한 채팅 인터페이스를 구현해 보겠습니다.
6.1 chat/templates/chat/room.html 작성
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>채팅방</title>
</head>
<body>
<h1>채팅방</h1>
<input id="username" type="text" placeholder="이름 입력">
<div id="chat-log"></div>
<input id="chat-message-input" type="text">
<button id="chat-message-submit">전송</button>
<script>
const roomName = "testroom";
const username = document.getElementById("username");
const chatSocket = new WebSocket(
"ws://" + window.location.host + "/ws/chat/" + roomName + "/"
);
chatSocket.onmessage = function(e) {
const data = JSON.parse(e.data);
document.getElementById("chat-log").innerHTML += `<p><b>${data.username}:</b> ${data.message}</p>`;
};
document.getElementById("chat-message-submit").onclick = function() {
const messageInput = document.getElementById("chat-message-input");
chatSocket.send(JSON.stringify({
"message": messageInput.value,
"username": username.value || "익명"
}));
messageInput.value = "";
};
</script>
</body>
</html>
7. 서버 실행 및 테스트
python manage.py runserver
브라우저에서 http://127.0.0.1:8000/chat/room/을 열어 WebSocket 기반의 실시간 채팅을 테스트할 수 있습니다.
8. 마무리
이 글에서는 Django Channels를 활용하여 WebSocket 기반의 실시간 채팅 기능을 구현하는 방법을 살펴보았습니다. 추가적으로 Redis를 활용하여 성능을 개선하거나 인증 기능을 추가하는 방식도 고려할 수 있습니다. 앞으로 더 발전된 기능을 추가하며 Django에서의 실시간 통신을 활용해 보시길 바랍니다!
'Python > OpenCV' 카테고리의 다른 글
| OpenCV 모폴로지 연산 (침식, 팽창, 열기, 닫기) - OpenCV 활용 (0) | 2025.11.11 |
|---|---|
| OpenCV 윤곽선 그리기 및 특징 분석 (cv2.boundingRect(), cv2.minAreaRect()) (0) | 2025.11.10 |
| OpenCV 윤곽선 검출 (cv2.findContours()) (0) | 2025.11.09 |
| OpenCV로 색상 히스토그램 평탄화 (cv2.equalizeHist()) (0) | 2025.11.08 |
| OpenCV 이미지 히스토그램 분석 (cv2.calcHist()) (0) | 2025.11.07 |