SHOOTOCK
쓰는 순간 잡아라, 슈탁!
1. Overview
SHOOTOCK 은 한국투자증권 Open API 를 이용하여 페이지 새로고침 없이 실시간으로 주식 데이터를 제공하는 서비스입니다. 프론트엔드는 React와 Socket.io를 사용하였고 백엔드는 Spring Boot 기반으로 Kafka 및 Redis를 활용하여 구성하였습니다. 서비스는 AWS의 EKS 환경에 배포하였습니다.
Architecture Diagram of EKS Cluster & CI/CD for SHOOTOCK
이 아키텍처가 제공하는 주요 효과는 다음과 같습니다.
•
실시간성: WebSocket과 Kafka를 활용한 데이터 파이프라인을 통해 실시간 주식 시세를 전송합니다.
•
고가용성: RDS Multi AZ 구성을 통해 하나의 AZ 장애 시에도 서비스의 연속성을 보장합니다.
•
Auto Scailing: 트래픽 증가에 따라 Auto Scaling을 통해 파드의 리소스 효율을 개선(CPU : 40.92% Memory : 20.5%)하였고, RDS Auto Scailing을 이용해 스토리지 1% 이하 도달 시 자동으로 스토리지를 확장합니다.
2. Role & Responsibilities
개발 기간 | 인원 | 담당 영역(기여도 50%) |
2024-12 ~ 2025-03 (3 개월) | 5명 | UI/UX, 실시간 스트리밍 데이터 파이프라인, IaC·CI/CD, Security |
•
UI/UX
◦
WebSocket 재연결 로직 구현 및 Context API를 활용한 전역 상태 관리
•
Data Pipeline
◦
Kafka 및 Redis를 이용한 실시간 데이터 파이프라인 구축
•
IaC
◦
Terraform을 이용한 AWS 인프라 자동화 및 관리
•
CI/CD
◦
Github Actions 및 ArgoCD 기반의 EKS 자동 배포 환경 구축
•
Security
◦
AWS Secrets Manager, IAM, OIDC를 이용한 민감 정보 보호 및 접근 제어 관리
3. Problem Statement
초기 프로토타입은 브라우저 → WebSocket API 직결 구조였습니다. 하지만 다음 문제에 직면했습니다.
•
데이터 정규화 부재: 종목마다 필드가 상이해 클라이언트 코드가 복잡해졌습니다. 또한 종목 별 메시지 순서가 보장이 되지 않아 가격과 거래량이 일치하지 않는 상황이 발생했습니다.
•
데이터 누락: 네트워크 지연이나 웹소켓의 끊김으로 인해 데이터가 손실되었으며, 브라우저 새로고침 시 과거 데이터를 유지할 수 없었습니다.
이 문제를 해결하기 위해 중앙 데이터 파이프라인을 구축하고 데이터 정규화 및 복구 로직을 도입했습니다.
4. Methods
Data Pipeline
실시간 주식 체결 데이터를 위한 데이터 파이프라인
한국투자증권에서 실시간 주식 데이터를 WebSocket으로 받아옵니다. 해당 데이터들을 정규화 후 종목 별 Topic (realtime-data-{stockId}) 으로 Publish 합니다. 한쪽은 WebSocket Broadcasting으로 브라우저 실시간 렌더링을 돕고, 한쪽은 Hot Cache와 Fallback을 위한 Redis에 저장합니다. 메시지 당 누락 필드를 보완하고 중복 메시지를 제거한 후 최근 5개 데이터만 저장하였습니다.
•
데이터 정규화: 클라이언트 측 부하를 줄이고, 카프카의 토픽 별 순서 보장을 통해 종목 데이터의 정합성을 확보했습니다.
•
데이터 누락 방지: WebSocket이 일시적으로 끊겨도 Redis를 통해 최근 데이터를 제공하여 사용자 경험을 개선했습니다.
5. Trouble Shooting
WebSocket 연결 실패 문제
런트엔드 콘솔에서 WebSocket connection to 'wss://.../ws' failed: Error in connection establishment 오류가 지속적으로 발생했습니다. 하지만 동일 시점 백엔드 로그에서는 정상 송신으로 기록되어, 네트워크 계층 혹은 Ingress/ALB 설정의 문제임을 추측했습니다.
•
원인 분석
◦
HTTPS(443) 포트는 열려있으나, Ingress/ALB에서 WebSocket Upgrade 헤더(Connection, Upgrade)가 누락됨
◦
프런트엔드 → 백엔드 간 SSL Termination 과정에서 wss 프로토콜이 정상적으로 업그레이드되지 못함
•
해결
◦
WebSocket Upgrade 헤더 주입을 위해 server-snippet 블록 적용
nginx.ingress.kubernetes.io/server-snippet: |
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
Bash
복사
◦
ALB Ingress Controller 설정에서 WebSocket 지원 활성화
◦
Security Group에서 443 포트와 TargetGroup 매핑 정상화
•
결과
WebSocket 연결이 안정적으로 유지되었고, 실시간 데이터 전송 성공률 100% 확보
Used Skills
•
AWS EKS
•
Kubernetes
•
ArgoCD
•
Helm
•
Terraform
•
Kafka
•
Redis
•
React
•
Spring Boot
•
GitHub Actions
•
AWS Secrets Manager
•
RDS