Skip to content

03. 소켓통신

coflskim edited this page Apr 14, 2023 · 2 revisions

슬랙은 WebSocket 프로토콜을 사용하여 클라이언트(웹, 데스크톱 앱, 모바일 앱 등)와 서버 간의 실시간 통신을 가능하게 합니다. 클라이언트와 서버는 이 프로토콜을 통해 지속적으로 연결 상태를 확인하고 메시지를 주고받습니다.

  1. 슬랙 애플리케이션을 종료하거나 로그아웃한 경우: 애플리케이션을 종료하거나 로그아웃하면 클라이언트와 서버 간의 WebSocket 연결이 끊어집니다. 서버는 이 연결 끊김을 감지하고 사용자를 오프라인 상태로 처리합니다.
  2. 인터넷 연결이 끊긴 경우: 인터넷 연결이 끊기면 클라이언트와 서버 간의 WebSocket 연결도 끊어집니다. 이러한 경우 서버는 연결이 끊어진 것을 감지하고 해당 사용자를 오프라인 상태로 처리합니다.

WebSocket 연결이 끊어졌을 때 서버는 일정 시간 동안 클라이언트로부터 연결 재시도를 기다립니다. 만약 일정 시간 내에 연결이 복구되지 않으면, 서버는 해당 사용자를 오프라인으로 간주합니다. 클라이언트와 서버 간의 연결 상태를 실시간으로 확인하므로, 이러한 변경 사항은 슬랙 내에서 거의 즉시 반영됩니다.

소켓 통신

socket 통신

  • 서버와 클라이언트가 특정 port를 통해 실시간으로 양방향 통신하는 방식
  • 클라이언트만 요청을 보낼 수 있는 http 통신과 달리 서버도 클라이언트로 요청 보낼 수 있다.
  • 실시간 통신이 필요한 경우에 사용된다. (예: 실시간 스트리밍, 실시간 채팅)
  • 실시간 통신이 필요한 상황에서 http 통신을 하면 계속 연결을 요청하는 부하가 걸리기 때문에 소켓 통신이 적절함.

http 통신

  • http는 client의 요청이 있을 때만 서버가 응답하는 단방향 통신 방식
  • 서버로부터 응답을 받으면 연결이 바로 종료됨
  • 실시간 연결이 아닌 필요한 경우에만 server로 요청이 보내는 상황에 유용

주요 용어

Namespace

  • 트래픽을 격리하여 구분할 때 사용되는 단위
  • 기본 namespace는 ‘/’

room

  • 소켓이 참여할 수 있는 채널 (namespace 하위 개념)
  • 같은 namespace안에서 같은 room에 참여한 소켓들과 소통 가능
    • 채널에 참여한 다른 클라이언트로 broadcast 할 수 있다.
  • 한 소켓이 여러 채널에 참여 가능하다.
client.to(특정 룸).emit(message)
// emit: 메시지 broadcast
  • 서버에서 사용하는 개념 (클라이언트는 room 리스트에 접근 불가)

event

  • 송수신하는 이벤트의 이름
  • 구분된 namespace이면 event이름이 같아도 됨.