DJango 서버개발, 웹소켓을 통한 실시간 채팅 애플리케이션 만들기

최근 웹 애플리케이션 개발에서 실시간 기능을 요구하는 경우가 많습니다. 그 중에서도 웹소켓(WebSocket)은 클라이언트와 서버 간의 전이중 통신을 가능하게 하여 실시간 애플리케이션 개발에 매우 유용합니다. 본 글에서는 Django를 활용하여 웹소켓을 통한 실시간 채팅 애플리케이션을 만드는 방법에 대해 자세히 다루겠습니다.

1. Django와 웹소켓 소개

Django는 파이썬 기반의 웹 프레임워크로, 장고를 사용하면 개발자가 빠르게 웹 애플리케이션을 구축할 수 있습니다. 그러나 Django의 기본 기능만으로는 웹소켓 통신을 처리할 수 없습니다. 이러한 이유로 Django Channels라는 패키지를 사용하여 웹소켓을 처리합니다.

1.1 웹소켓이란?

웹소켓은 웹 브라우저와 서버 간의 통신을 이루는 프로토콜로, HTTP와 달리 양방향 통신을 지원합니다. 이를 통해 클라이언트와 서버 간의 데이터 전송이 즉각적으로 이루어져, 실시간 업데이트가 필요한 애플리케이션에 적합합니다.

2. Django 프로젝트 설정

이제 본격적으로 Django 프로젝트를 설정해보겠습니다. 아래 단계를 따라 하세요.

2.1 새 Django 프로젝트 생성

django-admin startproject chat_project

위의 명령어로 새 Django 프로젝트를 생성합니다. 프로젝트의 이름은 chat_project입니다.

2.2 Django Channels 설치

다음으로, Django Channels를 설치합니다. 아래 명령어를 사용하세요:

pip install channels

2.3 settings.py 수정

설치가 완료되면 settings.py 파일을 열어 다음과 같이 수정합니다:


INSTALLED_APPS = [
    ...
    'channels',
    'chat',  # 나중에 만들 앱 추가
]

ASGI_APPLICATION = 'chat_project.asgi.application'

2.4 asgi.py 생성

chat_project 디렉토리에 asgi.py 파일을 생성하고 아래와 같이 작성합니다:


import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from chat.routing import websocket_urlpatterns

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'chat_project.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

3. 채팅 애플리케이션 만들기

이제 실제로 채팅 애플리케이션을 만들기 위해 새 Django 앱을 생성하겠습니다.

3.1 채팅 앱 생성

python manage.py startapp chat

3.2 chat/routing.py 생성

chat 디렉토리 내에 routing.py 파일을 생성하고 다음 코드를 추가합니다:


from django.urls import re_path
from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()),
]

3.3 ChatConsumer 클래스 생성

chat 디렉토리에 consumers.py 파일을 생성하고 다음과 같이 작성합니다.


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 = 'chat_%s' % 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):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # 그룹에 메시지 전송
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

    async def chat_message(self, event):
        message = event['message']

        # WebSocket에 메시지 전송
        await self.send(text_data=json.dumps({
            'message': message
        }))

3.4 채팅 템플릿 만들기

이제 채팅 애플리케이션의 사용자 인터페이스를 위한 HTML 템플릿을 만들겠습니다. chat/templates/chat/ 디렉토리를 생성한 다음 room.html 파일을 만들고 다음 코드를 추가합니다.






    채팅룸
    


    

{{ room_name }} 채팅룸



4. URL 설정

이제 URL 설정을 완료하겠습니다. chat/urls.py 파일을 생성하고 다음과 같이 작성합니다:


from django.urls import path
from . import views

urlpatterns = [
    path('/', views.room, name='room'),
]

4.1 views.py 수정

views.py 파일을 수정하여 채팅룸 뷰를 추가합니다:


from django.shortcuts import render

def room(request, room_name):
    return render(request, 'chat/room.html', {
        'room_name': room_name
    })

4.2 메인 URL 설정

프로젝트의 메인 urls.py 파일을 수정하여 채팅 앱의 URL을 포함시킵니다:


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('chat/', include('chat.urls')),
]

5. Redis 설정 (옵션)

실시간 통신을 위해 Redis를 사용하는 것도 고려할 수 있습니다. Redis는 메시지 브로커로 사용되며, 다음과 같은 설정이 필요합니다. 먼저 Redis를 설치해야 합니다.

sudo apt-get install redis-server

그 후, Redis와 Channels를 통합하기 위해 다음 패키지를 설치합니다:

pip install channels-redis

그리고 settings.py에 다음을 추가합니다:


CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [("127.0.0.1", 6379)],
        },
    },
}

6. 서버 실행 및 테스트

모든 설정이 완료되면 Django 서버를 실행합니다. 아래 명령어를 사용하세요:

python manage.py runserver

그 후, 브라우저에서 http://127.0.0.1:8000/chat/{room_name}/에 접속하여 원하시는 방 이름을 입력하고 채팅을 시작할 수 있습니다.

결론

이번 튜토리얼에서는 Django를 사용해 웹소켓 기반의 실시간 채팅 애플리케이션을 만드는 방법을 배웠습니다. Django Channels를 활용하여 웹소켓을 설정하고, 클라이언트와 서버 간의 실시간 통신을 구현하는 과정을 상세히 설명했습니다.

더 나아가 여러분은 방 관리, 사용자 인증, 채팅 기록 저장 같은 기능을 추가하며 애플리케이션을 확장할 수 있습니다. 이 과정에서 Django의 강력한 기능과 웹소켓 통신의 이점을 극대화하세요.

이 튜토리얼에 친애하는 분들의 성공적인 웹 개발을 기원합니다!