실시간 애플리케이션을 위한 Django Channels 이해
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Django Channels로 실시간 경험 구축
오늘날의 상호 연결된 세상에서 사용자는 웹 애플리케이션에 대한 동적이고 실시간적인 상호 작용을 기대합니다. 많은 사용 사례에 효과적인 기존 HTTP 요청-응답 주기는 라이브 채팅, 즉시 알림, 공동 작업 편집 또는 실시간 데이터 대시보드와 같은 기능에 있어서는 부족합니다. Django Channels는 Django의 기능을 WebSocket 및 기타 비동기 프로토콜을 처리하도록 확장하여 개발자가 진정으로 상호 작용적인 애플리케이션을 구축할 수 있도록 지원합니다.
이 문서는 Django Channels의 핵심 구성 요소인 소비자, 그룹 및 채널 레이어, 특히 Redis를 사용하여 원활한 실시간 통신을 촉진하기 위해 이러한 구성 요소가 어떻게 함께 작동하는지 설명합니다.
실시간 Django의 기반
Django Channels가 실시간 기능을 어떻게 조정하는지 이해하려면 기본 구성 요소를 이해하는 것이 필수적입니다.
-
소비자 (Consumers): Django Channels는 소비자라는 개념을 도입합니다. HTTP 요청에 대한 Django의 뷰와 유사하게, 소비자는 WebSocket 또는 기타 장기 실행 연결에서 이벤트를 처리하는 비동기 함수 또는 클래스입니다. 수신된 메시지(예: 사용자로부터의 채팅 메시지)에 애플리케이션이 어떻게 반응하고 메시지를 다시 보내는지를 정의합니다. 소비자는 일반적으로
consumers.py에 정의되며 동기식 또는 비동기식일 수 있지만, 성능을 위해 일반적으로 비동기식 소비자가 선호됩니다.# myapp/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 # Join room group await self.channel_layer.group_add( self.room_group_name, self.channel_name ) await self.accept() async def disconnect(self, close_code): # Leave room group 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'] # Send message to room group await self.channel_layer.group_send( self.room_group_name, { 'type': 'chat_message', 'message': message } ) # Receive message from room group async def chat_message(self, event): message = event['message'] # Send message to WebSocket await self.send(text_data=json.dumps({ 'message': message }))이 예에서
ChatConsumer는 채팅방에 대한 WebSocket 연결을 처리합니다.connect및disconnect는 그룹 참여 및 이탈을 관리하고,receive는 수신 채팅 메시지를 처리하며,chat_message는 연결된 클라이언트에 메시지를 보냅니다. -
그룹 (Groups): 그룹은 여러 소비자에게 동시에 메시지를 보내는 방법을 제공합니다. 개별 연결을 관리하는 대신 소비자를 명명된 그룹에 추가한 다음 해당 그룹으로 메시지를 보내 모든 멤버가 메시지를 수신하도록 할 수 있습니다. 이는 특정 방에 있는 모든 사람에게 채팅 메시지를 보내거나 연결된 모든 사용자에게 새 이벤트가 발생했음을 알리는 것과 같이 메시지를 브로드캐스트하는 데 매우 유용합니다. 그룹은 발신자와 개별 수신자를 분리하여 메시지 배포를 단순화합니다.
위의
ChatConsumer에서self.channel_layer.group_add는 현재 소비자를chat_room_name그룹에 추가합니다.self.channel_layer.group_send는 해당 그룹의 모든 사람에게 메시지를 브로드캐스트합니다. -
채널 레이어 (Channel Layers): 채널 레이어는 소비자 및 그룹이 서로 다른 Django 프로세스 간에 통신할 수 있도록 하는 백본입니다. 서로 다른 Django 애플리케이션 인스턴스 간에 메시지를 전달하는 시스템으로, 별도의 서버에서 실행되는 경우에도 마찬가지입니다. 채널 레이어가 없으면 한 프로세스에서 실행되는 소비자는 다른 프로세스에서 실행되는 다른 소비자에게 메시지를 보낼 수 없어 분산 실시간 애플리케이션 구축이 불가능합니다.
채널 레이어는 두 가지 기본 개념을 정의합니다.
- 채널 (Channels): 모든 소비자 인스턴스에는 고유한 채널 이름(예:
websocket.receive!kjkj2k3j2kl3j2)이 있습니다. - 그룹 (Groups): 설명한 대로 채널 이름의 명명된 컬렉션입니다.
메시지는 채널 또는 그룹으로 전송되며, 채널 레이어는 적절한 소비자(들)에게 메시지가 전달되도록 보장합니다.
- 채널 (Channels): 모든 소비자 인스턴스에는 고유한 채널 이름(예:
-
Redis (채널 레이어 백엔드): 채널 레이어는 추상적인 개념이지만 백엔드 구현이 필요합니다. Redis는 높은 성능, 인메모리 데이터 저장소 및 게시/구독 기능으로 인해 Django Channels에서 가장 많이 사용되고 권장되는 백엔드입니다.
Redis를 채널 레이어로 구성할 때:
- 메시지 전달: 소비자가 그룹으로 메시지를 보낼 때(예:
self.channel_layer.group_send), Django Channels는 이 메시지를 직렬화하고 Redis Pub/Sub 채널에 게시합니다. - 메시지 수신: 해당 Redis 채널을 구독하는 모든 Django Channels 프로세스(따라서 모든 소비자)는 메시지를 받습니다.
- 소비자에게 전달: 수신하는 Channels 프로세스는 메시지를 역직렬화하고 대상 그룹 또는 채널의 구성원인 특정 소비자 인스턴스로 라우팅합니다.
이 전체 프로세스는 비동기적으로 효율적으로 발생하여 Redis를 분산 실시간 통신에 탁월한 선택으로 만듭니다.
Redis를 채널 레이어로 구성하려면 일반적으로
settings.py에 다음과 같은 내용을 추가해야 합니다.# settings.py CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], }, }, }또한
channels_redis패키지를 설치해야 합니다 (pip install channels_redis).작동 원리: 사용자가 채팅 메시지를 보낸다고 상상해 보세요. 해당 사용자의 소비자의
receive메서드가 호출됩니다. 이 메서드는self.channel_layer.group_send를 사용하여 메시지를 관련 그룹으로 브로드캐스트합니다.RedisChannelLayer는 이 메시지를 직렬화하고 Redis로 푸시합니다. 해당 그룹의 Redis 채널을 구독하는 다른 Django 프로세스는 메시지를 수신하고, 역직렬화하며, 해당 프로세스의 범위 내에서 적절한 소비자(즉, 동일한 채팅방에 연결된 소비자)로 라우팅합니다. 그런 다음 이러한 소비자는chat_message메서드를 실행하여 해당 WebSocket 클라이언트로 메시지를 다시 보냅니다. - 메시지 전달: 소비자가 그룹으로 메시지를 보낼 때(예:
이러한 분산 통신 흐름은 소비자, 그룹 및 Redis를 채널 레이어로 사용하는 조합을 통해 가능해집니다.
애플리케이션 및 이점
소비자, 그룹 및 Redis의 시너지는 수많은 실시간 애플리케이션 시나리오를 구현할 수 있게 합니다.
- 라이브 채팅 애플리케이션: 시연한 것처럼 채팅방에 있는 여러 사용자가 즉시 메시지를 교환할 수 있습니다.
- 실시간 알림: 사용자에게 새 이벤트, 멘션 또는 상태 업데이트에 대한 즉각적인 경고를 보냅니다.
- 공동 작업 편집: 여러 사용자가 문서를 공동으로 편집할 수 있도록 하여 변경 사항이 실시간으로 전파되도록 합니다.
- 실시간 데이터 대시보드: 페이지 새로 고침 없이 데이터가 변경됨에 따라 대시보드의 차트, 그래프 및 통계를 업데이트합니다.
- 게임: 인스턴트 플레이어 간 통신으로 대화형 멀티플레이어 웹 게임을 구축합니다.
이점은 명확합니다. 더 매력적인 사용자 경험, 폴링으로 인한 서버 부하 감소, Django 생태계 내에서 직접 현대적이고 동적인 웹 애플리케이션을 구축할 수 있는 능력입니다.
결론
Django Channels는 소비자, 그룹 및 Redis를 활용하는 채널 레이어의 강력한 통합을 통해 Django를 전통적인 요청-응답 프레임워크에서 실시간 애플리케이션을 위한 강력한 플랫폼으로 탈바꿈시킵니다. 분산 프로세스 전반에 걸쳐 WebSocket을 처리하고 메시지 브로드캐스팅을 관리하는 구조화된 방법을 제공함으로써 개발자는 뛰어난 효율성과 확장성으로 매우 상호 작용적이고 동적인 사용자 경험을 만들 수 있습니다. 실시간 기능을 원활하게 통합하는 기능은 Django Channels를 현대 웹 개발에 귀중한 도구로 만듭니다.

