롤러코스피 시대, 개미의 대시보드를 만들다

삼성전자-인버스 스위칭 단타를 치던 개미가, 4일 만에 순 방문자 1만 명의 서비스를 만들기까지.


왜 이걸 만들게 됐나

2026년 3월, 코스피는 말 그대로 롤러코스피였다.

롤러코스터 + 코스피. 요즘 장을 한마디로 표현하면 이거다. 매일매일 다음 날 향방이 어떨지 신경 쓰이고, 저점에서 사서 고점에서 팔고, 사팔사팔하는 시간이 일상의 대부분을 차지했다. 단타와 스윙에 완전히 빠져서 도파민이 폭주하는 나날이었다.

개인투자자, 그러니까 개미들의 신용거래만 33조에 달할 만큼, 지금 대한민국의 시선은 주식에 급격하게 쏠려 있다. 나도 그 와중에 승리하는 황금개미가 되고 싶었다.

처음에는 삼성전자와 인버스를 스위칭하면서 짤짤이로 돈을 벌었다. 아침 출근길마다 10만 원씩. 나쁘지 않은 것 같았지만, 시드를 천만 원 넘게 두고 단타를 치니까 아찔했다. 수수료도 아깝고, 스트레스도 심했고, 무엇보다 이건 현명한 매매가 아니라는 걸 느꼈다.

한번 사두고, 향방을 쭉 지켜보면서, 저점에서 사서 고점에서 파는 현명한 매매를 하고 싶었다.

그러려면 시장의 흐름을 한눈에 볼 수 있는 무언가가 필요했다.

KOSPI 대시보드 전체 뷰 (다크모드, 히어로 이미지)
KOSPI 대시보드 전체 뷰 (다크모드, 히어로 이미지)

토스 종토방에서 시작된 아이디어

매일 밤, 자기 전 30분은 토스증권 삼성전자 종목 토론방에서 보냈다. 거기서 사람들이 어떤 지표를 보는지 자연스럽게 알게 됐다.

  • 야선 (코스피200 야간선물)
  • 나선 (나스닥100 선물)
  • 유가, 환율,

이른바 선행지표들. 내일 코스피가 오를지 내릴지를 가늠할 수 있는 지표들이다.

문제는 이걸 보려면 앱을 왔다 갔다 해야 한다는 거였다. 야간선물은 여기서, 나스닥은 저기서, 환율은 또 다른 앱에서. 특히 코스피200 야간선물을 검색하면 나오는 '사상최강'이라는 사이트가 있는데, 트래픽이 몰리면 수치가 누락되거나 아예 안 나오는 경우가 허다했다.

글로벌 선행/리스크 지표 (나선, S&P선물, 환율, 유가, 금, 비트코인 스파크라인)
글로벌 선행/리스크 지표 (나선, S&P선물, 환율, 유가, 금, 비트코인 스파크라인)

답답해서 내가 직접 만들기로 했다.

코스피, 삼성전자, 그리고 모든 선행 예측 지표를 한 화면에 모아서 보고 싶었다. 다른 사이트는 불편하고 답답했으니까, 내가 보고 싶은 대로, 내가 만들면 된다고 생각했다.


Day 1 -- 시작 (3월 9일, 일요일)

create-next-app으로 프로젝트를 생성했다. 이름은 그냥 dashboard-temp. 임시로 만드는 거니까.

첫날 만든 것들:

  • 코스피 선행지표 실시간 대시보드 -- Yahoo Finance API를 연동해서 코스피, 코스닥, 나스닥100 선물, S&P500 선물, 환율, 금, 유가, 비트코인 등 핵심 지표를 한 화면에 배치
국내 시장 지표 카드 (코스피, 코스닥, 코스피200 선물, 삼성전자, EWY, KORU 스파크라인)
국내 시장 지표 카드 (코스피, 코스닥, 코스피200 선물, 삼성전자, EWY, KORU 스파크라인)
  • 시장 심리(Fear & Greed) 게이지 -- 탐욕과 공포 지수를 시각적으로 표시
  • 방문자 카운터 -- 혹시나 싶어서
  • 파비콘과 OG 이미지 -- 태극기로 설정. 한국 주식 대시보드니까
  • Google AdSense 스크립트 -- 일찍부터 광고를 붙여보려는 시도

