Skip to content
TaeBbongPublic

About

하스스톤 랭킹 검색 사이트

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

hearthgg 홈 화면: 검색창과 모드별 지역 1위

hearthgg

하스스톤 랭킹, 이름만 입력하면 바로 찾습니다.
투기장 · 지하 투기장 · 정규전 · 야생전 · 전장 리더보드를
아시아·태평양 · 아메리카 · 유럽 전 지역에서 한 번에 검색하세요.

hearthgg 바로가기 →

CI Next.js 16 Cloudflare Workers TypeScript


Blizzard 공식 리더보드는 모드와 지역마다 따로, 25명씩 페이지를 넘겨 가며 봐야 합니다. 투기장 리더보드만 해도 지역마다 1만~2만 명이 올라 있어서, 내 순위를 찾는 일이 생각보다 번거롭습니다.

hearthgg는 15개 리더보드(5개 모드 × 3개 지역)를 주기적으로 모아 두고, 이름 한 번 입력으로 전부 찾아 줍니다.

주요 기능

🔎 전 지역 통합 검색

이름의 일부만 입력해도 15개 리더보드에서 바로 후보를 보여줍니다. 대소문자와 전각 문자를 구분하지 않고, 정확히 일치하는 이름이 먼저 나옵니다. 키보드만으로도 고를 수 있습니다.

자동완성 검색

📋 리더보드 탐색

지역과 모드를 탭으로 바꿔 가며 봅니다. 순위마다 전날 마감 대비 변동(▲▼, NEW)이 붙고, 투기장·전장은 1·10·100·1,000위 컷 레이팅을 함께 보여줍니다. 마지막 수집 시각도 표시되고, 시즌이 바뀌면 지난 시즌의 최종 순위도 남겨 둡니다.

리더보드 화면

👤 플레이어 페이지

순위, 레이팅, 상위 몇 %인지, 전날 마감 대비 변동과 기록된 최고 순위와 함께, 같은 이름이 다른 모드·지역 리더보드에 있는지도 보여줍니다. 수집할 때마다 바뀐 순위를 기록해 순위 추이 그래프에 바로 반영하고(하루 마감 순위만 따로 볼 수도 있습니다), 배틀태그 번호가 공개되지 않아 생기는 동명이인도 구분해 안내합니다. 공유하기 좋은 고유 주소(/ap/arena/56/이름)를 가지고, 공유 버튼으로 링크를 바로 보내거나 복사할 수 있고, 링크를 붙이면 순위가 담긴 미리보기 카드가 뜹니다. 자주 보는 플레이어는 즐겨찾기해 두면 홈에서 바로 열 수 있습니다(회원가입 없이 브라우저에 저장).

플레이어 페이지

🌙 다크 모드 · 📱 모바일

다크 모드 리더보드 모바일 검색 결과

지원 범위

모드 투기장, 지하 투기장, 정규전, 야생전, 전장
지역 아시아·태평양(AP), 아메리카(US), 유럽(EU)
갱신 (아시아·태평양 우선) 아시아·태평양: 상위 1,000위는 순위가 바뀌면 약 5~10분 간격, 전체 순위는 1시간마다
아메리카·유럽: 상위 1,000위는 약 10~15분 간격, 전체 순위는 2시간마다
기록 순위가 바뀔 때마다 기록(전체 추이)하고, 매일 23:50(KST) 마감 순위를 따로 저장(일별 추이)

어떻게 만들었나

flowchart LR
  B[("Blizzard<br/>리더보드")] -- "5분마다 변경 감지,<br/>바뀐 보드만 수집" --> C["Crawler<br/>Cron + Workflows"]
  C -- "불변 스냅샷" --> R2[("R2")]
  C -- "포인터 원자 교체" --> D1[("D1")]
  R2 --> W["Next.js<br/>on Workers"]
  D1 --> W
  W -- "메모리에서 검색" --> U(("사용자"))
Loading
  • 사용자는 블리자드를 기다리지 않습니다. 사용자 요청은 원본 API를 호출하지 않습니다. 미리 모아 둔 스냅샷을 Worker 메모리에 올려 두고 그 자리에서 검색합니다.
  • 원본 서버를 배려하는 크롤러. 1페이지 해시로 바뀐 보드만 골라 수집하고, 상위 1,000위는 자주, 나머지는 드물게 읽습니다. 한국 사용자가 주로 보는 아시아·태평양은 더 짧은 주기로, 더 먼저 수집합니다. 모든 수집이 시간당 3,000건짜리 토큰 버킷 하나를 공유하고, 403/429를 받으면 전역 서킷 브레이커가 모든 요청을 멈춘 뒤 점점 길게 쉬었다가 천천히 속도를 회복합니다.
  • 중간에 끊겨도 이어서, 섞이지 않게. 수집은 Cloudflare Workflows의 step 단위로 저장돼 실패한 지점부터 다시 시작합니다. D1 compare-and-swap 잠금과 "더 새로운 스냅샷만 교체" 규칙으로 동시 실행이나 반쯤 쓰인 데이터가 사용자에게 보이지 않습니다.
  • 서버 없이 월 $5. Workers, Workflows, D1, R2만으로 수집부터 서비스까지 운영합니다.
  • 테스트로 확인합니다. TDD로 개발했고, 단위 테스트 258개(크롤러는 실제 workerd 런타임과 D1/R2 위에서 실행)와 데스크톱·모바일 Playwright E2E 58개가 GitHub Actions에서 돕니다.
  • 조용히 멈추지 않습니다. 장애와 복구, 매일의 수집 리포트가 Discord로 옵니다.
영역 기술
웹 Next.js 16 (App Router), React 19, Tailwind CSS 4, Pretendard
인프라 Cloudflare Workers · Workflows · D1 · R2, OpenNext
언어 · 검증 TypeScript (strict), zod
테스트 · CI Vitest, Testing Library, @cloudflare/vitest-pool-workers, Playwright, GitHub Actions

설계 근거와 세부 동작은 설계 문서에 정리했습니다.

직접 실행하기

Node 22.12 이상이 필요합니다.

npm install
npm test                                   # 단위 테스트 (core · crawler · web)
npm run test:e2e -w web                    # E2E (처음 한 번: npx playwright install chromium)

# 고정 데이터로 화면 보기 (Blizzard 호출 없음)
cd apps/web && HEARTHGG_STATE_DIR=.wrangler/e2e-state npm run dev

실데이터 로컬 수집과 Cloudflare 배포 방법은 설계 문서를 참고하세요.

packages/core   도메인 로직: Blizzard 클라이언트, 스냅샷, 갱신 판단, 검색, 히스토리
apps/crawler    Cron + Workflows 수집기 (D1/R2 쓰기)
apps/web        Next.js 웹 앱 (D1/R2 읽기)
migrations      D1 스키마

hearthgg는 Blizzard 공식 커뮤니티 리더보드의 공개 데이터를 모아 보여주는 비공식 팬 사이트이며, Blizzard Entertainment와 관련이 없습니다. 하스스톤®은 Blizzard Entertainment의 상표입니다.
Flutter Web + Flask로 만들었던 첫 버전은 v1-flutter 태그에 남아 있습니다.

About

하스스톤 랭킹 검색 사이트

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages