์๋ฐฉ ๋ฐ ๊ตฌ๊ธ ๋์์ ์ ์ํ ์ถ๋๊ณผ ํ์ฅ ์ํฉ ํ์
์ ์ง์ํ๋ ์ข
ํฉ ์ ๋ณด ๋์๋ณด๋์
๋๋ค.
๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ๋ฐ์คํฌํ ํ๊ฒฝ ๋ชจ๋์์ ์๋ฒฝํ๊ฒ ๋์ํ๋ ๋ฐ์ํ ์น ์ฑ์
๋๋ค.
๐ ๋ผ์ด๋ธ: https://119.teemozipsa.com/
- ํ์ฌ ์์น ๊ธฐ๋ฐ ๊ธฐ์จยท์ต๋ยทํ์ยท๊ฐ์ ๋ฑ ๊ธฐ์ ํํฉ ์์ฝ
- ์๊ธ์ค ๊ฐ์ฉ ๋ณ์ ํํฉ ์ค์๊ฐ ์์ฝ
- ์๋ฐฉ์ฉ์์์ค(์ํ์ ยท๊ธ์ํยท์ ์์กฐ) ํํฉ
- ๊ธฐ์์ฒญ 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 ์ค์
# ๊ธฐ๋ณธ ์์๋ ๋ก์ปฌ Worker(http://localhost:8787)์ ์ฐ๊ฒฐ๋จ
# ์ด์ ๋ฐฐํฌ์์๋ VITE_APP_TOKEN์ Worker์ APP_ACCESS_TOKEN๊ณผ ๋์ผํ๊ฒ ์ค์
npm run dev:worker
# ๋ค๋ฅธ ํฐ๋ฏธ๋์์:
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
# AED์ ๋ ๋ฐฉ๋ฅ๋ ๊ฐ์ data.go.kr ๊ณ์ ํค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
# ๋ณ๋ ํค๋ฅผ ๋ถ๋ฆฌํ๋ ค๋ฉด: wrangler secret put PUBLIC_DATA_API_KEY
npm run dev
# worker/wrangler.dev.toml์ด ENVIRONMENT=development์ ํฌํธ 8787์ ๊ณ ์ ํ๋ฏ๋ก
# ๋ก์ปฌ์์๋ APP_ACCESS_TOKEN ์์ด ์คํ ๊ฐ๋ฅ์ด์ ์ฐธ๊ณ : 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
# v2 ์ต์ด ๋ง์ด๊ทธ๋ ์ด์
๋๋ง: ๋ง์ง๋ง v1 ์ขํ๋ฅผ Git ๊ธฐ์ค์ ์์ ์๊ตฌ ์ธ๋ฑ์ค๋ก ๋ณด์กด
RESTROOM_API_KEY=... RESTROOM_LEGACY_COORDINATE_GIT_REF=HEAD node scripts/sync-restrooms.js
CIVIL_SHELTER_SYNC_API_KEY=... node scripts/sync-civil-shelters.js
TSUNAMI_SHELTER_API_KEY=... node scripts/sync-tsunami-shelters.js๋ฏผ๋ฐฉ์/์ง์งํด์ผ ์ ์ ๋ฐ์ดํฐ manifest๋ ์ฒดํฌ์ธ๋ JSON์์ ๊ธฐ์ค์ผ๊ณผ ๊ฑด์๋ฅผ ๋ณด๊ฐํ ์ ์์ต๋๋ค. ์ง์งํด์ผ ์๋ณธ ํ์ผ์๋ ํ๋ณ ๊ธฐ์ค์ผ ํ๋๊ฐ ์์ด ๊ณต๊ณต๋ฐ์ดํฐํฌํธ API ์์ธ์ ์์ ์ผ์ API ์์ ์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
2026-07-29 API ์น์ธ ํ์ธ, ์ต์ ๊ณต๊ฐ์๋ฃ ๋์กฐ, ๋ฒ๋ น ๊ต์ ๋ฐ ์ถ๊ฐ API ์ฐ์ ์์๋
docs/data-source-audit-2026-07-29.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
node scripts/update-static-data-manifest.mjs
TSUNAMI_SOURCE_DATE=2025-07-16 node scripts/update-static-data-manifest.mjs์ด์ ๋ฆฌ์คํฌ์ ํ์ ๋ณด์ ๊ณผ์ ๋ docs/operational_risks.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
2026-07 ํ์ ๊ตฌ์ญ ๊ฐํธ ๋์ ๋ฒ์์ ๊ฒ์ฆ ๊ฒฐ๊ณผ๋
docs/administrative-region-audit-2026-07.md์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ ๋ค์๋ npm run audit:regions๋ก ๊ด์ฃผยท์ธ์ฒ ํ์ ๊ตฌ์ญ๊ณผ ์ขํ ์ ํฉ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
ํ๊ตญ์์์๊ณต์ฌ ๋ ๋ฐฉ๋ฅ์ ๋ณด๋ 2026-07-29 ๊ฐ๋ฐ๊ณ์ ์น์ธ์ ํ์ธํด ์ด์ ์ฐ๋์
ํ์ฑํํ์ต๋๋ค. API๋ 15๋ถ ์ฃผ๊ธฐ๋ก ๊ฐฑ์ ๋๋ฉฐ, ํ์ฌ ๋ฐฉ๋ฅ ๊ธฐ๋ก์ด ์๋ ๊ฒฝ์ฐ์๋
์ ์ ์๋ต๊ณผ ์กฐํ ์๊ฐ์ ํ์ํฉ๋๋ค. ์์ฒด ๋ฐฐํฌ ํ๊ฒฝ์์๋ ํ์ฉ์ ์ฒญ ์น์ธ ์ ๊น์ง
DAM_DISCHARGE_ENABLED = "false"๋ฅผ ์ ์งํ์ธ์.
์๋ฐฉ์ฒญ ๋ค์ค์ด์ฉ์ ์ ์์ ์ฅ๋ณ API๋ 2026-07-29 ์ถ๊ฐ ์ ์ฒญ๊ณผ ์๋ ์น์ธ์ ์๋ฃํ์ต๋๋ค. ์ฑ์ 2025 ๊ฐ๋ณ ์ ์ API๋ฅผ ์ง์ญยท์ ์ข ๋ณ๋ก ์ง๊ณํ๊ณ , ํค ๋๋ฝ์ด๋ ์ธ๋ถ ์ฅ์ ์์๋ ๊ฐ์ ๊ณต์ CSV 154,873ํ์์ ๊ฒ์ฆํ ์ ์ ์ง๊ณ๋ก ์๋ ํด๋ฐฑํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ ์๋ฐฉ ํ์ฅ ํ๋ ์ง์ ๋ชฉ์ ์ผ๋ก ์ ์๋์์ต๋๋ค.