커밋 8개. 하루 만에 프로토타입이 나왔다.

KOSPI 대시보드 풀페이지 (전체 섹션 한눈에)
KOSPI 대시보드 풀페이지 (전체 섹션 한눈에)

Day 2 -- 폭풍 개발 (3월 10일, 월요일)

이날 커밋이 47개다. 미친 하루였다.

실시간 갱신과 투자자 매매동향

5초마다 실시간 갱신되는 시스템을 만들고, 코스피 투자자별 매매동향 차트를 추가했다. 외국인이 얼마나 사고팔았는지, 기관은 어떤지, 개인은 어떤지를 막대그래프로 한눈에 볼 수 있게 했다.

매수/매도 레이아웃을 이리저리 바꿔보고, 가격이 변할 때 글로우 효과가 반짝이도록 만들었다. 주식 화면은 역시 반짝여야 한다.

코스피 수급 동향 (개인/외국인/기관 매매 막대그래프)
코스피 수급 동향 (개인/외국인/기관 매매 막대그래프)

KIS API와 코스피200 선물

한국투자증권(KIS) API를 연동해서 코스피200 선물 데이터를 직접 가져왔다. Yahoo Finance만으로는 한국 시장 데이터의 정확도와 실시간성이 부족했기 때문이다.

종목 클릭 시 상세 차트 모달 (나스닥100 선물 1일 차트)
종목 클릭 시 상세 차트 모달 (나스닥100 선물 1일 차트)

AI 시황 브리핑

Claude Sonnet을 연동해서 AI가 시장 상황을 분석하고 브리핑해주는 기능을 만들었다. 처음에는 사용자가 요청할 때마다 Claude를 호출했는데, API 비용이 걱정돼서 바로 Upstash Redis에 캐시하는 구조로 변경했다. 하루에 2~3회만 Claude를 호출하고, 나머지는 캐시된 브리핑을 보여주는 방식.

AI 시장 브리핑 (원형 게이지 스코어 + AI 시황 분석 텍스트)
AI 시장 브리핑 (원형 게이지 스코어 + AI 시황 분석 텍스트)

야간선물의 벽 -- Fly.io 릴레이 서버

가장 헤맸던 부분이다. 코스피200 야간선물 실시간 시세.

KIS API는 정규장에서는 잘 동작하지만, 야간선물 실시간 데이터를 서버리스 환경에서 WebSocket으로 받는 건 쉽지 않았다. Vercel의 서버리스 함수는 장시간 연결을 유지할 수 없기 때문이다.

결국 Fly.io에 별도 릴레이 서버를 띄웠다. 이 릴레이 서버가 KIS WebSocket에 연결해서 야간선물 체결가를 실시간으로 받아 Redis에 저장하고, 대시보드는 Redis에서 읽어오는 구조다.

비개발자에게 이 아키텍처를 설명하면 눈이 둥그레진다. 하지만 이게 서버리스 환경에서 실시간 데이터를 다루는 현실이다.

그 외 수많은 개선들

  • 시장 브리핑 카드 UI를 원형 게이지로
  • 삼성전자, VIX 지수 추가
  • 등락비율, 경제이벤트 캘린더
  • 비트코인 원화 가격 한국식 표기 (1억 396만)
  • Vercel Cron으로 AI 브리핑 자동 생성
  • 모바일 바텀시트, 토스트 메시지, 상세 차트 모달

하루에 이 모든 걸 했다. 월요일이었으니까 장이 열렸고, 실시간으로 데이터가 들어오는 걸 보면서 계속 고쳐나갔다.

모바일 KOSPI 상단 뷰
모바일 KOSPI 상단 뷰
모바일 KOSPI 풀페이지 (전체 반응형 레이아웃)
모바일 KOSPI 풀페이지 (전체 반응형 레이아웃)

Day 3 -- 성장통 (3월 11일, 화요일)

폭발적 성장과 Upstash Redis 위기

서비스를 공개하자마자 반응이 미쳤다. 토스 종목 토론방에서 "이거 어디서 보냐", "이 앱 뭐냐"는 질문이 쏟아졌다. 이런 반응은 처음이었다.

2~3일 만에 순 방문자 1만 명.

