AI๋ก ๋ถ๋์ฐ ๊ณ์ฝ์ ์ํ์ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๋, ์๊ฒฝ ์ฒญ๋ ์ ์ํ ์์ฌ ์ฃผ๊ฑฐ ์๋น์ค
์ง๋ฐฉ์์ ์์ธ๋ก ์๊ฒฝํด ์ฒ์ ์ง์ ๊ตฌํ๋ ์ฒญ์๋ ยท์ฌํ์ด๋ ์์ ๋ถ๋์ฐ ์ ๋ณด์๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ง๋ง, ์ ๋ฌธ์ ์ธ ๋ฒ๋ฅ ์ง์์ด ์์ด ๊ณ์ฝ์์ ์ํ ์์๋ฅผ ์ค์ค๋ก ํ๋จํ๊ธฐ ์ด๋ ต์ต๋๋ค. ZIPUP์ AI๊ฐ ๊ณ์ฝ์์ ๋ํ ๋ด์ฉ์ ๋ถ์ํด ์ํ์ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๊ณ , ์ง์ญ๋ณ ์ํ๋๋ฅผ ์ง๋๋ก ์๊ฐํํด ์์ ํ ์ฃผ๊ฑฐ ๊ฒฐ์ ์ ๋์ต๋๋ค.
๊ณ์ฝ์ ์ด๋ฏธ์งยทPDF๋ฅผ ์ ๋ก๋ํ๋ฉด Gemini API๊ฐ ๋ด์ฉ์ ๋ถ์ํฉ๋๋ค. ๋ณด์ฆ๊ธ, ํน์ฝ์ฌํญ ๋ฑ ํต์ฌ ์ ๋ณด๋ ๋ฉํฐ๋ชจ๋ฌ ๋ชจ๋ธ์ด ์ด๋ฏธ์ง์์ ์ง์ ์ธ์ํ๋ฉฐ, ๊ทธ ์ ๋จ๊ณ๋ก ์ ๋ก๋๋ ์ด๋ฏธ์ง์ ๊ฐ์ธ์ ๋ณด๋ ์๋์ผ๋ก ๊ฐ๋ ค์ง๋๋ค.
- ์
๋ก๋ ์ ๊ฐ์ธ์ ๋ณด ์๋ ๋ง์คํน: CLOVA OCR๋ก ์ด๋ฏธ์ง์์ ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธยท๊ณ์ข๋ฒํธยท์ ํ๋ฒํธยท
์๋์ธ/์์ฐจ์ธ ์ฑ๋ช
ยท๋น์ฌ์ ๊ฐ์ธ ์ฃผ์์ ์์น(์ขํ)๋ฅผ ์ฐพ์ ๊ฒ์ ์ฌ๊ฐํ์ผ๋ก ๊ฐ๋ฆฐ ๋ค์๋ง Gemini๋ก
์ ์กํฉ๋๋ค. ๋งค๋ฌผ ์ฃผ์ยท๋ณด์ฆ๊ธยทํน์ฝ์ฌํญ ๋ฑ ์ํ ๋ถ์์ ํ์ํ ๋ด์ฉ์ ๊ฐ๋ฆฌ์ง ์์ผ๋ฉฐ, OCR์ด ์คํจํ๊ฑฐ๋
๋ง์คํน์ ๋ณด์ฅํ ์ ์์ผ๋ฉด ๋ถ์ ์์ฒด๋ฅผ ์ค๋จํฉ๋๋ค(์๋ณธ์ด ์์ด๋๊ฐ์ง ์๋ fail-safe ๊ตฌ์กฐ). ์ ์ฒด
๋ฐ์ดํฐ ํ๋ฆ์
docs/PRIVACY_FLOW.md์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌ๋ผ ์์ต๋๋ค. - ์
๋ก๋ ์ ์ด๋ฏธ์ง๋ฅผ ์ต๋ 1200px๋ก ๋ค์ด์ค์ผ์ผ: ์นด๋ฉ๋ผ๋ก ์ฐ์ ์๋ณธ ํด์๋ ์ฌ์ง์ ๊ทธ๋๋ก ๋ณด๋ด๋ฉด
์๋ฒ(magick-wasm)๊ฐ ๋ฆฌ์ฌ์ด์ฆ ์ ์ ์๋ณธ ํด์๋๋ก ๋จผ์ ๋์ฝ๋ํด์ผ ํด์ Edge Function CPU ์๊ฐ
์ ํ(2์ด)์ ์ด๊ณผํ์ต๋๋ค(์ค์ธก
cpu_time_used์ต๋ 3872ms, ์ค๋ฅ 546). ๋ธ๋ผ์ฐ์ ์์ ์ ๋ก๋ ์ ์ 1200px๋ก ๋ฏธ๋ฆฌ ์ถ์ํ๊ณ base64 ์ธ์ฝ๋ฉ๋ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํด CPU ๋ถํ๋ฅผ ์ค์ฌ ํด๊ฒฐํ์ต๋๋ค. - PDF๋ ๋ธ๋ผ์ฐ์ ์์ pdf.js๋ก ๊ฐ ํ์ด์ง๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํํ ๋ค ์ ๋ก๋ํฉ๋๋ค(์๋ฒ๋ ์ด๋ฏธ์ง๋ง ์ฒ๋ฆฌ). ํ์ด์ง๊ฐ ๋ง์ ํด์๋๊ฐ ๋ฎ์์ง๋ฉด ์ ๋ก๋ ์ ์ธ์๋ฅ ์ ํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
- RAG ๊ธฐ๋ฐ ์ํ ํจํด ๋์กฐ: ๋ถ์ ์
contract_risk_patterns(์ ์ธ์ฌ๊ธฐยท๋ ์์กฐํญ ์ค์ ํผํด ํจํด DB)์์ ๊ด๋ จ ์ฌ๋ก๋ฅผ ๊ฒ์ํด ํ๋กฌํํธ์ ํฌํจ, ์ค์ ์ฌ๋ก ๊ธฐ๋ฐ์ผ๋ก ์ํ ์กฐํญ์ ํ๋ณ (AI ํ๊ฐ ๋ฐฉ์ง) - HUG ์์ต ์ฑ๋ฌด๋ถ์ดํ์ ์ค๋ช
๋จ ๋์กฐ: ๋ง์คํน ์ CLOVA OCR๋ก ์ฝ์ ์๋์ธ ์ด๋ฆ์
hug_defaulters(HUG ๊ณต๊ฐ ๋ช ๋จ, ์ฃผ 1ํ ์๋ ๋๊ธฐํ)์ trigram ์ ์ฌ๋ ๊ฒ์์ผ๋ก ์ง์ ๋์กฐ โ ์ผ์น ์ ๊ฐํ ๊ฒฝ๊ณ ๋ฐฐ๋๋ก ํ์ (AI ์ถ์ ์ด ์๋ ๊ณต์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ฌ์ค ํ์ธ. ์ด ์ด๋ฆ์ HUG ์กฐํ ์ ์ฉ์ด๋ฉฐ Gemini์๋ ์ ๋ฌ๋์ง ์์) - ์ข
ํฉ ์ ์๋ ์๋ฒ๊ฐ ๊ฐ์คํ๊ท ์ผ๋ก ๊ณ์ฐ: Gemini๋ ๊ถ๋ฆฌ๊ด๊ณยทํน์ฝ์ฌํญยท๊ฑด๋ฌผ์ํ 3๊ฐ ํญ๋ชฉ๋ง ์ฑ์ ํ๊ณ ,
์ ์ธ๊ฐ์จ์ ์๋ฒ๊ฐ ๊ณ์ฝ์ ์ฃผ์ยท๋ณด์ฆ๊ธ์ ๊ตญํ ๊ตํต๋ถ ์ค๊ฑฐ๋๊ฐ์ ์ง์ ๋น๊ตํด ๊ณ์ฐํฉ๋๋ค. ์ข
ํฉ ์ ์๋
์ด 4๊ฐ ํญ๋ชฉ(๊ถ๋ฆฌ๊ด๊ณ 35% ยท ํน์ฝ์ฌํญ 30% ยท ์ ์ธ๊ฐ์จ 25% ยท ๊ฑด๋ฌผ์ํ 10%)์ ๊ฐ์คํ๊ท ์ผ๋ก ์ฝ๋๊ฐ
์ฐ์ถํ๋ฏ๋ก ๊ฐ์ ๊ณ์ฝ์๋ฅผ ๋ค์ ๋ถ์ํด๋ ํญ๋ชฉ ๊ฒฐํฉ ๋ฐฉ์์ ํญ์ ๋์ผํ๋ฉฐ, ๋ํญ๋ ฅ ์
์ฉยท์ ํ ๋ถ๋์ฐ
๋ฑ ์น๋ช
์ ์ํ ํจํด์ด ํ์ธ๋๋ฉด ๊ณ์ฐ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ์ํ ๋ฑ๊ธ ํํ(61์ )์ผ๋ก ๋์ด์ฌ๋ฆฝ๋๋ค. ์ ์๋
์์ฌ ์๊ทธ๋ ๋งต๊ณผ ๋์ผํ๊ฒ ๋์์๋ก ์ํํฉ๋๋ค(2026-08-21 ์ด์ ๋ถ์ ์ด๋ ฅ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก
๊ณ์ฐ๋ผ ์์ด ๊ฒฐ๊ณผ ํ๋ฉด์ ์์ ๊ธฐ์ค์์ ๋ณ๋๋ก ์๋ดํฉ๋๋ค). ์ฐ์ ๊ธฐ์ค ์ ์ฒด๋ ์ฑ ๋ด
/scoringํ์ด์ง์์ ํ์ธํ ์ ์์ต๋๋ค. - ์ ์ธ๊ฐ์จ์ ์ค๊ฑฐ๋๊ฐ ๊ธฐ๋ฐ ์ค์ธก๊ฐ: ๊ณ์ฝ์ ์ฃผ์๋ก ์ง์ญ์ ์ฐพ์(DB ํจ์
match_region_by_address) ๊ตญํ ๊ตํต๋ถ ํ๊ท ๋งค๋งค๊ฐ์ ๋ณด์ฆ๊ธ์ ๋น๊ตํฉ๋๋ค. ์ฃผ์์ ์ผ์นํ๋ ์ง์ญ์ด ์๊ฑฐ๋ ํด๋น ์ง์ญ์ ์ต๊ทผ ์ค๊ฑฐ๋๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด "๋ฐ์ดํฐ ์์"์ผ๋ก ํ์ํ๊ณ ์ข ํฉ ์ ์ ๊ณ์ฐ์์ ์ ์ธํ ๋ค ๋จ์ ํญ๋ชฉ๋ผ๋ฆฌ ๊ฐ์ค์น๋ฅผ ์ฌ์ ๊ทํํฉ๋๋ค. - ์ํ/์ฃผ์/์์ ํ๊ทธ๊ฐ ๋ถ์ ์กฐํญ๋ณ ์์ธ ์ค๋ช
- AI ์ถ์ฒ ์กฐ์น(๋ฐฉ์ด ํน์ฝ ๋ฌธ๊ตฌ ํฌํจ ์ฒดํฌ๋ฆฌ์คํธ) ๋ฐ ์ข ํฉ ์ฝ๋ฉํธ ์ ๊ณต
- Gemini ์๋ฒ ๊ณผ๋ถํ(503)ยทํ ๋น๋ ์ด๊ณผ(429) ์ ์๋ ์ฌ์๋(์ง์ ๋ฐฑ์คํ)๋ก ์์ ์ฑ ํ๋ณด
์ค๊ฐ์ธยท์ง์ฃผ์ธ์๊ฒ ๋ฐ์ ๋ฌธ์ยท์นดํก ๋ด์ฉ(ํ ์คํธ ๋๋ ์บก์ฒ ์ด๋ฏธ์ง)์ ๋ถ์ํฉ๋๋ค.
- ์ต์ข
์ํ๋ ํ์ ์ ๊ท์น ๊ธฐ๋ฐ ํค์๋ ๋งค์นญ: Robert Cialdini(1984, Influence: The Psychology
of Persuasion)์ ์ค๋์ 6์์น(ํฌ์์ฑยท๊ถ์ยท์ฌํ์ ์ฆ๊ฑฐยท์ํธ์ฑยทํธ๊ฐยท์ผ๊ด์ฑ) ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ
์นดํ
๊ณ ๋ฆฌ๋ณ ํค์๋๊ฐ ๋ํ ํ
์คํธ์ ๋ฑ์ฅํ๋์ง ๋งค์นญํด ์ ์ํํ๊ณ , ๋ฑ๊ธ(์์ /์ฃผ์/์ํ)์ ๋งค๊น๋๋ค.
Gemini ํธ์ถ์ ์ ์งํ๋ ์ต์ข
์ํ๋(
riskLevel)๋ ์ด ๊ท์น ๊ธฐ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ ํฉ๋๋ค โ AI ์ฃผ๊ด์ ํ๋จ ๋์ ๊ฒ์ฆ ๊ฐ๋ฅํ ์ฌ๋ฆฌํ ์ด๋ก ๊ธฐ๋ฐ ๊ท์น์ผ๋ก ์ ๋ขฐ๋๋ฅผ ๋์์ต๋๋ค. - ์ฌ์ด, ํ์์ ๋ณด ์ฃผ์ , ์ ๋ขฐ ์ ๋ ๋ฑ ํจํด๋ณ ํ์ ๋(%) ํ์
- ๋ํ ์ํ๋ ๊ฒ์ด์ง ๋ฐ ์ข ํฉ ์ ๋ขฐ๋ ํ์
- ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ๋ณต์ฌํด์ ์ธ ์ ์๋ AI ์ถ์ฒ ๋์ ๋ฉํธ ์ ๊ณต
์ ๊ตญ ์/๊ตฐ/๊ตฌ(252๊ฐ ์ง์ญ) ๋จ์์ ์ฃผ๊ฑฐ ์ํ๋๋ฅผ ์ง๋์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ํ๋ ๊ณต์: ์ ์ธ๊ฐ์จ(50%, ๊ตญํ ๊ตํต๋ถ ์ค๊ฑฐ๋๊ฐ ๊ธฐ๋ฐ ์ ๋ ์งํ) + HUG ์์ต ์ฑ๋ฌด๋ถ์ดํ์ ๋ฐ๋(30%, ์ค์ ์ฌ๊ณ ์ด๋ ฅ ๊ธฐ๋ฐ) + ๋ด์ค ์ธ๊ธ ๋น๋(20%, ์ธ๋ก ๋ ธ์ถ ์ฐธ๊ณ ์งํ) ๊ฐ์ค ๊ฒฐํฉ
- ์ํํธ+์ฐ๋ฆฝ๋ค์ธ๋ ์ค๊ฑฐ๋๊ฐ๋ฅผ ๋ชจ๋ ๋ฐ์ํ๋ฉฐ, ์์ธ ํ์ ์ด ์ด๋ ค์ ์ค์ ์ํ์ด ๋ ํฐ ์ฐ๋ฆฝ๋ค์ธ๋(๋น๋ผ)์ ๋ ๋์ ๊ฐ์ค์น ์ ์ฉ
hug_defaulters์ฃผ์๋ฅผ ์ง์ญ๋ช ๊ธฐ์ค์ผ๋ก ๋งค์นญํด ์ง์ญ๋ณ ์์ต ์ฑ๋ฌด๋ถ์ดํ์ ๋ฐ๋ ์ฐ์ถ (์ ๊ตญ 98.9% ์ง์ญ ๋งค์นญ)- ๋ค์ด๋ฒ ๋ด์ค "{์ง์ญ} ์ ์ธ์ฌ๊ธฐ" ์ธ๊ธ ๋น๋๋ ๊ณต์ ํต๊ณ๊ฐ ์๋ ์ฐธ๊ณ ์งํ์์ ํ๋ฉด์ ๋ช ์
- ์นด์นด์ค๋งต ์์ ์ ๊ตญ ์/๊ตฐ/๊ตฌ ๊ฒฝ๊ณ๋ฅผ ์ํ/์ฃผ์/์์ ๋จ๊ณ๋ณ ์์์ผ๋ก ์๊ฐํ
- 20๋ถ ๊ฐ๊ฒฉ ๋ฐฐ์น๋ก ์ ๊ตญ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ํ ๊ฐฑ์ (Supabase pg_cron + ์ปค์ ๊ธฐ๋ฐ ๋ฐฐ์น ์ฒ๋ฆฌ)
๋ค์ด๋ฒ ๋ด์ค ๊ฒ์ API๋ก ์ต์ ์ ์ธ์ฌ๊ธฐ ๊ด๋ จ ๋ด์ค๋ฅผ ํ ํ๋ฉด์ ์ ๊ณตํฉ๋๋ค.
Supabase Auth ๊ธฐ๋ฐ ์ด๋ฉ์ผ ์ธ์ฆ + Google, Kakao ์์ ๋ก๊ทธ์ธ
- ํ๋กํ ์ ๋ณด(์๋ฐํ, ์ด๋ฆ, ์ด๋ฉ์ผ, ์์ฌ ํ์ ๋ฐฐ์ง)
- ๋ด ๋ถ์ ์ด๋ ฅ: ๊ณ์ฝ์ ์ค์บ / ๋ง์ ์๋ด ๊ธฐ๋ก์ ํญ์ผ๋ก ๊ตฌ๋ถํด ์กฐํ (RLS๋ก ๋ณธ์ธ ๋ฐ์ดํฐ๋ง ๋ ธ์ถ)
- ์๋ฆผ ์ค์ , ์ํ๋ ์ฐ์ ๊ธฐ์ค, ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ, ๊ณ ๊ฐ์ผํฐ, ๋ก๊ทธ์์
- (๊ด๋ฆฌ์ ์ ์ฉ) ๋ฐฐ์น ์์ ์ํํ: ์์ฌ ์๊ทธ๋ ๋งตยท๋ด์ค ๊ฐฑ์ ๋ฐฐ์น๊ฐ ์ ์ ๋์ ์ค์ธ์ง ๋ณด์ฌ์ฃผ๋ ์ด์์ฉ ์นด๋๋ก, RLS๊ฐ ์ง์ ๋ ๊ด๋ฆฌ์ ๊ณ์ ์๋ง ์กฐํ๋ฅผ ํ์ฉํด ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ๋ ์์ ๋ ๋๋ง๋์ง ์์ต๋๋ค
| ์์ญ | ๊ธฐ์ |
|---|---|
| ํ๋ก ํธ์๋ | Vite, React, TypeScript, Tailwind CSS |
| ๋ฐฑ์๋ | Supabase Edge Functions (Deno) |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค | Supabase (PostgreSQL), Row Level Security |
| ์ธ์ฆ | Supabase Auth |
| ์ค์ผ์ค๋ง | Supabase pg_cron, pg_net |
| AI | Google Gemini API (gemini-2.5-flash, ๋ฉํฐ๋ชจ๋ฌ) |
| OCR | ๋ค์ด๋ฒํด๋ผ์ฐ๋ CLOVA OCR (๊ฐ์ธ์ ๋ณด ์์น ๊ฒ์ถ์ฉ) |
| ์ด๋ฏธ์ง ์ฒ๋ฆฌ | magick-wasm(์๋ฒ ๋ง์คํน), pdf.js(ํด๋ผ์ด์ธํธ PDFโ์ด๋ฏธ์ง ๋ณํ) |
| ์ง๋ | Kakao Maps JavaScript SDK |
| ๋ฐฐ์น ์คํฌ๋ฆฝํธ | Node.js, cheerio, iconv-lite, undici (HUG ๋ช ๋จ ๋๊ธฐํ, GitHub Actions) |
| API | ์ฉ๋ | ๋ฐ๊ธ์ฒ |
|---|---|---|
| Google Gemini API | ๊ณ์ฝ์ ์ด๋ฏธ์ง/PDF ๋ถ์, ์ํ ์กฐํญ ํ๋ณ, ๊ฐ์ค๋ผ์ดํ ๋ํ ํจํด ๋ถ์ | Google AI Studio |
| ๋ค์ด๋ฒํด๋ผ์ฐ๋ CLOVA OCR | ์ ๋ก๋๋ ๊ณ์ฝ์ ์ด๋ฏธ์ง์์ ๊ฐ์ธ์ ๋ณด ์์น(์ขํ) ๊ฒ์ถ โ ๋ง์คํน ์ฒ๋ฆฌ | ๋ค์ด๋ฒํด๋ผ์ฐ๋ ํ๋ซํผ |
| ๋ค์ด๋ฒ ๊ฒ์ API (๋ด์ค) | ์ต๊ทผ ์ ์ธ์ฌ๊ธฐ ๋ด์ค ์กฐํ, ์ง์ญ๋ณ "์ ์ธ์ฌ๊ธฐ" ์ธ๊ธ ๋น๋ ์ง๊ณ | ๋ค์ด๋ฒ ๊ฐ๋ฐ์์ผํฐ |
| ๊ตญํ ๊ตํต๋ถ ์ค๊ฑฐ๋๊ฐ API | ์ํํธยท์ฐ๋ฆฝ๋ค์ธ๋ ๋งค๋งค/์ ์์ธ ์ค๊ฑฐ๋๊ฐ โ ์ง์ญ๋ณ ์ ์ธ๊ฐ์จ ๊ณ์ฐ | ๊ณต๊ณต๋ฐ์ดํฐํฌํธ |
| HUG ์์ต์ฑ๋ฌด๋ถ์ดํ์ ๋ช ๋จ | ๊ณ์ฝ์ ์๋์ธ ์ค๋ช ๋์กฐ, ์ง์ญ๋ณ ์ํ๋ ๋ฐ๋ ์ฐ์ถ | HUG ์์ฌ์ ์ธํฌํธ (๊ณต๊ฐ ๋ช ๋จ ํ์ด์ง ์ฃผ๊ธฐ์ ๋๊ธฐํ) |
| ์นด์นด์ค๋งต API | ์์ฌ ์๊ทธ๋ ๋งต ์ง๋ ๋ ๋๋ง ๋ฐ ์ง์ญ ํด๋ฆฌ๊ณค ์๊ฐํ | Kakao Developers |
| Google / Kakao OAuth | ์์ ๋ก๊ทธ์ธ | Google Cloud Console / Kakao Developers |
๊ตญํ ๊ตํต๋ถ API๋ ์ํํธ/์ฐ๋ฆฝ๋ค์ธ๋ ๊ฐ๊ฐ ๋งค๋งคยท์ ์์ธ ์๋ฃ๋ฅผ ๋ณ๋๋ก ์ ์ฒญํด์ผ ํฉ๋๋ค (์ด 4๊ฐ). HUG ๋ช ๋จ์ ๋ณ๋ ์คํAPI๊ฐ ์์ด,
scripts/sync-hug-defaulters.mjs๊ฐ ๊ณต๊ฐ ๋ช ๋จ ํ์ด์ง๋ฅผ GitHub Actions๋ก ์ฃผ 1ํ ํฌ๋กค๋งํด DB์ ๋๊ธฐํํฉ๋๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ์ ์ผ๋ฐ ๊ฐ๋ฐ์ ๊ณ์ ์์๋ ์ด๋ฉ์ผ ๋์ํญ๋ชฉ(account_email)์ด ์ ํ๋์ด ์์ด, ๋น์ฆ ์ฑ ์ ํ ํ ์ด๋ฉ์ผ ํ์ ๋์๋ก ์ค์ ํด์ผ ์ ์ ๋์ํฉ๋๋ค. CLOVA OCR์ ๋ฌด๋ฃ ๋ฑ๊ธ ๊ธฐ์ค ์ 100ํ ํธ์ถ ํ๋๊ฐ ์์ต๋๋ค โ ๊ณ์ฝ์ ๋ถ์ 1๊ฑด๋ง๋ค 1ํ ์๋ชจ๋ฉ๋๋ค.
| ํ ์ด๋ธ | ์ค๋ช |
|---|---|
analyses |
๊ณ์ฝ์ ์ค์บ ๋ถ์ ๊ฒฐ๊ณผ (์ํ๋, ์กฐํญ, ์ถ์ฒ ์กฐ์น ๋ฑ). ์ด๋ฏธ์งยทOCR ์๋ฌธยท์๋์ธ ์ฑ๋ช
ยทHUG ๋์กฐ ๊ฒฐ๊ณผ๋ ์ ์ฅํ์ง ์์. score_direction ์ปฌ๋ผ์ผ๋ก ์ /๊ตฌ ์ฑ์ ๊ธฐ์ค(์ ์ ๋ฐฉํฅ) ๊ตฌ๋ถ |
gaslighting_checks |
๋ง์ ์๋ด ๋ํ ๋ถ์ ๊ฒฐ๊ณผ (ํจํด, ์ ๋ขฐ๋, ์ถ์ฒ ์๋ต) |
news |
์ ์ธ์ฌ๊ธฐ ๊ด๋ จ ๋ด์ค ์บ์ |
region_stats |
์ ๊ตญ ์/๊ตฐ/๊ตฌ๋ณ ์ ์ธ๊ฐ์จ, HUG ์ฑ๋ฌด๋ถ์ดํ์ ๋ฐ๋, ๋ด์ค ์ธ๊ธ ๊ฑด์, ์ข ํฉ ์ํ๋ ์ ์ |
region_sync_cursor |
์ ๊ตญ ๋ฐ์ดํฐ ๋ฐฐ์น ์ฒ๋ฆฌ ์งํ ์ํ (Edge Function ์คํ ์๊ฐ ์ ํ ๋์) |
contract_risk_patterns |
์ ์ธ์ฌ๊ธฐยท๋ ์์กฐํญ ์ค์ ํผํด ํจํด DB (๊ณ์ฝ์ ๋ถ์ RAG ๊ฒ์ ๋์) |
hug_defaulters |
HUG ์์ต ์ฑ๋ฌด๋ถ์ดํ์ ๊ณต๊ฐ ๋ช ๋จ ๋ก์ปฌ ์บ์ (์ฃผ 1ํ ๋๊ธฐํ) |
hug_sync_cursor |
HUG ๋ช ๋จ ํฌ๋กค๋ง ์งํ ์ํ |
batch_job_status |
๋ฐฐ์น 4์ข (์์ธยท์ง์ญ๋ด์ค์ธ๊ธยท์ ์ธ์ฌ๊ธฐ๋ด์คยทHUG๋ช ๋จ)์ ๋ง์ง๋ง ์คํ/์ฑ๊ณต ์๊ฐยท์๋ฌ ๊ธฐ๋ก. RLS๋ก ์ง์ ๋ ๊ด๋ฆฌ์ ๊ณ์ ๋ง ์กฐํ ๊ฐ๋ฅ |
| ํจ์๋ช | ์ญํ | ์คํ ๋ฐฉ์ |
|---|---|---|
analyze-contract |
CLOVA OCR๋ก ๊ณ์ฝ์ ์ด๋ฏธ์ง์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ง์คํนํ ๋ค RAG(์ํ ํจํด DB)์ ํจ๊ป Gemini API๋ก ๋ถ์, HUG ๋ช ๋จ ์ค๋ช ๋์กฐ | ์ฌ์ฉ์ ์์ฒญ ์ |
analyze-chat |
๊ฐ์ค๋ผ์ดํ ๋ํ ํ ์คํธ/์ด๋ฏธ์ง ๋ถ์ | ์ฌ์ฉ์ ์์ฒญ ์ |
fetch-market-data |
๊ตญํ ๋ถ ์ค๊ฑฐ๋๊ฐ ์กฐํ โ ์ ์ธ๊ฐ์จ ๊ณ์ฐ | pg_cron ๋ฐฐ์น (์๋) |
fetch-region-buzz |
๋ค์ด๋ฒ ๋ด์ค ์ง์ญ๋ณ ์ธ๊ธ ๊ฑด์ ์ง๊ณ | pg_cron ๋ฐฐ์น (์๋) |
scripts/sync-hug-defaulters.mjs(Node ์คํฌ๋ฆฝํธ, GitHub Actions ์ฃผ 1ํ ์คํ)๋ Edge Function์ด ์๋๋ผ ๋ณ๋ ํฌ๋กค๋ฌ์
๋๋ค. HUG ๋ช
๋จ ํ์ด์ง๊ฐ 228ํ์ด์ง์ ๋ฌํด Edge Function ์คํ์๊ฐ ์ ํ์ ๋๊ธฐ ๋๋ฌธ์ ๋
๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ๋ถ๋ฆฌํ์ต๋๋ค. ํ์ด์ง ์์ฒญ ์ฌ์ด 500ms1์ด ๋๋ค ๋๋ ์ด, ์ฐ๊ฒฐ ์คํจ ์ ์ฌ์๋(์ต๋ 3ํ, 23์ด ๋๊ธฐ), 20ํ์ด์ง๋ง๋ค ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ์ ์ฅํ๋ ์ฒดํฌํฌ์ธํธ ๋ฐฉ์์ ์ ์ฉํด, ๋์ค์ ์คํจํด๋ ์ฒ์๋ถํฐ ๋ค์ ๋์ง ์๊ณ ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ ํ์ด์ง๋ถํฐ ๋ค์ ์คํ์ด ์ด์ด์ ์งํํฉ๋๋ค.
VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=
VITE_KAKAO_MAP_KEY=
GEMINI_API_KEY=
NAVER_CLIENT_ID=
NAVER_CLIENT_SECRET=
MOLIT_API_KEY=
CLOVA_OCR_INVOKE_URL=
CLOVA_OCR_SECRET_KEY=
SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=
โ ๏ธ Gemini, ๋ค์ด๋ฒ, ๊ตญํ ๋ถ ํค๋ ์ ๋ ํ๋ก ํธ์๋(VITE_์ ๋์ฌ)์ ๋ฃ์ง ์๊ณ Supabase Secrets๋ก๋ง ๊ด๋ฆฌํฉ๋๋ค. ์นด์นด์ค๋งต ํค๋ ๋ธ๋ผ์ฐ์ ๋ ธ์ถ์ ์ ์ ๋ก ์ค๊ณ๋ ํค์ด๋ฏ๋ก ํ๋ก ํธ์๋ ํ๊ฒฝ๋ณ์๋ก ๊ด๋ฆฌํฉ๋๋ค.โ ๏ธ SUPABASE_SERVICE_ROLE_KEY๋ RLS๋ฅผ ์ฐํํ๋ ์ต๊ณ ๊ถํ ํค์ด๋ฏ๋ก, GitHub Actions Secrets์๋ง ๋ฑ๋กํ๊ณ ์ ๋ ์ํฌํ๋ก์ฐ ํ์ผ์ด๋ ์ปค๋ฐ์ ๊ฐ ์์ฒด๋ฅผ ๋จ๊ธฐ์ง ์์ต๋๋ค.
# ์ค์น
npm install
# ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run dev
# Edge Function ๋ฐฐํฌ (Supabase CLI)
npx supabase login
npx supabase link --project-ref <project-ref>
npx supabase functions deploy <function-name>
# DB ๋ง์ด๊ทธ๋ ์ด์
๋ฐ์
npx supabase db push- HUG ๋ช
๋จ ๋๊ธฐํ๊ฐ GitHub Actions(CI ํ๊ฒฝ)์์ IP ์ฐจ๋จ์ผ๋ก ์คํจํ ์ ์์ต๋๋ค: HUG ์ฌ์ดํธ๊ฐ
์งง์ ์๊ฐ์ ๋ฐ๋ณต ์์ฒญ์ ๋ณด๋ด๋ IP๋ฅผ ์๋ ์ ํ/์ฐจ๋จํ ๊ฐ๋ฅ์ฑ์ด ์์ด, ์๋ ์ค์ผ์ค(์ฃผ 1ํ)์ ๊ทธ๋๋ก
์ ์งํ๋ ์คํจ๊ฐ ๋ฐ๋ณต๋๋ฉด ๋ก์ปฌ PC(๊ณ ์ IP)์์
node scripts/sync-hug-defaulters.mjs๋ฅผ ์๋ ์คํํด ๋์ฒดํ๋ ์ด์ ๋ฐฉ์์ ์ฐ๊ณ ์์ต๋๋ค. - ๋ง์คํน๋ ์ด๋ฏธ์ง๋ ํด๋ผ์ด์ธํธ๋ก ๋ฐํ๋์ง ์์ต๋๋ค: ๊ฐ์ธ์ ๋ณด๊ฐ ์ ๋๋ก ๊ฐ๋ ค์ก๋์ง ํ๋ฉด์์ ์ง์ ๋์ผ๋ก ํ์ธํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ ์ค์๊ฐ ์๋๋ผ ๋ง์คํน ์คํจ/์๋ณธ ์ด๋ฏธ์ง๊ฐ ์ด๋ค ๊ฒฝ๋ก๋ก๋ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋์ง ์๋๋ก ํ๋ ์ค๊ณ์ ์๋์ ๋๋ค.
| ์ด๋ฆ | ์ญํ |
|---|---|
| ๊นํฌ์ฑ | ๋ฐฑ์๋ |
| ์ ์์ | ๋ฐฑ์๋ |
| ์ด์์ | ํ๋ก ํธ์๋ |
| ์กฐ์ฑ์ฐฌ | ํ๋ก ํธ์๋ |
๋ฏธ๋ฆผ๋ง์ด์คํฐ๊ณ ์ง๋ฅํ์ํํธ์จ์ด๊ณผ
์ด ํ๋ก์ ํธ๋ ๊ต์ก ๋ชฉ์ ์ ํ ํ๋ก์ ํธ๋ก ์ ์๋์์ต๋๋ค.