Stofka는 Upbit API를 활용해 📡 실제 거래소의 코인 데이터를 수집하고, 이를 Kafka 기반 데이터 파이프라인으로 실시간 처리하여 📊 시각화하는 프로젝트입니다.
이 프로젝트의 핵심 목적은
✅ 대용량 실시간 데이터 처리 경험을 쌓고,
✅ 안정적인 스트리밍 아키텍처를 직접 구현하는 것입니다.
- 📥 실시간 코인 시세 수집 및 가공
- 🧵 Kafka를 통한 데이터 스트리밍 처리
- 🖥️ 차트 UI를 통한 실시간 시세 시각화
- ⚙️ 고속 데이터 흐름에 적합한 구조 설계 및 구현
실시간 비트코인 시세 시각화 시스템 외부 API에서 수신한 비트코인 시세 데이터를 Kafka로 처리하고, 이를 실시간으로 사용자에게 시각화하여 제공하는 데이터 스트리밍 플랫폼입니다.
-
📡 실시간 데이터 수집 외부 WebSocket API로부터 비트코인 시세 데이터를 수신
-
🔁 Kafka 기반 스트리밍 처리 수신한 데이터를 Kafka로 전송하여 안정적인 비동기 처리
-
📤 SSE(Server-Sent Events) 전송 Kafka Consumer가 데이터를 처리하여 클라이언트에 실시간 푸시
-
📊 프론트엔드 실시간 시각화 React + Chart.js 기반의 실시간 비트코인 시세 차트 구현
-
🛠️ 모니터링 시스템 구축 Prometheus와 Grafana를 활용해 Kafka, PostgreSQL, Redis, WAS Pod의 성능과 상태를 시각화
![]() |
![]() |
||
|---|---|---|---|
| 어태규 @EOTAEGYU |
유호준 @wns5120 |
임하은 @imhaeunim |
오현두 @HyunDooBoo |
- Spring Boot: 캔들 생성 로직 및 Kafka Consumer 구성
- Kafka / Kafka Connect: 실시간 시세 데이터 스트리밍 및 PostgreSQL 연동
- PostgreSQL: 분/시/일봉 데이터 저장
- Redis: 실시간 데이터 캐싱 및 중간 상태 저장
- Grafana: 시스템 지표 시각화
- Prometheus: 메트릭 수집 및 Grafana 연동
- Alertmanager: 이상 상황 알림 설정
- Kubernetes (K8s): 서비스 컨테이너 오케스트레이션
- ArgoCD: GitOps 방식의 자동 배포
- NGINX: 리버스 프록시 및 트래픽 라우팅
- Git: 버전 관리
- 사용스택: 사용자용 시각화 페이지 구성
- 업비트 WebSocket API를 통해 초단위
candle데이터를 수신 - 수신된 데이터는 Kafka Producer가
market_ticker토픽에 전송
- Kafka Consumer 그룹이 데이터를 구독
- Redis에 최신 시세 상태 저장 (현재가, 전일가, 초캔들 데이터)
- 동시에 PostgreSQL에 초봉 데이터 저장 (
market_candle_1s)
- pg_cron을 사용해 일정 주기마다 분/시/일봉 데이터를 생성
1분 → 3분 → 5분 → ... → 일봉순으로 계층적 집계
- 생성된 캔들은 PostgreSQL의 각각의 테이블에 저장
- 프론트엔드에서 특정 종목과 캔들 간격(예: 1분, 3분 등)을 요청하면, Redis에서 우선적으로 데이터를 조회
- Redis에 존재하지 않으면, PostgreSQL에서 가장 최신의 N개 데이터를 조회
- 조회된 데이터는 Redis에 다시 캐싱하여 다음 요청 시 빠른 응답 가능
- 이 구조를 통해 성능 최적화와 데이터 일관성을 동시에 달성
- SSE(Server-Sent Events)를 통해 클라이언트에 실시간 시세 및 캔들 데이터 전송
- Kafka 메시지를 종목별로 분기해 ticker, candle, postgres-candle 이벤트로 전달
- 클라이언트는 수신 데이터를 차트에 실시간 반영하여 지연 없이 시각화
- Alertmanager가 이상 징후 감지 시 알림 전송
- ArgoCD를 통해 GitOps 기반 CI/CD 구성
- 3개의 브로커를 사용하여 Kafka 클러스터를 구성했으며, 브로커 장애가 일어나도 정상적으로 운영할 수 있는 고가용성 환경을 구성했습니다.
- 카프카의 안정적인 운영을 위해 prometheus에서 metric을 수집하고 grafana에 저장소로 등록하여 대시보드를 생성했습니다.
영속 데이터는 PostgreSQL에, 휘발성 실시간 데이터는 Redis에 저장하여 부하를 분산했습니다. Redis에는 TTL과 메모리 관리 정책을 도입했습니다.
- 업비트 API에서 1/3/5분 등 캔들 데이터를 제공하지만 API 호출로 매번 데이터를 받아와야 합니다. 또한 호출 제한 횟수가 있어 실직적으로 사용하기 어렵습니다.
- 실시간으로 들어오는 1초 단위 캔들 데이터를 PostgreSQL에 저장 후, 1초 데이터 60개로 1분 캔드 생성, 1분 봉으로 3/5/15분 캔들을 생성하며 1일 캔들까지 생성합니다.
- PostgreSQL에서 pg_cron을 사용하여 자동으로 캔들을 생성하였습니다.
아래 문서를 통해 캔들 생성 과정을 자세히 확인할 수 있습니다.





