실시간 웹 애플리케이션을 위한 Node.js WebSocket 활용
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- *대상**: 실시간 채팅, 게임, IoT 등 실시간 업데이트가 필요한 웹 애플리케이션 개발자
- *난이도**: 중급 (Node.js 기초와 WebSocket 개념 이해 필요)
핵심 요약
- WebSocket은 HTTP보다 실시간성 향상 (양방향 통신, 낮은 지연 시간)
ws
라이브러리로 Node.js 기반 WebSocket 서버 구현 가능 (단순하고 가볍게)- Socket.IO는 자동 Fallback, 방(Room) 관리, 재연결 기능 제공 (복잡한 실시간 앱 권장)
- Pub/Sub 패턴은 데이터 흐름을 라디오 채널처럼 관리하여 확장성 향상
섹션별 세부 요약
1. HTTP의 한계와 WebSocket의 필요성
- HTTP는 상태 없는 프로토콜 → 매 요청마다 연결 재설정 → 지연 시간 증가
- WebSocket은 TCP 기반 양방향 연결 유지 → 즉시 데이터 전송 가능 (예: 채팅, 게임)
- 성능 비교: WebSocket은 1ms 이내 지연, HTTP polling은 초 단위 지연
2. HTTP polling과 SSE의 한계
- Short Polling: 주기적으로 요청 → 높은 오버헤드 (TLS, 헤더 재설정)
- Long Polling: 요청 유지 → 대기 시간 감소 (legacy 시스템에 유리)
- SSE: 서버에서 클라이언트로만 데이터 전송 → 실시간 댓글, 주식 시세 등에 적합
3. Node.js WebSocket 서버 구현 예시
ws
라이브러리 사용:npm install ws
설치 후 서버 생성- 코드 예시:
```javascript
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ server });
wss.on('connection', socket => {
socket.send(JSON.stringify({ welcome: 'hello' }));
});
```
- 기능: 클라이언트 연결 시 메시지 전송, 모든 클라이언트에게 메시지 브로드캐스트
4. `ws` vs Socket.IO 비교
ws
장점:
- 가볍고 최소한의 오버헤드 (20 kB 미만)
- RFC 6455 프로토콜 준수
- Socket.IO 장점:
- 자동 Fallback (Long Polling 지원)
- 방(Room) 및 네임스페이스 관리 내장
- 재연결, 헬트체크 자동 처리
- 선택 기준:
- ws
: 고성능 마이크로서비스, 커스텀 프로토콜 필요 시
- Socket.IO: 복잡한 실시간 앱, 자동 Fallback 필요 시
5. Pub/Sub 패턴 구현
- 구조:
- DJs (발행자) → 특정 주제(topic)에 메시지 발행
- Listeners (구독자) → 주제에 구독하여 메시지 수신
- 코드 예시:
```javascript
const channels = {};
function publish(topic, msg) {
(channels[topic] || []).forEach(ws => ws.send(msg));
}
function subscribe(ws, topic) {
channels[topic] = [...(channels[topic] || []), ws];
}
```
- 사용 사례: 채팅 방, 게임 로비, IoT 센서 데이터, 실시간 랭킹 등
결론
- WebSocket은 실시간 애플리케이션의 핵심 기술 →
ws
로 가볍게 시작, 복잡한 기능이 필요하면 Socket.IO 사용 - Pub/Sub 패턴으로 데이터 흐름 관리 → 확장성과 유지보수성 향상
- 실무 팁:
ws
는 단순한 통신, Socket.IO는 자동 Fallback과 방 관리가 필요한 경우 선택하여 사용하세요.