모바일 글로벌 선행지표 + 글로벌 지수 (2열 카드 레이아웃)
모바일 글로벌 선행지표 + 글로벌 지수 (2열 카드 레이아웃)

부모님은 이걸 보시고 "왜 이 좋은 걸 공짜로 하냐"고 하셨다. 사용자들도 "무료로 왜 만들어주냐"는 말을 했다.

그런데 성장에는 대가가 있었다. Upstash Redis 무료 플랜이 2일 만에 한도에 도달했다. 56만 회 요청. 5초마다 갱신되는 대시보드에 수천 명이 동시에 접속하니, Redis 요청이 순식간에 폭발한 것이다.

이건 정말 당황스러웠다. 무료 플랜의 한도가 있다는 것도 미처 생각하지 못했고, 갑자기 서비스가 먹통이 될 뻔했다. 바로 스케일업을 했다.

라이트 모드의 탄생

사용자들에게 투표를 돌렸다. 주간 모드(라이트)와 야간 모드(다크) 중 뭘 더 쓰는지.

결과는 의외였다. 주간 모드로 주식 화면을 보는 사람이 적지 않았다. 사무실에서, 밝은 환경에서 보는 사람들이 많았던 것이다. 그래서 라이트/다크 테마 전환 기능을 만들었다. Pretendard 폰트도 적용해서 가독성을 높였다.

라이트 모드 대시보드 (다크 모드와 비교용)
라이트 모드 대시보드 (다크 모드와 비교용)

나스닥 대시보드

"나스닥 버전도 있으면 좋겠다"는 요청에 NASDAQ 전용 대시보드를 추가했다. 코스피와는 별도의 종목 구성과 AI 브리핑 시스템을 갖춘 완전히 분리된 대시보드다. Magnificent 7 (NVDA, AAPL, MSFT, GOOGL, AMZN, META, TSLA), 섹터 ETF, 미국 국채 금리까지 총 33개 종목을 한 화면에 담았다.

플로팅 버튼으로 코스피/나스닥을 전환할 수 있게 했는데, 처음에는 영문(KSP/NDQ)이었다가 한글로, 다시 한국/미국 국기 이미지로 바꿨다. 사용자들이 직관적으로 알 수 있도록.

PC NASDAQ 대시보드 상단 (AI 브리핑 게이지 + 주요 지수)
PC NASDAQ 대시보드 상단 (AI 브리핑 게이지 + 주요 지수)
Magnificent 7 종목 카드 (NVDA, AAPL, MSFT, GOOGL, AMZN, META, TSLA)
Magnificent 7 종목 카드 (NVDA, AAPL, MSFT, GOOGL, AMZN, META, TSLA)
섹터 ETF 카드 (기술, 금융, 에너지, 헬스케어, 부동산, 산업재)
섹터 ETF 카드 (기술, 금융, 에너지, 헬스케어, 부동산, 산업재)
모바일 NASDAQ 대시보드 상단
모바일 NASDAQ 대시보드 상단
모바일 Magnificent 7 + 섹터 ETF
모바일 Magnificent 7 + 섹터 ETF

Vercel Hobby 플랜의 한계

AI 브리핑을 Vercel Cron으로 돌리고 있었는데, Vercel Hobby 플랜의 Cron 제한에 걸렸다. 하루 5회 브리핑을 생성해야 하는데, Hobby 플랜으로는 부족했다. 결국 GitHub Actions로 크론을 이전했다. 물론 GitHub Actions도 정확한 시간에 실행되지 않는다는 걸 알게 됐다 -- 15~30분 지연이 일상적이라 스케줄을 25분 앞당겨 설정해야 했다.


Day 4 -- 안정화와 최적화 (3월 12일, 오늘)

데이터 소스 3번 갈아엎기

Yahoo Finance의 한국 종목 데이터에 15분 지연이 있다는 걸 뒤늦게 발견했다. 정규장에서 실시간이어야 하는 데이터가 15분이나 늦게 온다니.

  1. Yahoo Finance → 15분 지연 발견
  2. 네이버 금융 HTML 스크래핑으로 전환 → 정규식 파싱이 네이버 페이지 구조에 의존적
  3. KIS API 직접 연동으로 최종 전환 → 가장 정확하고 안정적

