개발일기

[channels] 실시간 단체채팅방 구현하기(1) 본문

Project Portfolio

[channels] 실시간 단체채팅방 구현하기(1)

츄98 2023. 6. 19. 06:39

채팅을 구현하기 위해서 필요한 라이브러리

라이브러리

  • channels = {extras = ["daphne"]}
  • channels-redis

 

각 라이브러리를 사용한  이유:

- channels = {extras = ["daphne"]}

  • 실시간 비동기로 들어오는 ws/wss 프로토콜을 장고에서 대응하기 위해 사용
  • 장고 channels는 웹을 넘어, 모든 통신 프로토콜을 지원한다.
  • ASGI 기반의 라이브러리로서, HTTP/웹소켓 프로토콜을 손쉽게 처리할 수 있도록 기능 지원한다.
  • channels: 장고 통합 레이어
  • daphne: ASGI 서버 (channels 4.0부터 장고/채널스 개발서버로서 사용)
    => 실서비스에서는 daphne 명령이나 gunicorn/uvicorn 명령을 사용하여, 장고 서버가 구동된다.

- channels-redis

  • 채널스, 채널 레이어 Redis 백엔드 라이브러리
  • Django Channels의 내장 메시지 브로커로 Redis를 사용
  • Redis에서 Pub/Sub(게시-구독) 패턴을 사용하여 Django Channels에서 처리하는 WebSocket 연결 및 비동기 처리와 같은 작업에 이용한다.
  • 채팅 서비스에서는 프로세스 간의 통신이 필요하기에 필수 (channels 구동에는 필수 x)
  • Redis의 Pub/Sub는 메세지를 "전달하는" 시스템이기에 메세지를 보관하지 않는다.
    => 지난 채팅 메세지 조회가 필요하다면, 메세지를 DB에 넣어두고 필요할 때 조회해야 한다.

 

채팅 서비스의 핵심: 실시간 메세징

WebSocket: 실시간, 양방향 통신

  • 연결이 유지되는 동안, 양방향 통신 지원
  • 클라이언트/서버 상호 간에 즉시성이 높은 데이터 전송
  • HTTP와 동일한 포트(80/443) 사용

 

WSGI와 ASGI의 차이

WSGI ASGI
Synchronous 파이썬 HTTP 웹에 대한 파이썬 표준 WSGI의 정신적 계승자
HTTP 요청/응답의 단일 처리만 가능한 방식 HTTP 프로토콜 뿐만 아니라 웹소켓 등의 다양한 프로토콜을 지원할 수 있는 기반을 제공
웹소켓 등을 지원할 수 없는 구조 WSGI과의 호환성 지원과 더불어
Asynchronous / Synchronous 모두에 대한 파이썬 표준을 제공

즉, ASGI는 파이썬 비동기웹의 표준이기에 모든 비동기 파이썬 웹프레임워크의 기반이 된다.

 

 

Redis 서버 구동 방법

  • Redis Enterprise Cloud의 Free Plan 사용
  • 로컬에 직접 설치
    - 도커 활용
    - OS용 배포판 설치 (윈도우는 WSL 활용)

내 경우, Redis Cloud의 Free Plan을 사용하고, 도커를 활용해 서버 구동을 했다.

 

먼저, redis cloud의 free plan을 사용해보자!

redis 서버를 만들 때, 기억해야하는 정보: host, port, password

레디스 채널레이어를 설정할 때 필요하기 때문이다. 위 정보는 subscriptions에서 확인할 수 있다.

host, port 정보는 Public endpoint에서 확인할 수 있고, Public endpoint를 알고 있으면 문제없다.

 

이 정보들은 .env로 관리하자

CHANNEL_LAYER_REDIS_URL="redis://유저명:암호@호스트명:포트번호"
# 더 쉽게 설명하자면
CHANNEL_LAYER_REDIS_URL="redis://유저명:암호@Public endpoint"

 

Window에서 Redis 서버 구동 방법

redis에서는 공식적으로 윈도우 배포판을 지원하지 않는다.

윈도우를 쓰지만, 내부적으로는 리눅스를 사용해야 한다. 윈도에서 redis 서버를 구동하는 방법으로는

 

1) WSL 2를 통해 리눅스 배포판을 설치

- 마이크로소프트의 WSL 2 설치 공식 가이드 : WSL2 설치 | Microsoft Learn

 

WSL 설치

wsl --install 명령을 사용하여 Linux용 Windows 하위 시스템을 설치합니다. Ubuntu, Debian, SUSE, Kali, Fedora, Pengwin, Alpine 등 원하는 Linux 배포판에서 실행되는 Windows 머신에서 Bash 터미널을 사용할 수 있습니

learn.microsoft.com

2) 도커를 활용하여 컨테이너로 redis 서버 구동

- 도커에도 WSL 2가 필요하다.

- 도커 설치 공식 가이드:  Download Docker Desktop | Docker

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

- 도커만 설치되어있다면, 명령어 1줄로 redis 서버 구동 가능하다.

docker run -d -restart always -name redis7 -publish 6379:6379 redis:7

 

Mac에서 Redis 서버 구동 방법

1) 도커를 활용해 컨테이너로 redis 서버 구동 

2) homebrew를 통한 설치

# https: /brew.sh 참고하여 homebrew 설치
$ brew -version # brew 설치 확인
$ brew install redis # brew 통해서 Redis 설치

# 서버 구동 방법 #1) foreground로 레디스 서버 구동 : 간단히 서버 구동할 목적
$ redis-server

# 서버 구동 방법 #2) launchd (맥 데몬/에이전트 관리자)를 통해 서비스 시작/정지
$ brew services start redis # redis 서비스 시작
$ brew services info redis # redis 서비스 상태 조회
$ bre services stop redis # redis 서비스 제거

 

여기까지 채팅 서비스를 위한 모든 준비가 끝났다.

다음 글에서는 초코더쿠 프로젝트에서 채팅 서비스를 어떻게 구현했는지 설명하는 시간을 갖겠다~!!

 

[다음글로 바로가기 =>]

2023.06.19 - [Project Portfolio] - [channels] 실시간 단체채팅방 구현하기(2)