[python] Django REST framework에서의 소켓 통신(Socket communication) 방법

Django REST framework은 강력한 웹 프레임워크이지만, 때로는 실시간 통신을 위한 소켓 통신이 필요할 수 있습니다. 이 글에서는 Django REST framework에서 소켓 통신을 구현하는 방법에 대해 알아보겠습니다.

소켓 라이브러리 설치하기

먼저, 소켓 통신을 구현하기 위해 SocketIO라이브러리를 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다.

pip install django-socketio

Django 설정 변경하기

Django의 settings.py 파일에서 다음과 같은 설정을 추가해야 합니다.

INSTALLED_APPS = [
    ...
    'socketio'
]

MIDDLEWARE = [
    ...
    'socketio.contrib.django.middleware.SocketIOMiddleware'
]

# 소켓 관련 설정
SOCKETIO_ASYNC_MODE = 'threading'

소켓 통신 구현하기

Django REST framework와 소켓 통신을 함께 사용하기 위해서는 뷰(view)에서 소켓 통신을 처리해야 합니다. 다음은 간단한 예제 코드입니다.

from socketio.namespace import BaseNamespace
from socketio.mixins import BroadcastMixin
from django_socketio import events

class MyNamespace(BaseNamespace, BroadcastMixin):
    def __init__(self, *args, **kwargs):
        super(MyNamespace, self).__init__(*args, **kwargs)
    
    def on_connect(self):
        print('소켓 연결됨')
        self.emit('connected', {'data': '소켓 연결됨'})
    
    def on_disconnect(self):
        print('소켓 연결 해제됨')
        self.emit('disconnected', {'data': '소켓 연결 해제됨'})
        
@events.on_message(namespace='/my_namespace')
def message(request, socket, context, message):
    print('메시지 수신:', message)
    socket.emit('message_received', {'message': message['message']})

def my_view(request):
    return render(request, 'my_template.html')

위 코드에서 MyNamespace는 소켓 이벤트를 처리하는 데에 사용됩니다. on_connecton_disconnect는 소켓 연결 및 연결 해제에 대한 처리를 담당합니다. message는 메시지를 수신하는 이벤트입니다.

뷰 함수 my_view에서는 소켓 통신을 사용할 HTML 템플릿을 렌더링합니다.

클라이언트 측 구현

마지막으로, 클라이언트 측에서도 소켓 통신을 처리해야 합니다. 일반적으로 JavaScript를 사용하여 클라이언트 소켓 코드를 작성합니다. 다음은 간단한 예제 코드입니다.

// 소켓 연결
var socket = io.connect('http://localhost:8000/my_namespace');

// 연결 이벤트 리스너
socket.on('connect', function() {
    console.log('소켓 연결됨');
});

// 연결 해제 이벤트 리스너
socket.on('disconnect', function() {
    console.log('소켓 연결 해제됨');
});

// 메시지 수신 이벤트 리스너
socket.on('message_received', function(data) {
    console.log('메시지 수신:', data.message);
});

위 코드에서 io.connect는 서버의 소켓 연결 주소를 지정합니다. connectdisconnect 이벤트 리스너는 각각 소켓 연결과 연결 해제에 대한 처리를 담당합니다. message_received 이벤트 리스너는 서버로부터 메시지를 수신할 때 동작합니다.

이제 Django REST framework에서 소켓 통신을 구현하는 방법에 대해 알게 되었습니다. 소켓 통신을 사용하면 실시간으로 데이터를 전송하고 처리할 수 있어서 웹 애플리케이션의 사용자 경험을 향상시킬 수 있습니다.

참고 자료: