이 저장소는 외부 라이브러리 없이 자체 구현한 Web Server + WebSocket Server를 사용해 가상 주식 시세를 1초 단위로 전송하는 예제 프로젝트입니다. 같은 기능을 Python, Node.js, 그리고 .NET(C#)으로 각각 구현해 비교 학습할 수 있도록 구성되어 있습니다.
- 외부 라이브러리(패키지) 미사용 — 표준 라이브러리만 사용하여 WebSocket 핸드셰이크/프레임을 직접 구현
- 정적 파일(
static/) 서빙 기능 포함 (웹 브라우저에서 실시간 시각화 가능한 간단한 UI 제공) datas/stocks.json의 초기 데이터를 읽어 1초마다 난수 기반으로 시뮬레이션된 가격을 갱신- 각 언어 구현은 동일한 JSON 메시지 포맷으로 업데이트를 전송
-
.NET (C#)
- 프로젝트:
dotnet/(dotnet/Program.cs) - 개발 실행 포트(사용자 변경): http://localhost:5000
- WebSocket 엔드포인트: ws://localhost:5000/
- 정적 파일 루트:
static/(프로젝트에서 상대 경로로 설정되어 있음)
- 프로젝트:
-
Python
- 파일:
python/main.py - 포트: 5020
- WebSocket 엔드포인트: ws://localhost:5020/
- 정적 파일:
static/(서버 루트에서 제공)
- 파일:
-
Node.js
- 파일:
node/main.js - 포트: 5010
- WebSocket 엔드포인트: ws://localhost:5010/
- 정적 파일:
static/
- 파일:
서버는 1초마다 아래와 같은 JSON 객체를 텍스트 프레임으로 전송합니다.
예시:
{
"index": 101.23,
"stocks": [
{
"name": "삼송전자",
"code": "005930",
"price": 70200,
"change": 200,
"change_rate": 0.29,
"high": 70500,
"low": 70000
},
...
]
}
- 필드 설명
index: 초기 시가총액 기반으로 계산한 가상 지수 (소수 2자리)stocks: 주식 배열name: 종목명code: 종목 코드price: 현재가 (정수)change: 직전 대비 변동값change_rate: 변동률 (백분율, 소수 2자리)high: 당일 최고가low: 당일 최저가
다음 예시는 Windows PowerShell(또는 적절한 쉘)에서의 실행 방법입니다.
- .NET(C#) 서버
cd dotnet
# 실행 전에 stocks.json이 필요합니다. 저장소의 datas/stocks.json을 복사해 넣습니다.
copy ..\datas\stocks.json .\stocks.json
# dotnet 9 SDK 이상이 설치되어 있어야 합니다
dotnet run서버가 시작되면 http://localhost:5000/ 에서 정적 페이지를 확인할 수 있고, WebSocket 엔드포인트는 ws://localhost:5000/ 입니다.
- Python 서버
# python 폴더로 이동
cd python
# 필요: Python 3
python main.py서버가 시작되면 http://localhost:5020/ 에서 정적 페이지를 확인할 수 있고, WebSocket 엔드포인트는 ws://localhost:5020/ 입니다.
- Node.js 서버
cd node
# Node.js가 설치되어 있어야 합니다 (버전 권장: 최신 LTS)
node main.js서버가 시작되면 http://localhost:5010/ 및 ws://localhost:5010/ 로 접근할 수 있습니다.
datas/stocks.json- 초기 주식 데이터 (예제 데이터)static/- 브라우저 UI(정적 파일)python/main.py- Python 구현 (표준 라이브러리만 사용)node/main.js- Node.js 구현 (내장 모듈만 사용)dotnet/Program.cs- .NET(C#) 구현 (minimal APIs + WebSockets)
-
각 구현은 WebSocket 핸드셰이크(Upgrade, Sec-WebSocket-Accept) 및 텍스트 프레임 형식(간단한 FIN + payload length + payload)을 직접 생성/전송합니다. 따라서 실제 상용 수준의 WebSocket 라이브러리(프레그먼트 처리, 마스킹 처리, 프로토콜 예외 등)를 완벽히 대체하지는 않습니다. 교육/샘플 목적에 맞춰 최소한의 기능만 구현했습니다.
-
브라우저 클라이언트는 표준 WebSocket API를 사용해 메시지를 수신하면 됩니다. 예)
new WebSocket('ws://localhost:5020/')
Server-Sent Events(SSE) 버전이 궁금하다면 @bluetsys/serversentevents-sample 저장소를 참고하세요.
| 구분 | WebSocket | Server-Sent Events (SSE) |
|---|---|---|
| 전송 방향 | 양방향(Full Duplex) | 단방향(서버 → 클라이언트) |
| 프로토콜 | ws://, wss:// (WebSocket 프로토콜) | http://, https:// (HTTP/1.1 기반) |
| 브라우저 지원 | 모든 최신 브라우저 지원 | 대부분 브라우저 지원 (IE, Edge 구버전 미지원) |
| 연결 개수 | 제한 없음(일반적으로 1:1) | 브라우저당 최대 6~10개(HTTP 커넥션 제한 영향) |
| 데이터 포맷 | 텍스트/바이너리(자유롭게 전송 가능) | 텍스트(UTF-8, SSE 포맷 한정) |
| 실시간성 | 매우 우수(지연 거의 없음) | 우수(HTTP 스트림 기반, 지연 적음) |
| 지속성 | 연결 유지 필요(Keep-Alive) | 연결 유지 필요(Keep-Alive) |
| 자동 재연결 | 직접 구현 필요 | 브라우저가 자동 지원 |
| 방화벽/프록시 | 일부 환경에서 차단될 수 있음 | 기존 HTTP 인프라와 완벽 호환 |
| 로드밸런싱 | 별도 설정 필요(세션스티키 등) | HTTP 기반이므로 기존 LB와 호환성 우수 |
| 보안(SSL) | 별도 ws/wss 프로토콜 사용 | 기존 https 사용(구성 간단) |
| 서버 구현 난이도 | 복잡(핸드셰이크, 버퍼, 프레임 등 직접 처리) | 단순(HTTP 응답 스트림만 유지하면 됨) |
| 모바일 친화성 | 배터리, 네트워크 환경에 민감(재접속 필요 시 불편) | HTTP/2 미지원 환경에서는 커넥션 제한 영향 |
| 대용량/대규모 | 알맞은 선택(게임, 채팅 등) | 브로드캐스트/알림 등에 적합 |
| 바이너리 지원 | 지원 | 미지원 |
| 브라우저 API | WebSocket | EventSource |
| HTTP/2 지원 | 제한적(웹소켓은 HTTP/2 업그레이드 불가) | HTTP/2 지원(커넥션 공유 가능) |
총평
- WebSocket: 양방향, 실시간, 게임/채팅/양방향 제어 등 복잡한 실시간 통신에 적합
- SSE: 서버 → 클라이언트 알림, 실시간 모니터링, 단방향 이벤트 등에 적합, 구현이 쉽고 HTTP 인프라 활용에 강점
- WebSocket 메시지 압축 및 프래그먼트 처리 지원 추가
- 인증/권한(토큰 기반) 추가
- 더 현실적인 시뮬레이션 (거래량, 호가, 주문서 등) 추가
- 단일 코드베이스에서 언어별 차이점 정리한 문서 추가
이 프로젝트는 오픈소스이며, 교육 및 연구 목적으로 자유롭게 사용할 수 있습니다. 단 쿠팡 빼고 매출 규모 10조원 이상 기업에서 이용시 10억원의 이용료를 받을 수 있습니다.
