django channels를 이용하여 비동기적 채팅을 구현해보았다.
실시간 채팅을 구현하기 위해 WebSocket을 사용하였고 django 프로젝트에서 이를 가능하게 해주기 위해 channels 라이브러리를 알아보았다.
WebSocket
은 프로토콜로서, 실시간으로 데이터를 양방향 통신 할 수 있게 해주는 기술 입니다.
Socket
이란 쉽게 생각해서 통신을 위한 통로이며, 이를 Web에도 적용했다고 생각하면 된다.
Web 환경은 필요한 정보를 HTTP 기반으로 Request/Response로 연결하여 데이터를 주고 받아 네트워크의 연결을 유지하지 않는 특징을 가지고 있어 실시간으로 데이터를 주고 받기에는 WebSocket
이 필요하게 된 것이다.
WebSocket
이 Client
와 Server
간의 접속을 유지하는 방법은 HandShake
이다.
이 과정을 통해 연결을 유지함으로서 방화벽과 같은 환경에서도 연결을 유지할 수 있고, HandShaking 과정을 살펴면 Client는 랜덤한 키 값을 전송하고 Server는 키 값으로 생성된 토큰을 Client에게 Response 한다.
Channels
는 django
에서 HTTP 프로토콜이 아닌 다른 프로토콜을 사용할 수 있게 해준다.
WebSocket
은 프로토콜의 일종으로서 이를 사용하기 위해 Channels를 이용하였다.
위 사진에서 확인시 Channel Layer
가 생겨 일반적인 http messages
외에도 websocket messages
를 처리할 수 있게 된다.
ASGI( Asynchronous Server Gateway Interface )
는 WSGI(Web Server Gateway Interface)
를 계승한 것으로 비동기 방식으로 실행된다.
웹 서버와 python 응용프로그램 간의 표준 인터페이스를 제공하기 위해 Django Channels
와 배포에 사용되는 Daphne 서버
에서 정의한 사양으로서 HTTP, HTTP/2 및 WebSocket와 같은 프로토콜을 지원한다.
ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로서 connect, send, receive, disconnect가 있다.