Socket.IO 핵심 기능 - upgrade, recoverable reconnection

Seong Hoon Jung·2025년 2월 20일

1. Socket.IO 개요

Socket.IO는 클라이언트와 서버 간에 이벤트 기반(Event-driven) 양방향 통신을 가능하게 해주는 라이브러리입니다. 이를 통해 실시간 애플리케이션에서 원활한 데이터 교환이 가능합니다.

주요 전송 방식으로는 long-pollingWebSocket을 사용합니다. WebSocket이 더 빠르고 효율적이지만, 특정 환경에서는 이를 사용할 수 없는 경우가 있습니다. 따라서 Socket.IO는 기본적으로 long-polling을 이용한 후, WebSocket이 가능하면 자동으로 업그레이드합니다.

2. 업그레이드 메커니즘 (Upgrade Mechanism)

Socket.IO는 다음 두 가지 전송 방식을 지원합니다:

보다 자세한 사항은 제가 작성한 글을 참고해 주세요
웹 브라우저에서의 통신 방법 (Polling, LongPolling, Streaming)

2.1 HTTP Long-Polling

HTTP long-polling 방식은 지속적인 HTTP 요청을 활용하여 데이터를 송수신하는 방식입니다.
long-polling 방식은 브라우저가 서버로 요청을 보낸 후, 서버가 즉시 응답하지 않고 데이터를 보낼 준비가 될 때까지 대기하는 방식으로 동작합니다. 이로 인해 WebSocket보다 상대적으로 높은 지연시간이 발생할 수 있지만, 모든 환경에서 안정적으로 동작할 수 있다는 장점이 있습니다.

2.2 WebSocket

WebSocket은 양방향 실시간 통신을 제공하는 프로토콜입니다.
클라이언트와 서버 간에 지속적인 연결이 유지됩니다.WebSocket은 기존의 HTTP 요청/응답 모델과 달리, 서버와 클라이언트가 언제든지 데이터를 주고받을 수 있도록 설계되었습니다. 따라서 빠른 응답이 필요한 실시간 애플리케이션에서 더욱 효율적인 성능을 제공합니다.

2.3 업그레이드 및 폴백 (Upgrade and Fallback)

초기 연결은 HTTP long-polling 방식으로 시작됩니다. 이후, WebSocket 연결이 가능하면 자동으로 WebSocket으로 업그레이드하여 더 빠르고 안정적인 연결을 제공합니다.

그러나 방화벽, 프록시, 네트워크 설정 등의 이유로 WebSocket 연결이 실패할 수 있습니다. 이 경우, 다시 HTTP long-polling 방식으로 폴백(Fallback) 하여 연결을 유지합니다.

이러한 동적 전환 기능 덕분에 Socket.IO는 네트워크 환경이 열악하거나 제한적인 경우에도 안정적인 연결을 보장할 수 있습니다.

3. 자동 재연결 및 상태 복구 (Automatic Reconnection & Connection State Recovery)

3.1 자동 재연결 (Automatic Reconnection)

네트워크 환경이 불안정하거나 서버가 일시적으로 다운되는 등의 이유로 WebSocket 연결이 끊어질 수 있습니다. Socket.IO는 Heartbeat 메커니즘을 활용하여 주기적으로 클라이언트와 서버의 연결 상태를 확인하고, 연결이 끊어졌을 경우 자동으로 재연결을 시도합니다.

이 과정에서 지수적 백오프(Exponential Back-off) 알고리즘을 적용하여 서버에 과부하가 걸리는 것을 방지합니다.

Socket.IO는 기본적으로 클라이언트의 재연결을 여러 차례 시도하며, 설정된 최대 재연결 횟수까지 연결을 복구하려고 합니다. 이를 통해 일시적인 네트워크 장애나 접속 문제로 인해 끊어진 연결을 자동으로 복구할 수 있습니다.

3.2 연결 상태 복구 (Connection State Recovery)

클라이언트가 예기치 않게 연결이 끊어졌을 경우, 서버는 클라이언트의 정보를 유지합니다.

  • Socket ID, Room 정보, Data 속성 등을 보존합니다.
  • 재연결 시 클라이언트의 이전 상태를 복원하려 시도합니다.
  • recovered 속성을 활용하여 복구 성공 여부를 확인할 수 있습니다.

서버는 클라이언트의 세션 정보를 일정 시간 동안 유지하며, 재연결이 이루어질 경우 상태를 복구합니다. 이를 통해 클라이언트는 끊어지기 전의 채팅방이나 참여 중이던 이벤트에 복귀할 수 있습니다. 단, 너무 오랜 시간 동안 재연결이 이루어지지 않는다면 세션 정보가 삭제될 수 있습니다.

3.2.1 사용 예시

const io = new Server(httpServer, {
  connectionStateRecovery: {
    // 클라이언트 세션 및 패킷 보존 시간 (2분)
    maxDisconnectionDuration: 2 * 60 * 1000,
    // 복구 성공 시 미들웨어 생략 여부
    skipMiddlewares: true,
  }
});

3.3 패킷 버퍼링 (Packet Buffering)

클라이언트가 연결이 끊어진 동안 서버에서 전송해야 했던 이벤트를 저장하고 있다가, 재연결이 이루어지면 해당 이벤트들을 다시 전송합니다. 이를 통해 사용자는 연결이 끊어졌어도 놓친 데이터를 다시 받을 수 있습니다.

패킷 버퍼링 기능은 특히 실시간 채팅 애플리케이션, 온라인 협업 도구 및 다중 사용자 게임과 같은 환경에서 유용합니다. 사용자가 일시적으로 네트워크를 잃더라도, 중요한 메시지나 게임 내 이벤트를 놓치지 않도록 해줍니다.

4. 정리

Socket.IO는 강력한 실시간 양방향 통신 기능을 제공하며, 자동 업그레이드, 자동 재연결, 상태 복구, 패킷 버퍼링 등의 기능을 통해 신뢰성을 극대화합니다. 네트워크 환경이 불안정한 경우에도 연결 상태를 유지하고 데이터를 보존하는 기능이 뛰어나기 때문에, 실시간 채팅, 온라인 게임, 협업 도구 등 다양한 애플리케이션에서 폭넓게 사용됩니다.

참고한 글

profile
Seek first his kingdom and his righteousness

0개의 댓글