Socket 프로젝트를 시작하기 전에 먼저 알아봤던 Socket.io 에 대하여 정리해보려 한다.
👉 Socket.io 란?
Socket.IO는 클라이언트와 서버 간의 low-latency , 양방향 , 이벤트 기반 통신을 가능하게 하는 라이브러리이다.
Socket.io의 연결은 다양한 low-level transports를 통해 설정될 수 있습니다.
- HTTP long-polling
- WebSocket
- WebTransport
Socket.IO는 다음 사항에 따라 사용 가능한 가장 적합한 low-level transports를 자동으로 선택합니다.
- 브라우저의 기능
- 네트워크(일부 네트워크는 WebSocket 및/또는 WebTransport 연결을 차단함)
👉 Socket.io 와 WebSocket
WebSocket과 Socket.io를 헷갈려할 수 있는데, Socket.io는 WebSocket을 더 편리하고 안전하게 사용할 수 있는 라이브러리이다. 하나 더, Socket.IO는 가능한 경우 전송에 WebSocket을 사용하지만 각 패킷에 추가적인 메타데이터를 추가한다. 따라서 WebSocket 클라이언트는 Socket.IO 서버에 연결할 수 없으며, Socket.IO 클라이언트는 일반 WebSocket 서버에도 연결할 수 없다.
WebSocket과 달리 Socket.io는 다음과 같은 기능을 제공한다.
- http long-polling
- WebSocket 연결을 설정할 수 없는 경우 커넥션은 HTTP long-polling으로 변경됨
- Automatic reconnection
- Socket.IO에는 연결 상태를 주기적으로 확인하는 heartbeat 메커니즘이 포함되어 있음
- 클라이언트가 연결이 끊어지면 서버에 과부하가 걸리지 않도록 지수적 백오프 지연을 거쳐 자동으로 다시 연결됩니다.
- Packet buffering
- 클라이언트의 연결이 끊어지면 패킷이 자동으로 버퍼링됨
- 다시 연결되면 전송
- Acknowledgements
- 이벤트를 보내고 응답을 받는 편리한 방법을 제공
- Broadcasting
- 서버 측에서는 연결된 모든 클라이언트나 일부 클라이언트에 이벤트를 보낼 수 있음
- Multiplexing
- 네임스페이스를 사용하면 애플리케이션 로직을 단일 공유 연결로 분할 가능
👉 Socket.io 작동 원리
Socket.IO 코드베이스는 두 개의 계층으로 나뉜다.
- the low-level plumbing: Socket.io 내부 엔진인 Engine.io
- the high-level API: Socket.IO 자체
Engine.io
Engine.io는 서버와 클라이언트 간의 low-level connection을 설정한다.
- 다양한 transports와 업그레이드 매커니즘
- the disconnection detection (단절 감지)
Transports
현재 구현된 transport는 두 가지이다.
- http long-polling
연속적인 http 요청( get 서버로부터 데이터를 수신하기 위한 장기 실행 요청, post 서버로부터 데이터를 전송하기 위한 단기 실행 요청 )으로 구성된다. 전송 특성상 연속적인 방출이 연결되어 동일한 http 요청으로 전송될 수 있다.
- WebSocket
서버와 클라이언트 간에 양방향 및 low-latency 저지연 통신 채널을 제공하는 WebSocket 연결로 구성된다.
전송 특성상 각 방출은 자체 WebSocket 프레임으로 전송된다.
Handshake
Engine.io 연결이 시작될 때 서버는 일부 정보를 전송한다.
{
// 세션의 ID, 모든 후속 http 요청의 쿼리 매개변수에 포함되어야함
"sid": "FSDjX-WRwSA4zTZMALqx",
// 서버에서 지원하는 모든 전송 목록이 포함
"upgrades": ["websocket"],
// 이 값들은 하트비트 매커니즘에서 사용됨
"pingInterval": 25000,
"pingTimeout": 20000
}
Upgrade mechanism
기본적으로 클라이언트는 http long-polling 전송을 통해 연결을 설정한다.
Engine.io는 안정성과 사용자 경험에 우선적으로, 다음으로는 UX 개선과 서버 성능 향상에 초점을 맞춘다.
업그레이드 하기 위해선 클라이언트가 다음을 수행해야한다.
- 나가는 버퍼가 비어있는지 확인
- 현재 전송이 읽기 전용 모드로 전환
- 다른 운송 수단과 연결을 설정하려 시도함
- 성공하면 첫번째 전송을 닫음
Disconnection detection
- 하나의 HTTP 요청(GET 또는 POST)이 실패하는 경우
- WebSocket 연결이 닫힐 때
- socket.disconnect()서버 측 또는 클라이언트 측에서 호출될 경우
위와 같은 경우에는 Engine.io 연결이 닫힌 것으로 간주된다.
서버와 클라이언트 간의 연결이 여전히 작동 중인지 확인하는 heartbeat 메커니즘도 있다.
지정된 간격(pingInterval handshake에서 전송되는 값)마다 서버는 PING 패킷을 전송하고, 클라이언트는 몇 초(pingTimeout값) 동안 PONG 패킷을 회신한다. 서버가 PONG 패킷을 수신하지 못하면 연결이 끊어진 것으로 간주한다. 반대로, 클라이언트가 PING 패킷을 수신하지 못하면 pingInterval + pingTimeout연결이 끊어진 것으로 간주한다.
Socket.io
Socket.io는 Engine.io에 비해,
- 자동 재연결
- 패킷 버퍼링
- acknowledgments
- 모든 클라이언트 또는 일부 클라이언트에 broadcasting
- 멀티플렉싱
과 같은 기능을 제공합니다.
마무리 하며
다음 포스트에서는 Socket.io 기본 사용법과 관련한 간단한 Socket 프로젝트를 구현해보는 포스트를 업로드하겠습니다

감사합니다 o((>ω< ))o
'Development > Back-end' 카테고리의 다른 글
| [Spring Boot] Redis를 사용한 로그아웃 구현하기 (0) | 2025.07.23 |
|---|---|
| [Spring Boot] Pagination(페이지네이션) (0) | 2025.07.15 |
| [Express] 좋아요 기능 구현하기 (0) | 2025.06.06 |
| [Express] 알리고 API를 사용한 로그인/회원가입 구현하기 (0) | 2025.06.02 |
| [Express] 알리고 API 를 이용한 문자 서비스 예제 (0) | 2025.05.19 |