์๋ฐฉ ๋ฐ ๊ตฌ๊ธ ๋์์ ์ ์ํ ์ถ๋๊ณผ ํ์ฅ ์ํฉ ํ์
์ ์ง์ํ๋ ์ข
ํฉ ์ ๋ณด ๋์๋ณด๋์
๋๋ค.
๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ๋ฐ์คํฌํ ํ๊ฒฝ ๋ชจ๋์์ ์๋ฒฝํ๊ฒ ๋์ํ๋ ๋ฐ์ํ ์น ์ฑ์
๋๋ค.
๐ ๋ผ์ด๋ธ: https://119helper.github.io/
- ํ์ฌ ์์น ๊ธฐ๋ฐ ๊ธฐ์จยท์ต๋ยทํ์ยท๊ฐ์ ๋ฑ ๊ธฐ์ ํํฉ ์์ฝ
- ์๊ธ์ค ๊ฐ์ฉ ๋ณ์ ํํฉ ์ค์๊ฐ ์์ฝ
- ์๋ฐฉ์ฉ์์์ค(์ํ์ ยท๊ธ์ํยท์ ์์กฐ) ํํฉ
- ๊ธฐ์์ฒญ API Hub ์ฐ๋ โ ์ด๋จ๊ธฐ์คํฉ, ๋จ๊ธฐ์๋ณด, ์ค๊ธฐ์๋ณด
- ํ์ฌ ์ํ๋ ์๋ ํ์ (์ต๋ยทํ์ ๊ธฐ๋ฐ)
- ์ฒด๊ฐ์จ๋(์๋์น ) ์๋ ๊ณ์ฐ
- ๊ตญ๋ฆฝ์ค์์๋ฃ์ ์ค์๊ฐ ๊ฐ์ฉ๋ณ์ API ์ฐ๋
- ๋ณ์๋ณ ์๊ธ๋ณ์ยท์ ์์คยท์์ ์คยทCTยทMRI ํํฉ
- ์ํด๋ฆญ ์ ํ ์ฐ๊ฒฐ
- ์นด์นด์ค๋งต SDK ๊ธฐ๋ฐ ์์ค ์์น ์๊ฐํ
- ์ํ์ ยท๊ธ์ํยท์ ์์กฐยท๋น์์ํ์ฅ์น ๋ง์ปค
- ํด๋ฌ์คํฐ๋ง + ์ปค์คํ ์ค๋ฒ๋ ์ด
- ์ฃผ์ ์ ๋ ฅ โ ๊ฑด๋ฌผ ๊ตฌ์กฐยท์ธต์ยท์ฉ๋ยท๋ฉด์ ยท์ค๊ณต์ผ ์ฆ์ ์กฐํ
- ์นด์นด์ค Geocoder + ๊ตญํ ๊ตํต๋ถ ๊ฑด์ถ๋ฌผ๋์ฅ API
- ERG ๊ธฐ๋ฐ ์ด๊ธฐ์ด๊ฒฉ๊ฑฐ๋ฆฌ + ํํํฅ ๋ฐฉํธ๊ตฌ์ญ ์๋ฎฌ๋ ์ด์
- ์นด์นด์ค๋งต ์ ์ํ(์ด๊ฒฉ๊ตฌ์ญ) + ๋ถ์ฑ๊ผด(๋ฐฉํธ๊ตฌ์ญ) ์๊ฐํ
- ์์(nozzle pressure) ๊ณ์ฐ
- ํธ์ค ์ ๊ฐ ๋ง์ฐฐ์์ค ๊ณ์ฐ
- ๊ณต๊ธฐํธํก๊ธฐ ์์ฌ ์๊ฐ ๊ณ์ฐ
- ๊ต๋๊ทผ๋ฌด ์ผ์ ๊ด๋ฆฌ
- ๊ณตํด์ผ API ์ฐ๋ (๋นจ๊ฐ ๋ ์๋ ํ์)
- ์ธ์์ธ๊ณ ๋ฐ ํ์ฅ ๋ฉ๋ชจ (localStorage ์ ์ฅ)
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| Frontend | React 19 + TypeScript + Vite |
| Styling | TailwindCSS (Dark Theme) |
| Map | Kakao Maps JavaScript SDK |
| API | Cloudflare Worker ํ๋ก์ + ๊ธฐ์์ฒญ API Hub, ๊ตญ๋ฆฝ์ค์์๋ฃ์, ์์ด์ฝ๋ฆฌ์, ๊ตญํ ๊ตํต๋ถ |
| CI/CD | GitHub Actions โ GitHub Pages |
| State | React Hooks (useState/useEffect) |
git clone https://github.com/119helper/119helper.github.io.git
cd 119helper.github.io
npm install
mkdir -p ../key/119-helper
cp .env.example ../key/119-helper/.env
# ../key/119-helper/.env ์ VITE_KAKAO_MAP_KEY, ํ์ ์ VITE_API_BASE ์ค์
# ์ด์ ๋ฐฐํฌ์์๋ VITE_APP_TOKEN์ Worker์ APP_ACCESS_TOKEN๊ณผ ๋์ผํ๊ฒ ์ค์
npm run dev -- --host
# โ http://localhost:5173๊ณต๊ณต๋ฐ์ดํฐ API ํค๋ ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์ ๋ฃ์ง ์์ต๋๋ค. Worker secret์ผ๋ก ๋ฑ๋กํ์ธ์.
cd worker
npm install
wrangler secret put KMA_API_KEY
wrangler secret put ER_API_KEY
wrangler secret put APP_ACCESS_TOKEN
npm run dev
# ๋ก์ปฌ Worker๋ฅผ ์ธ ๋๋ ํ๋ฐํธ env์ VITE_API_BASE=http://localhost:8787 ์ค์
# ํ ํฐ ์์ด ๋ก์ปฌ ํ
์คํธํ๋ ค๋ฉด wrangler.toml์ ENVIRONMENT๋ฅผ development๋ก ์ค์ ์ด์ ์ฐธ๊ณ : VITE_APP_TOKEN์ ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์ ํฌํจ๋๋ ๊ณต๊ฐ๊ฐ์ด๋ฏ๋ก ์์ ํ ๋น๋ฐ ์ธ์ฆ ์๋จ์ด ์๋๋๋ค.
ํ์ฌ ๋ฌด๋ฃ/๋ฌด๋๋ฉ์ธ ์ด์์์๋ Worker์ Origin/ํ ํฐ ๊ฒ์ฆ๊ณผ rate limit binding์ ๊ธฐ๋ณธ ๋ฐฉ์ด์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋๋ ์คํฌ๋ํ์ด ์ค์ ๋ฌธ์ ๊ฐ ๋๋ฉด ๋๋ฉ์ธ/Cloudflare zone ๊ธฐ๋ฐ WAF, Turnstile, ๋ด ์ฐจ๋จ ์ ์ฑ
์ ์ฌ๊ฒํ ํ์ธ์.
GitHub Actions ์ด์ ๋ฐฐํฌ์๋ ๋ค์ secret๋ ํ์ํฉ๋๋ค.
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_IDNEWS_CACHE_KV_ID,NEWS_CACHE_KV_PREVIEW_IDFIRE_WATER_API_KEY(๋ถ๊ธฐ๋ณ ์๋ฐฉ์ฉ์์์ค ์ ์ ๋ฐ์ดํฐ ๋๊ธฐํ์ฉ)RESTROOM_API_KEY๋๋ ๊ธฐ์กด ๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ ํค(FIRE_WATER_API_KEY/PUBLIC_DATA_API_KEY) (๋ถ๊ธฐ๋ณ ๊ณต์คํ์ฅ์ค ์ ์ ๋ฐ์ดํฐ ๋๊ธฐํ์ฉ)
์๋ฐฉ์ฉ์์์ค๊ณผ ๊ณต์คํ์ฅ์ค ์ ์ ๋ฐ์ดํฐ๋ ๊ณต๊ณต๋ฐ์ดํฐ API์์ ์ง์ ๊ฐฑ์ ํฉ๋๋ค.
FIRE_WATER_API_KEY=... node scripts/sync-firewater.js
RESTROOM_API_KEY=... node scripts/sync-restrooms.js๋ฏผ๋ฐฉ์/์ง์งํด์ผ ์ ์ ๋ฐ์ดํฐ manifest๋ ์ฒดํฌ์ธ๋ JSON์์ ๊ธฐ์ค์ผ๊ณผ ๊ฑด์๋ฅผ ๋ณด๊ฐํ ์ ์์ต๋๋ค. ์ง์งํด์ผ ์๋ณธ ํ์ผ์๋ ํ๋ณ ๊ธฐ์ค์ผ ํ๋๊ฐ ์์ด ๊ณต๊ณต๋ฐ์ดํฐํฌํธ API ์์ธ์ ์์ ์ผ์ API ์์ ์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
node scripts/update-static-data-manifest.mjs
TSUNAMI_SOURCE_DATE=2025-07-16 node scripts/update-static-data-manifest.mjs์ด์ ๋ฆฌ์คํฌ์ ํ์ ๋ณด์ ๊ณผ์ ๋ docs/operational_risks.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ์๋ฐฉ ํ์ฅ ํ๋ ์ง์ ๋ชฉ์ ์ผ๋ก ์ ์๋์์ต๋๋ค.