투자킹에서 제일 먼저 정했던 기능이 실시간 가격 업데이트였다.
모의투자 서비스라고 해도, 가격 반응이 몇 초씩 밀리면 답답하고,
특히 레버리지 거래가 붙으면 가격 딜레이는 바로 UX 문제로 이어진다.
이 글에서는 코인가격을 어디서 가져오고,
백엔드에서 어떻게 처리해서,
프론트에서 어떤 방식으로 실시간으로 받아가는지,
그 구조만 간단히 정리한다.


가격 데이터는 어디서 가져오나
데이터 소스는 바이낸스 API를 쓴다.
다른 선택지를 고민하지 않은 이유는 간단하다.
- 요청 속도 빠르고
- 문서가 명확하고
- 안정적이고
- 선물/현물 구분 없이 필요한 데이터 대부분 지원
그리고 시장 기준으로도 “표준 데이터”로 취급되기 때문에
모의투자 용도로 쓰기 적당하다.
가격 업데이트 전체 흐름
흐름을 단순화하면 이렇다.
Binance → (백그라운드) FastAPI Worker → Redis → FastAPI API → SSE → 프론트엔드
각 단계는 역할이 완전히 분리돼 있다.
바이낸스 오픈 api는 request 제한이 있기 때문에
사이트를 사용하는 유저의 수와 바이낸스 api의 호출수가 관련 없도록 하는 것을 가장 중요하게 생각했다.
1) 백그라운드 워커에서 가격 수집
FastAPI와는 별도로 돌아가는 Worker 프로세스가 있다.
여기서 몇 초 간격으로 Binance 가격을 받아온다.
- 상위 50개 거래량 코인의 가격/변동률/거래량을 가져오고
- 한 번에 Redis에 업데이트
- DB(PostgreSQL)에는 기준 가격(reference) 정도만 저장
- (실시간 데이터는 굳이 DB에 넣을 필요 없음)
DB를 아끼고 Redis를 쓰는 이유는 단순하다.
- Redis는 TTL 적용이 간단하고
- 실시간으로 읽는 속도가 훨씬 빠르고
- API 서버 여러 개 띄워도 캐시가 하나로 공유된다
Worker는 이걸 계속 반복한다.
가격 업데이트 자체는 비동기 함수로 동작한다.
2) FastAPI에서 SSE(Server-Sent Events)로 실시간 푸시
가격을 프론트에서 ‘주기적으로 요청’하도록 만들 수도 있는데,
이러면 요청 수가 많아지고, 딜레이가 생긴다.
그래서 아예 SSE 스트림으로 만들었다.
- GET /coins/stream/all
- 클라이언트는 EventSource로 구독
- 서버는 일정 주기로 데이터를 push
- 재연결은 브라우저가 자동 처리
WebSocket을 쓰지 않은 이유도 여기에 있다.
- 가격은 단방향 스트림이면 충분하고
- SSE는 구현이 단순하다
- 파이어월/네트워크 이슈가 적다
- reconnect 로직이 기본 제공된다
채팅처럼 양방향이 필요한 기능만 WebSocket을 따로 썼다.
프론트에서는 어떻게 받나
프론트에서는 React Query 같은 상태관리 없이,
EventSource → React 상태 업데이트만 해도 충분하다.
대략 구조는 이런 식이다.
EventSource → 여러 코인 가격 상태 업데이트 →
홈 화면/거래 화면/포트폴리오 화면에서 공통적으로 사용
특징은 다음 두 가지다.
1) SSE는 상태가 많아질수록 React Query보다 유리하다
React Query를 실시간으로 폴링하면
각 코인마다 요청이 늘어나고, 앱 전체 트래픽이 커진다.
하지만 SSE는 한 스트림으로 모든 코인 데이터가 한 번에 들어오기 때문에 부담이 없다.
2) 포트폴리오 수익률도 자동 업데이트
내 정보 메뉴에 있는 포트폴리오 화면은 당연히 코인별 가격과 연결돼 있다.
- 보유중인 코인의 평균 매수가
- 현재 가격
- 수익/손실
- 레버리지 포지션 PnL
이런 값들은 SSE 가격이 들어오는 순간 자동으로 계산하면 된다.
즉, 가격 한 번 push할 때마다
프론트 전체가 자연스럽게 업데이트되는 구조다.
거래 화면에서는 얼마나 자주 업데이트되나
Binance에서 가져오는 주기는 3초로 정해두었다.
이보다 더 짧게 가져오면 비용/리소스가 커지고,
이보다 길면 UX가 떨어진다.
하지만 SSE 자체는 서버가 push하는 순간 바로 전달되기 때문에
실제로 체감은 거의 실시간에 가깝다.
차트 데이터는 어떻게 처리하나
차트는 lightweight-charts를 쓰는데,
전체 구조는 아래처럼 단순하다.
- 차트 캔들 데이터는 Binance Klines 기반
- 간격별로 Redis에 캐시
- 1m, 5m, 15m, 1h, 1d
- 차트 페이지 진입 → 백엔드에서 캐시 가져와서 바로 렌더
- 실시간 가격(틱)은 SSE로 받은 값을 마지막 캔들에 merge
즉,
- 기본 차트는 Redis 캐시 기반
- 실시간 가격은 SSE 기반
두 가지가 합쳐져서 부드럽게 갱신된다.
서버 구조 요약
한 문장으로 정리하면:
“가격을 직접 저장하거나 무겁게 다루지 않고,
가벼운 Redis 캐시 → SSE 스트림 → 프론트 갱신”
구조로 단순화했다.
이 방식의 장점은 명확하다.
- API 서버 트래픽 적음
- DB 부하 없음
- 멀티 워커 확장 가능
- 지연 최소화
- 구현 난이도 낮음
그리고 혼자 운영해도 리소스를 크게 잡아먹지 않는다.
모의투자 커뮤니티 1인 개발기
투자킹 링크
코인 모의투자 | 투자킹 - 실시간 암호화폐 모의투자 플랫폼
실시간 시세로 가상 투자 경험. 투자킹은 초보자도 쉽게 시작할 수 있는 암호화폐 모의투자 플랫폼입니다.
twojaking.com
'모의투자 개발기' 카테고리의 다른 글
| 모의투자 커뮤니티 1인 개발기 (5) – 무중단 배포 구현하기 (0) | 2025.11.25 |
|---|---|
| 모의투자 커뮤니티 1인 개발기 (4) – 커뮤니티 기능 개발 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (3) – 게임적 요소 한스푼 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (1) – 서비스 구조 설계 (0) | 2025.11.25 |
| 모의투자 커뮤니티 1인 개발기 (프롤로그) – 왜 모의투자 커뮤니티 인가? (0) | 2025.11.25 |