악! Django 실시간채팅 앱 만들기 (1)

Dev_Gony·2024년 3월 5일
0

Django

목록 보기
2/4
post-thumbnail

Django 웹 소켓을 이용해 채팅서비스 만들어보자go go go go


채팅 서비스의 핵심은 뭐다?
실시간 메세징이다

서버에서 웹 클라이언트로 메세지를 전달하려는 방법은 크게 4가지
(HTTP 1.1 기준) 웹 프로토콜인 HTTP는 항상 클라이언트로부터의 요청에 서버가 응답하는 구조

  • HTTP Polling (실시간 X)
  • HTTP Long Polling
  • HTTP Streaming
  • Web Socket (실시간 O)

Django Channels 에서 기본적으로 제공하고 실시간 메세징이 가능한 Web Socket을 이용할거임

그럼 이 Web Socket이 어디에 쓰였냐 아 아 아 아 아 아

배민쇼핑라이브 채팅 : 웹소켓 + Redis PubSub 에 사용됐다 이 말 말 말!

그러니 나도 한 번 배민쇼핑라이브 기술 써보자아가주악악!!!!!!!


Redis Pub/Sub
서버 단에서 채팅방의 다른 유저에게 메세지를 뿌리는 역할
유저로의 전달은 웹소켓이 담당

  • 레디스 특정 채널에 구독신청을 하면 구독자(Subscriber)가 됨. 레디스 특정 채널에 메세지를 발행(Publish)하면, 구독 중인 구독자에게 메세지가 전달됩니다. ex) 유튜브 구독

  • 레디스의 Pub/Sub는 메세지를 "전달하는" 시스템이기에 메세지를 보관안함!! 안함 안함!!
    지난 채팅 메세지 조회가 필요하다면, 메세지를 DB에 넣어두고 필요할 때 조회

  • 서버 대수를 늘려 Horizontal로 손쉬운 Scale out을 지원


  1. 유저가 웹소켓을 통해 메세지를 송신하면
  2. Consumer Instance에서 Pulish하여 Redis Pub/Sub 보내고
  3. 다시 Consumer Instance 를 거쳐서
  4. 다른유저에게 웹소켓을 통해 실시간으로 메세지를 수신


ASGI (비동기 서버 게이트웨이 인터페이스)

  • 파이썬 웹 프레임워크의 새로운 프로토콜

  • ASGI는 파이썬 비동기 웹의 표준이기에 모든 비동기 파이썬 웹프러임워크의 기반
    -장고 Channels는 웹을 넘어, 모든 통신 프로토콜을 지원할 수 있습니다
    -Channels 기본에서 HTTP와 WebSocket을 지원합니다.

  • 장고는 wsgi / asgi 모두를 기본에서 잘 지원하며, 원하는 방식으로 구동 가능
    -장고의 일반적인 뷰 처리는 (django, djangorestframework 등) WSGI 방식이 성능이 더 잘나올 수도 있다고 함!


이번 채팅에 사용 할 Channels 는

  • ASGI 기반의 라이브러리로서, HTTP/웹소켓 프로토콜을 손쉽게 처리할 수 있도록 기능 지원
    -장고 네이티브한 방법으로 웹소켓 지원
  • 2022년 10월에 버전 4.0.0 릴리즈
    -장고 버전에 맞춰 릴리즈되었을 뿐, 버전 3.x와 기능은 거의 유사
  • 파이썬 3.7 이상, 장고 2.2 이상을 지원 (가급적 최신버전 추천)

사용할 라이브러리

# 장고 프레임워크
django~=4.1.0

# 채널스 기본 라이브러리 + daphne
channels[daphne]~=4.0.0

# 채널스, 채널 레이어 Redis 백엔드 라이브러리
channels_redis~=4.0.0

# 환경변수의 손쉬운 settings 적용
django-environ

# 장고 내에서 손쉬운 bootstrap5 사용
django-bootstrap5

# 가벼운 HTTP 클라이언트 라이브러리
requests

# HTML 파싱 라이브러리
beautifulsoup4

# 테스트
pytest
pytest-django
pytest-testdox
pytest-asyncio

자 그럼 다음 시간부터 가보자 gogogogogogogogogogo곡!

profile
잔디심는 코린이

0개의 댓글

관련 채용 정보