๊ฑดํ๋ผ ์ ์ ํ์ ์ ๋ฐ ๋ถ๋ฅํ์ฌ ๋น์ ์๊ฒ ๋ง๋ ์ ํ์ ์ถ์ฒํ๋ ์น์ฌ์ดํธ์ ๋๋ค. ๋ฐฑ์๋ ์์ด ๋์ํ๋ ์ ์ (Static) ์น์ฑ์ผ๋ก, ๋ฐ์ดํฐ๋ JSON์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
์ด ๋ฌธ์๋ ์ค์ ์ฝ๋ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค โ ๊ตฌํ๋ ๊ฒ, ๋ถ๋ถ ๊ตฌํ/๋ฏธ๊ตฌํ์ธ ๊ฒ, ์ ์ ์ฑ์ ํ๊ณ๋ฅผ ๊ตฌ๋ถํด ๊ธฐ์ ํฉ๋๋ค.
- 25๊ฐ ๋ถ๋ฅ ์นดํ
๊ณ ๋ฆฌ(
data/taxonomy.json): ๋ฑ๊ธ, ์๋ฆฌ์ฆ, ๋์ด๋, ๊ฐ๋์ฑ, ์๋ถํ , ํ๋ ์, ์ฐ ์์กด๋ ๋ฑ - ์ถ์ฒ ์ ์ ์ ๋ ฌ: ํํฐ ํ์ฑ ์ ๊ฐ์ค์น ๊ธฐ๋ฐ ์ ํฉ๋ ์ ์์ ์ ๋ ฌ(
js/recommendation.js) - ๊ฒ์ & ์๋์์ฑ(๋ฐ์คํฌํฑ): ์ ํ๋ช ยท๊ธฐ์ฒด๋ช ยทํ์๋ฒํธ, ํ๊ธ ์ด์ฑ ๊ฒ์, ๊ฒ์ ๊ธฐ๋ก ์ ์ฅ
- ์ ๋ ฌ: ๋ฐ๋งค์ผยท์ด๋ฆยท๊ฐ๊ฒฉยท๋์ด๋ยทํ์ธ ์ (
โ ๏ธ ํํฐ ํ์ฑ ์์๋ ์ถ์ฒ ์ ์ ์ ๋ ฌ์ด ์ฐ์ โ ์๋ ํ๊ณ ์ฐธ๊ณ ) - ๊ทธ๋ฆฌ๋/๋ฆฌ์คํธ ๋ทฐ ์ ํ, 24๊ฐ ๋จ์ "๋ ๋ณด๊ธฐ" ํ์ด์ง๋ค์ด์
- URL ๋ฅ๋งํฌ: ํํฐยท๊ฒ์ ์ํ๊ฐ URL ์ฟผ๋ฆฌ๋ก ๊ธฐ๋ก๋์ด, ๋งํฌ ๊ณต์ /์๋ก๊ณ ์นจ ์ ์ต์ด ๋ก๋์์ ๋ณต์
- ๊ธฐ๋ณธ 3์ข : ๋ผ์ดํธ / ๋คํฌ / ํธ๋ฃจ ๋ธ๋(OLED)
- ๊ฑด๋ด ์๋์ 5์ข : RX-78 ยท ์ค์ ์ ์ฉ ยท ์ง์จ ยท ์ ๋์ฝ ยท ์๋ฐ๊ฒ๋ฆฌ์จ โ ๊ทธ๋ผ๋ฐ์ด์ ยท์ฌ๋ณผยทํจํด ํฌํจ ๋น์ฃผ์ผ ์์ด๋ดํฐํฐ
- ์ปค์คํ ํ ๋ง: ํฌ์ธํธยท๊ฐ์กฐยท๋ฐฐ๊ฒฝยท์นด๋ยทํ ์คํธ ์์ ์ง์ ์ง์ (์์ ์๋ ํ์, ๋ณ๊ฒฝ ์ฆ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ)
- FOUC ๋ฐฉ์ง: ํ์ธํธ ์ด์ ์ ์ ์ฅ๋ ํ
๋ง ์ ์ฉ(์ ํ์ด์ง
<head>์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ)
- ์นด๋ยท์์ธํ์ด์ง ํ ๊ธ, ๋ฐฐ์ง ์นด์ดํธ,
localStorage์์ํ - ์์ธ ์คํ ๋น๊ต ํ ์ด๋ธ: 3๊ฐ ์น์ (๊ธฐ๋ณธ/์กฐ๋ฆฝ/ํน์ฑ) 19๊ฐ ํญ๋ชฉ, sticky ํค๋/์ฒซ ์ด, ์ต๊ณ ยท์ต์ ํ์ด๋ผ์ดํธ, ์ด๋ณ ์ ๊ฑฐ ๋ฒํผ (๋น๊ตํจ์ ์นด๋ ๋์ด์ด ์๋ ํ ์ด๋ธ ์ ์ฉ ๋ทฐ)
- ์ ์ฒด ์ด๊ธฐํ ๋ฒํผ: ํธํฐ ํ๋จ ์ ์์ธ์ฑ ๋ฐฐ์น, ํ์ธ ๋ํ์์ ํ ์คํ
- ์ ํ ํด์ ์ฆ๊ฐ ๋ฐ์: ์ฆ๊ฒจ์ฐพ๊ธฐ/๋น๊ตํจ ํญ์์ ํด์ ์ ๋ชฉ๋กยทํ ์ด๋ธ ์ฆ์ ๊ฐฑ์
- ํฌ๋ก์คํญ ๋๊ธฐํ:
storage์ด๋ฒคํธ๋ก ๋ค๋ฅธ ํญ์ ๋ณ๊ฒฝ ์ฆ์ ๋ฐ์
- ์ต๋ 10๊ฐ, ์ค๋ณต ์ ๊ฑฐยท์ต์ ์, ํ ์คํธ ์๋ ์ธ๋ค์ผ ์คํธ๋ฆฝ(๋ฉ์ธยท์์ธ ์๋จ)
- ํค๋ ์๋ฆผ ๋ฒจ + ์ฝ์ง ์์ ๋ฐฐ์ง, ํจ๋ ์ด๋ ์ ์ฝ์ ์ฒ๋ฆฌ
- RSS ์กฐํ: ํ์ด์ง ์ ์ ์(์บ์ 30๋ถ ๊ฒฝ๊ณผ ํ)์ ์๋ ์๋ก๊ณ ์นจ(โป) ์ Bandai Hobby / GUNDAM.INFO ํผ๋ ํ์ธ
โ ๏ธ ์์ ๊ฐ์ยท๋ฐฑ๊ทธ๋ผ์ด๋ ํด๋งยทํธ์ ์๋ฆผ์ด ์๋ โ ์ด๋ ค ์๋ ํ์ด์ง์์ ์กฐํํ ์์ ์ ์์๋ง ํ์
- 2๋จ ์์ง ๊ตฌ์กฐ: ์์ฒด ์๋ฒ๋ฆฌ์ค API(
serverless/) ์ฐ์ โ ๋ฏธ๋ฐฐํฌ ์ ๊ณต๊ฐ CORS ํ๋ก์ ํด๋ฐฑ โ ์ ์ฒด ์คํจ ์ ์บ์ ํ์
- ํ๊ตญ์ด/์์ด ํด๋ฆญ ์ฆ์ ์ ํ(
data/i18n.json) โ ์นด๋ยทํํฐยท๋น๊ต ํ ์ด๋ธยท์๋ฆผ ๋ฑ ์ฌ๋ ๋ - ์์ธํ์ด์ง โ ๋ฐ๋ค์ด ๊ณต์ ์ค๋ช ์ ๊ฒ์ ๊ฒฐ๊ณผ ๋งํฌ(๋ฑ๊ธ+ํ์๋ฒํธ ํค์๋)
- shadcn/ui ์ฐธ๊ณ ์ ์ :
:focus-visible๋ง, press ํผ๋๋ฐฑ, disabled/selection ์ผ๊ดํ - ๋ฐ์ํ(๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ), ์ด๋ฏธ์ง
loading="lazy", ์นดํ ๊ณ ๋ฆฌ ์กฐํ O(1) Map ์บ์
| ํญ๋ชฉ | ์ํ |
|---|---|
| ๋ฒ์ ํํฐ (์ถ์์ฐ๋ยท๊ฐ๋์ฑยท๋ถํ์ยท๋ฌ๋์) | UI(์
๋ ฅ์ฐฝ+์ฌ๋ผ์ด๋)๋ ๋ ๋๋์ง๋ง ์ด๋ฒคํธ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ๋์ํ์ง ์์ (setRangeFilter๋ ์กด์ฌํ๋ ํธ์ถ๋ถ ์์) |
| ์ถ์ฒ ์ค๋ช ํจ๋ | JS ํจ์๋ง ์กด์ฌ, HTML ์ปจํ
์ด๋(recommendationPanel) ์์ โ ํ๋ฉด์ ํ์๋์ง ์์ (์ ์ ์ ๋ ฌ์ ๋์) |
| ๋น ๋ฅธ ๋ณด๊ธฐ(Quick View) ๋ชจ๋ฌ | openQuickView ํจ์๋ง ์กด์ฌ, ์ง์
๋ฒํผยท๋ชจ๋ฌ ๋งํฌ์
์์ โ ๋ฏธ๋์ |
| ๋ธ๋ผ์ฐ์ ๋ค๋ก๊ฐ๊ธฐ ์ํ ๋ณต์ | URL์ replaceState๋ก ๊ฐฑ์ ๋์ง๋ง popstate ๋ฏธ์ฒ๋ฆฌ โ ๋ค๋ก๊ฐ๊ธฐ๋ก ํํฐ/ํญ ์ํ๊ฐ ๋ณต์๋์ง ์์ |
| ๋ชจ๋ฐ์ผ ๊ฒ์ | ๊ฒ์์ด ์ ์ฉ๋ง ์ง์ โ ์๋์์ฑยท๊ฒ์ ๊ธฐ๋ก UI ๋ฏธ์ง์(๋ฐ์คํฌํฑ ์ ์ฉ) |
| ํํฐ ์ค ์ผ๋ฐ ์ ๋ ฌ | ํํฐ ํ์ฑ ์ ์ถ์ฒ ์ ์ ์ ๋ ฌ์ด ๊ฐ์ ๋์ด ์ ๋ ฌ ์ ๋ ํธ๊ฐ ๋ฌด์๋จ |
| ์๋ํ ํ ์คํธ | ์์ (์๋ "ํ ์คํธ ๋ฐฉ๋ฒ"์ ์๋ ์ฒดํฌ๋ฆฌ์คํธ๋ก ๊ฒ์ฆ) |
| ์ ๊ทผ์ฑ | focus ringยทaria-label ์ผ๋ถ ์ ์ฉ. ํญ ARIA(role/aria-selected), ๋ชจ๋ฌ ํฌ์ปค์ค ํธ๋ฉ, ๋ฐฉํฅํค ํ์ ๋ฏธ์ ์ฉ |
| ๋ค์ดํฐ๋ธ alert/confirm | ๋น๊ตํจ ์ ์ ์ด๊ณผยท์ด๊ธฐํ ํ์ธ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋ํ์์ ์ฌ์ฉ(์ปค์คํ ํ ์คํธ ๋ฏธ์ ์ฉ) |
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์ ๋ถ๊ฐ: ํ์ด์ง๊ฐ ์ด๋ ค ์์ ๋๋ง ์ฝ๋ ์คํ โ ์ฃผ๊ธฐ์ ์์งยท์๋ฒ ํธ์ ๋ถ๊ฐ
- CORS: ๋ธ๋ผ์ฐ์ ์์ ์ธ๋ถ RSS๋ฅผ ์ง์ ๊ฐ์ ธ์ฌ ์ ์์ โ ์๋ฒ๋ฆฌ์ค API ๋๋ ๊ณต๊ฐ ํ๋ก์ ํ์
- ์๋ฒ ๊ฒ์/DB ์์: ๋ชจ๋ ํํฐยท๊ฒ์ยท์ ๋ ฌ์ ํด๋ผ์ด์ธํธ ๋ฉ๋ชจ๋ฆฌ์์ ์ํ(ํ์ฌ 50๊ฐ ์ ํ ๊ท๋ชจ์ ์ต์ ํ)
- ๋ฐ์ดํฐ ๊ฐฑ์ = ํ์ผ ํธ์ง: ์ ํ ์ถ๊ฐ/์์ ์ JSON ์ง์ ํธ์ง +
scripts/๋๊ตฌ(์๋ ์คํ) file://์ง์ ์ด๊ธฐ ์ ์ฝ:fetch()๊ฐ ์ฐจ๋จ๋๋ฏ๋ก ๋ฐ๋์ ๋ก์ปฌ HTTP ์๋ฒ๋ก ์คํ
| ๊ธฐ๋ฅ | ์ํ |
|---|---|
| RSS ์์งยทํ์ฑยท์บ์ ๊ฐฑ์ | โ
๊ตฌํ๋จ โ serverless/worker.js (Cloudflare Worker, ์ ํ ๋ฐฐํฌ). ๋ฏธ๋ฐฐํฌ ์ ๊ณต๊ฐ ํ๋ก์ ํด๋ฐฑ |
| ๋งค๋ด์ผ ID ์๋ ํด์(๊ณต์ ์ฌ์ดํธ ์คํฌ๋ํ) | โ ๋ฏธ๊ตฌํ โ ํ์ฌ๋ ๊ณต์ ๋งค๋ด์ผ ๊ฒ์ ๊ฒฐ๊ณผ ๋งํฌ๋ก ๋์ฒด |
| ์ด๋ฏธ์ง ํ๋ก์/๋ฐฑ์ (์ธ๋ถ ์ด๋ฏธ์ง ํธ์คํธ ์ฅ์ ๋๋น) | โ ๋ฏธ๊ตฌํ โ ์คํจ ์ ๋ก์ปฌ ํ๋ ์ด์คํ๋ ํ์๋ง |
| ๊ฐ๊ฒฉ/์ฌ๊ณ ๋ฑ ์ธ๋ถ ์ค๋ฐ์ดํฐ ์ฐ๋ | โ ๋ฏธ๊ตฌํ โ ๋ฐ์ดํฐ๋ ์ ์ JSON |
| ๊ธฐ๋ฅ | ๊ณ์ธต | ์์น |
|---|---|---|
| RSS ์์งยทํ์ฑยท์บ์ ๊ฐฑ์ | ์๋ฒ๋ฆฌ์ค API (๋ฐํ์) | serverless/worker.js โ GET /api/news |
| ๋ฐ๋ค์ด ๋งค๋ด์ผ ๊ฒ์ | ๊ณต์ ์ฌ์ดํธ ์์๋ฐ์ด๋ ๋งํฌ | js/app.js |
| ๋ฐ์ดํฐ ๊ฒ์ฆยทID ๋งคํ | ๋น๋ ํ์ ์คํฌ๋ฆฝํธ | scripts/ |
cd serverless
npx wrangler deploy # Cloudflare ๊ณ์ ํ์ (๋ฌด๋ฃ ํ๋ ๊ฐ๋ฅ)๋ฐฐํฌ ํ ๋ฐ๊ธ URL์ js/notifications.js์ API_BASE์ ์
๋ ฅํ๊ฑฐ๋ HTML์์ window.GUNPLA_API_BASE๋ก ์ง์ ํ์ธ์. ๋ฏธ์ค์ ์ ์๋์ผ๋ก ํ๋ก์ ํด๋ฐฑ์ ์ฌ์ฉํฉ๋๋ค. ์์ธ: serverless/README.md
GunList/
โโโ index.html # ๋ฉ์ธ (๋ชฉ๋ก/ํํฐ/์ฆ๊ฒจ์ฐพ๊ธฐ/๋น๊ต/์๋ฆผ)
โโโ detail.html # ์ ํ ์์ธ ํ์ด์ง
โโโ css/
โ โโโ styles-base.css # ํ ํฐ, ๋ ์ด์์, ๊ณตํต ์ปดํฌ๋ํธ, ์ ์ ๋ ์ด์ด
โ โโโ styles-components.css # ์นด๋/ํํฐ ๋ฑ ์ปดํฌ๋ํธ
โ โโโ styles-themes.css # ํ
๋ง๋ณ ๋น์ฃผ์ผ ์์ด๋ดํฐํฐ(๊ทธ๋ผ๋ฐ์ด์
ยท์ฌ๋ณผ)
โโโ js/
โ โโโ app.js # ์ฑ ์ฝ์ด(๋ ๋/์ฆ๊ฒจ์ฐพ๊ธฐ/๋น๊ต/์ต๊ทผ์กฐํ)
โ โโโ filter.js # ํํฐยท๊ฒ์ยท์๋์์ฑยทURL ์ํ
โ โโโ recommendation.js # ์ถ์ฒ ์ ์ ๋ก์ง
โ โโโ i18n.js # ๋ค๊ตญ์ด + ํ
๋ง ๊ด๋ฆฌ
โ โโโ notifications.js # RSS ์์ ํจ๋ (API ์ฐ์ + ํ๋ก์ ํด๋ฐฑ)
โโโ data/
โ โโโ gunpla-index.json # ์ ํ ๋ชฉ๋ก (์คํค๋ง: ์๋ ์ฐธ๊ณ )
โ โโโ gunpla-details/ # ์ ํ๋ณ ์์ธ JSON
โ โโโ taxonomy.json # ๋ถ๋ฅ ์นดํ
๊ณ ๋ฆฌ/๋ผ๋ฒจ(koยทen)
โ โโโ i18n.json # UI ๋ฒ์ญ
โโโ scripts/ # ๋ฐ์ดํฐ ์ ์ง๋ณด์ ์คํฌ๋ฆฝํธ (๋น๋ ํ์, Node ํ์)
โโโ serverless/ # ์๋ฒ๋ฆฌ์ค API ๊ณ์ธต โ RSS ์์งยท์บ์ (Cloudflare Worker)
์ ์ ์ฌ์ดํธ์ด๋ฏ๋ก ๋ก์ปฌ HTTP ์๋ฒ๋ก ์ด์ด์ผ ํฉ๋๋ค (file:// ์ง์ ์ด๊ธฐ๋ fetch ์ฐจ๋จ์ผ๋ก ๋์ํ์ง ์์).
# ๋ฐฉ๋ฒ 1: Python ๋ด์ฅ ์๋ฒ
python -m http.server 8000
# ๋ฐฉ๋ฒ 2: Node
npx serve .
# ๋ฐฉ๋ฒ 3: VS Code "Live Server" ํ์ฅ โ index.html ์ฐํด๋ฆญ โ Open with Live Server์ดํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์.
์๋ํ ํ ์คํธ๋ ์์ง ์์ต๋๋ค. ๋ณ๊ฒฝ ํ ์๋ ์๋ ์ฒดํฌ๋ฆฌ์คํธ๋ก ๊ฒ์ฆํ์ธ์.
- ํ์: ํํฐ 2~3๊ฐ ์ ํ โ ๊ฒฐ๊ณผ ์ ๋ณํ, ์ ์์ ์ ๋ ฌ ํ์ธ / ๊ฒ์(์ด์ฑ ํฌํจ) / ์ ๋ ฌยท๋ทฐ ์ ํ
- ์ฆ๊ฒจ์ฐพ๊ธฐ/๋น๊ต: ์นด๋ยท์์ธ์์ ํ ๊ธ โ ๋ฐฐ์งยท๋ฒํผ ์ํ / ๋น๊ตํจ ํญ์์ ํ ์ด๋ธ ํ์ยท์ด ์ ๊ฑฐ / ํญ ๋ ๊ฐ ์ด๊ณ ํฌ๋ก์คํญ ๋๊ธฐํ
- ํ ๋ง/์ธ์ด: 8์ข ํ ๋ง ์ํ + ์ปค์คํ ์์ ๋ณ๊ฒฝ โ ์๋ก๊ณ ์นจ ํ ์ ์ง / KOโEN ์ ํ ์ ์ ์์ญ ๊ฐฑ์
- ์๋ฆผ: ๋ฒจ ํด๋ฆญ โ ๋ชฉ๋ก/์ฝ์ ์ฒ๋ฆฌ, โป ์๋ก๊ณ ์นจ (๋คํธ์ํฌยทํ๋ก์ ์ํ์ ๋ฐ๋ผ ์คํจ ๊ฐ๋ฅ โ ์บ์ ํด๋ฐฑ ํ์ธ)
- ์ํ ์ ์ง: ์๋ก๊ณ ์นจยท์์ธโํ ๋ณต๊ท ํ ์ฆ๊ฒจ์ฐพ๊ธฐ/๋น๊ต/์ต๊ทผ์กฐํ ์ ์ง
- ๋ฐ์ํ: 375px/768px/1280px์์ ํค๋ยท์นด๋ยท๋น๊ต ํ ์ด๋ธ ๊ฒน์นจ ์์
cd serverless && npx wrangler dev
curl http://127.0.0.1:8787/api/health
curl "http://127.0.0.1:8787/api/news?limit=5"scripts/apply-bandai-ids.js, scripts/update-model-numbers.js โ ์คํ ์ ๊ฐ ํ์ผ ์๋จ ์ฃผ์ ์ฐธ๊ณ .
{
// index์ ๊ณตํต: id, baseProductId, name, modelNumber, series, grade, scale,
// releaseYear, releaseLine, isRevive, isVerKa, price, height
"pilot": "์๋ฌด๋ก ๋ ์ด", "manufacturer": "์ง๊ตฌ์ฐ๋ฐฉ๊ตฐ",
"releaseMonth": 3,
"images": { "boxart": "https://...", "gallery": [] },
"fullSpecs": { /* filterData์ ์ ์ฌ ํ๋ โ โ ๏ธ ํ๋๋ช
ํผ์ฉ ์์(ํ์คํ ์์ ) */ },
"weapons": ["๋น ๋ผ์ดํ"], "accessories": [],
"pros": ["..."], "cons": ["..."],
"recommendation": "...", "buildingTips": "...",
"lastUpdated": "YYYY-MM-DD"
}์์ธ JSON์ด ์๋ ์ ํ์ index ๋ฐ์ดํฐ๋ก ํด๋ฐฑ ๋ ๋๋ฉ๋๋ค.
{
"version": "...", "lastUpdated": "...",
"categories": [{
"id": "grade",
"label": { "ko": "๋ฑ๊ธ (Grade)", "en": "Grade" },
"type": "single", // single | multiple | range | boolean
"options": [{ "value": "HG", "label": { "ko": "...", "en": "..." } }],
// type=range ์นดํ
๊ณ ๋ฆฌ(releaseYearยทmobilityยทpartCountยทrunnerCount)๋
// options ๋์ min / max / step ์ฌ์ฉ
}]
}{ "translations": { "ko": { "nav": {...}, "search": {...}, "compare": {...}, "notif": {...}, "footer": {...}, ... },
"en": { /* ๋์ผ ํค ๊ตฌ์กฐ */ } } }HTML์์ data-i18n="ํค.๊ฒฝ๋ก" / data-i18n-placeholder๋ก ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
| ํค | ์ฉ๋ |
|---|---|
gunpla-lang |
์ธ์ด(ko/en) |
gunpla-theme |
ํ ๋ง ์ด๋ฆ |
gunpla-theme-custom |
์ปค์คํ ํ ๋ง ์์ JSON |
gunpla-favorites |
์ฆ๊ฒจ์ฐพ๊ธฐ ์ ํ id ๋ฐฐ์ด |
gunpla-compare |
๋น๊ตํจ ์ ํ id ๋ฐฐ์ด(์ต๋ 4) |
gunpla-recent-viewed |
์ต๊ทผ ์กฐํ id ๋ฐฐ์ด(์ต๋ 10) |
gunpla-search-history |
๊ฒ์ ๊ธฐ๋ก |
gunpla-news-cache |
์์ ์บ์ {ts, items} (TTL 30๋ถ) |
gunpla-news-seen |
๋ง์ง๋ง ์ฝ์ ์๊ฐ(ms) |
์ด ํ๋ก์ ํธ๋ ํฌ ์ ์ ๋น๊ณต์ ํ๋ก์ ํธ์ ๋๋ค. ๊ฑดํ๋ผ ๋ฐ ๊ด๋ จ ์ํ๋ BANDAI SPIRITS์ ๋ฑ๋ก์ํ์ ๋๋ค.
Made with โค๏ธ for Gunpla enthusiasts
{ "meta": { "version": "1.0.0", "totalCount": 50, "lastUpdated": "YYYY-MM-DD" }, "products": [{ "id": "hg-rx-78-2-revive", // ๊ณ ์ ์ฌ๋ฌ๊ทธ (์์ธ JSON ํ์ผ๋ช ๊ณผ ์ผ์น) "baseProductId": "rx-78-2", // ๋์ผ ๊ธฐ์ฒด ๋ณํ ๋ฌถ์ ํค "name": { "ko": "...", "en": "..." }, "modelNumber": "RX-78-2", "grade": "HG", "scale": "1/144", "series": "first_gundam", // taxonomy ์ต์ value "releaseYear": 2015, "releaseLine": "standard", "isRevive": true, "isVerKa": false, "thumbnail": "https://gunpla.fyi/images/boxarts/196", // ์ธ๋ถ ์ด๋ฏธ์ง (๋งค๋ด์ผ ID ์๋) "price": 1100, // ์ํ ์ ์ "height": "์ฝ 130mm", // ํ์์ฉ ๋ฌธ์์ด (์ซ์ ์๋ ์ฃผ์) "tags": ["beginner", "iconic"], "filterData": { // ํํฐ/๋น๊ต์ ์ฌ์ฉ "difficulty": "beginner", // beginner|intermediate|advanced "mobility": 4, // 1~5 "frameType": "partial", "partCount": 138, "runnerCount": 7, "runnerColors": "4+", "weaponCount": "standard", "sealDependency": "partial", "clearParts": "none", "coatingParts": false, "transformation": false, "colorSeparation": "high", "sizeFeeling": "normal", "recommendedUser": ["beginner", "posing"] } }] }