하루 만에 데이터 소스를 3번 갈아엎었다. 네이버 금융을 스크래핑할 때는 HTML 파싱 정규식을 수정하느라 한참 헤맸다 (no_exday change_value_and_rate). 결국 KIS API가 가장 깔끔한 답이었다.

Redis 요청 최적화 -- 생존을 위한 전쟁

Upstash 무료 플랜의 한도를 넘긴 뒤, Redis 요청을 줄이는 것이 생존의 문제가 됐다.

  • AI 브리핑 폴링 주기: 5분 → 30분
  • Redis SET 쓰로틀: 5초마다 저장 → 3분마다 (1/36 절감)
  • 장 마감 시 쓰로틀: 3분 → 6시간 (폴백 캐시가 불필요한 시간대에 저장을 거의 멈춤)
  • 릴레이 서버 야간선물 Redis SET: 매 체결마다 → 30초마다 (SET 약 80% 절감)

쓰로틀링이라는 개념을 이론으로만 알고 있다가, 진짜 돈이 걸리니까 진지하게 되더라. 인메모리 쓰로틀, 시간대 기반 쓰로틀, 조건부 쓰로틀까지 -- 3일 만에 Redis 비용 최적화의 전문가가 된 기분이다.

코스피 방향 예측 퀴즈

커뮤니티 기능의 시작으로, 내일 코스피 방향 예측 투표 기능을 만들었다. UP or DOWN? AI가 근거를 2가지씩 제시하고, 사용자들이 투표하는 방식이다.

UI를 인라인 → 랜딩 모달 → 다시 인라인으로 세 번이나 바꿨다. 사용자가 자연스럽게 참여할 수 있는 위치를 찾는 게 생각보다 어려웠다.

PC 코스피 예측 투표 + 경제 이벤트 캘린더
PC 코스피 예측 투표 + 경제 이벤트 캘린더
NASDAQ Fear & Greed 게이지 (극심한 공포 20점 + 경제 일정)
NASDAQ Fear & Greed 게이지 (극심한 공포 20점 + 경제 일정)
모바일 투표 + 경제 캘린더 + 금리/채권
모바일 투표 + 경제 캘린더 + 금리/채권

그 밖의 전투들

  • 코스피200 선물 종목코드 만기 자동 전환 -- 선물은 분기마다 종목코드가 바뀐다. 이걸 수동으로 관리하면 분기마다 서비스가 깨진다
  • Yahoo API 장애 대응 -- 전 종목 Redis 캐시 폴백 추가. 어떤 API가 죽어도 마지막 성공 가격을 보여줌
  • price=0 필터링 -- API가 가격 0을 반환할 때 UI에서 필터링하고 경고 배너 표시
  • 시간외 단일가 종료 시간 수정 -- KRX가 18:00에서 20:00으로 연장 운영하는 걸 반영

기술 스택

4일간의 전쟁에서 사용한 무기들:

구분기술
프론트엔드Next.js 16, React 19, Tailwind CSS 4, SWR
백엔드Next.js API Routes (서버리스)
데이터Yahoo Finance, KIS API, 네이버 금융 (폴백)
AIClaude Sonnet (Anthropic SDK)
캐시/DBUpstash Redis
실시간Fly.io 릴레이 서버 (KIS WebSocket → Redis)
배포Vercel
자동화GitHub Actions (AI 브리핑 크론)
NASDAQ 대시보드 풀페이지 (33개 종목 전체 구성 한눈에)
NASDAQ 대시보드 풀페이지 (33개 종목 전체 구성 한눈에)

3일간 배운 것들

기술적 교훈

1. 무료 플랜은 생각보다 빨리 끝난다

Upstash Redis 무료 플랜이 2일 만에 56만 회를 찍고 한도에 도달했다. 5초마다 갱신되는 대시보드 x 수천 명 동시 접속 = Redis 요청 폭발. 무료 플랜으로 시작하는 건 좋지만, 트래픽이 오면 즉시 대응할 준비가 되어 있어야 한다.

2. 쓰로틀링은 생존 기술이다

모든 SET/GET 연산에 쓰로틀을 걸어야 했다. 장 마감 시에는 6시간 쓰로틀, 릴레이 서버는 30초 쓰로틀, 폴백 캐시 저장은 3분 쓰로틀. "아 그냥 매번 저장하면 되지"라는 생각은 청구서를 보는 순간 사라진다.

3. 데이터 소스는 믿을 수 없다

Yahoo Finance는 한국 종목 15분 지연, 네이버 금융은 HTML 구조 변경에 취약, KIS API는 서버리스와 궁합이 안 맞는 부분이 있다. 결국 4단계 폴백 체인을 만들었다: KIS → Yahoo → 네이버 → Redis 캐시. 어떤 하나가 죽어도 서비스가 살아있어야 한다.

4. 서버리스에서 실시간은 어렵다

Vercel의 서버리스 함수로는 WebSocket 연결을 유지할 수 없다. 야간선물 실시간 데이터를 위해 Fly.io에 별도 릴레이 서버를 올려야 했다. 서버리스는 만능이 아니다.

사업적 교훈

1. 광고는 그렇게 쉽지 않다

방문자가 5천 명쯤 됐을 때 Google AdSense를 붙이려 했다. 거절당했다. 콘텐츠가 부족하고, 메타 데이터가 충분하지 않고, 검색 엔진 설정도 안 되어 있다는 이유였다. 단순히 트래픽이 있다고 광고를 달 수 있는 게 아니다.

2. 가장 좋은 제품은 내가 쓰고 싶은 제품이다

제품을 상상으로 먼저 만들지 않았다. 나 자신이 그 집단에 속해서, 진심으로 한 명의 유저가 된 다음에 "이건 왜 이렇지?", "이건 왜 이렇게 불편하지?"를 반복적으로 경험했다. 토스 종목 토론방에서 매일 밤 30분씩 놀면서, 사람들이 무엇을 불편해하는지를 피부로 느꼈다. 그러다 보니 자연스럽게 어떤 서비스를 만들어야 하는지 알게 됐다.

3. 마케팅 없이도 사람은 모인다

광고를 한 푼도 쓰지 않았다. 종목 토론방에서 내가 쓰는 화면을 공유했을 뿐인데, "이거 어디서 보냐", "이 앱 뭐냐"는 질문이 쏟아졌다. 내가 진짜 문제를 느끼고, 진짜 해결책을 만들면, 같은 문제를 겪는 사람들이 알아서 찾아온다. 2~3일 만에 순 방문자 1만 명. 마케팅 비용 0원.

4. 근데 돈은 어떻게 벌지?

솔직히 아직도 모르겠다. "사람을 모으면 어떻게든 돈을 벌 수 있다"고들 하는데, 어떻게 하는 건지 잘 모르겠다. AdSense도 거절당했고, 유료화를 하기엔 무료로 시작한 서비스라 사용자 반발이 걱정되고, 프리미엄 기능을 만들자니 지금 기능만으로도 손이 모자란다.

부모님 말씀대로 "왜 이 좋은 걸 공짜로 하냐"는 질문에 아직 답을 못 하고 있다. 하지만 확실한 건, 1만 명이 매일 쓰는 서비스를 만들었다는 것 자체가 대단한 시작이라는 것이다. 수익화는... 좀 더 고민해보겠다.


숫자로 보는 4일

항목수치
개발 기간4일 (2026.03.09 ~ 03.12)
총 커밋100개
하루 최대 커밋47개 (Day 2)
순 방문자10,000+ (3일 만에)
Redis 요청560,000회 (2일 만에 무료 한도 도달)
종목 수코스피 22개 + 나스닥 33개
데이터 소스 교체3번 (Yahoo → 네이버 → KIS)
AI 브리핑 크론 이전2번 (Vercel Cron → GitHub Actions)
마케팅 비용0원
광고 수익0원

그래서 앞으로는

아직 갈 길이 멀다. 종목 확장, 알림 기능, 포트폴리오 추적, 수익화 모델 -- 할 일이 산더미다.

하지만 4일 전만 해도 이건 그냥 "내가 보려고 만든 대시보드"였다. 지금은 1만 명이 쓰는 서비스가 됐다. 아직 임시라서 이름도 dashboard-temp인 이 서비스가 어디까지 갈 수 있을지, 나도 궁금하다.

한 가지 확실한 건 있다. 가장 좋은 제품은, 내가 진심으로 불편했던 걸 내 손으로 고친 것이다.

롤러코스피가 계속되는 한, 이 대시보드도 계속될 것이다.