โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๊ธฐ์ˆ  ๋ฐ ๊ฐœ๋ฐœ

๐Ÿ—บ๏ธ ์ฃผ์†Œ ์ง€์˜ค์ฝ”๋”ฉ API ๋งค์นญ ์‹คํŒจ์œจ ๊ทน๋ณต ๋ฐ ํด๋ฐฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

์ž‘์„ฑ์ž: ๋ฆฌ์น˜๋กœ๋“œ GIS ์—”์ง€๋‹ˆ์–ด K์”จ์ตœ์ข… ์—…๋ฐ์ดํŠธ: 2026๋…„ 6์›”

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฆฌ์น˜๋กœ๋“œ ํ”„๋กœ์ ํŠธ์—์„œ GIS(์ง€๋ฆฌ์ •๋ณด์‹œ์Šคํ…œ) ์—”์ง€๋‹ˆ์–ด๋ง๊ณผ ์ง€๋„ ์‹œ๊ฐํ™” ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„๋ฅผ ์ด๋ˆ K์ž…๋‹ˆ๋‹ค. ์ €ํฌ ์„œ๋น„์Šค์—์„œ ์œ ์ € ๋งŒ์กฑ๋„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ธฐ๋Šฅ์€ ๋ฐ”๋กœ ๊ณ ์œ„๊ณต์ง์ž๋“ค์˜ ๋ถ€๋™์‚ฐ ๋ณด์œ  ํ˜„ํ™ฉ์„ ์ „๊ตญ ์ง€๋„์— ํ•€์œผ๋กœ ๋ฟŒ๋ ค ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” '์ž์‚ฐ ์ง€๋„(Asset Map)'์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋กœ ๋œ ์•„ํŒŒํŠธ ๋ฐ ํ† ์ง€ ์ฃผ์†Œ๋ฅผ ๊ฒฝ์œ„๋„ ์ขŒํ‘œ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ์ง€์˜ค์ฝ”๋”ฉ(Geocoding)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„๋‹จํ•ด ๋ณด์ด๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ๋งˆ์ฃผํ•œ ๋”์ฐํ•œ ์ฃผ์†Œ์˜ ํ˜„์‹ค๊ณผ, ์ €ํฌ ๊ฐœ๋ฐœํŒ€์ด ๊ตฌํ˜„ํ•œ ๊ธฐ๋ฐœํ•œ ํ•ด๊ฒฐ์ฑ…์ธ '์Šค๋งˆํŠธ ํด๋ฐฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜'์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

1. ๋น„ํ‘œ์ค€ ์ฃผ์†Œ ๋ฐ์ดํ„ฐ์˜ ๋‚œ๋ฌด: ์ฃผ์†Œ๊ณ„์˜ ๋‚œ์žฅํŒ

๊ณต์ง์ž๋“ค์ด ์ž‘์„ฑํ•ด ๋‚ธ ๋ถ€๋™์‚ฐ ์ฃผ์†Œ ํ…์ŠคํŠธ๋Š” ํ‘œ์ค€ ๋„๋กœ๋ช… ์ฃผ์†Œ ์ฒด๊ณ„์™€๋Š” ์ฒœ๋งŒ๊ด‘๋…„ ๋–จ์–ด์ง„ ์•ผ์ƒ์˜ ํ…์ŠคํŠธ์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ๋ถˆ๊ทœ์น™ํ•œ ์ฃผ์†Œ๋“ค์ด ๋ฌด์ˆ˜ํžˆ ์Ÿ์•„์กŒ์Šต๋‹ˆ๋‹ค.

  • "๊ฒฝ๊ธฐ๋„ ์„ฑ๋‚จ์‹œ ๋ถ„๋‹น๊ตฌ ์‚ผํ‰๋™ 624 ๋ด‡๋“ค๋งˆ์„ 7๋‹จ์ง€ ์•„ํŒŒํŠธ 701๋™ [๋ณธ์ธ์†Œ์œ ]" (์†Œ์œ  ๊ด€๊ณ„ ๊ด„ํ˜ธ ๋ฌธ๊ตฌ ์‚ฝ์ž…)
  • "๊ฒฝ์ƒ๋ถ๋„ ์•ˆ๋™์‹œ ํ’์ฒœ๋ฉด ๊ฐˆ์ „๋ฆฌ 1600๋ฒˆ์ง€ ์™ธ 3ํ•„์ง€" (์ง€๋ฒˆ ํ˜ผ์šฉ ๋ฐ ๋‹ค์ค‘ ํ•„์ง€ ํ‘œ๊ธฐ)
  • "์„œ์šธ ์ข…๋กœ๊ตฌ ํ˜œํ™”๋™ 15-10๋ฒˆ์ง€ ์ง€์ƒ 2์ธต ์ฃผํƒ ์ค‘ 201ํ˜ธ (๋ฐฐ์šฐ์ž์†Œ์œ  ์ง€๋ถ„ 1/2)" (์ง€๋ถ„ ์ •๋ณด ๊ฒฐํ•ฉ)

์ด ์ƒํƒœ ๊ทธ๋Œ€๋กœ ์นด์นด์˜ค ๋งต ๋กœ์ปฌ API๋‚˜ ๊ตญํ† ๋ถ€ ๋ธŒ์ด์›”๋“œ(V-world) ์ง€์˜ค์ฝ”๋”ฉ API์— ์ง‘์–ด๋„ฃ์œผ๋ฉด API ์—”์ง„์€ "์ฃผ์†Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์Œ (Status Code 404)" ์—๋Ÿฌ๋ฅผ ๋ฑ‰์œผ๋ฉฐ ๋ณ€ํ™˜์œจ์ด 50% ๋ฏธ๋งŒ์œผ๋กœ ๋š ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ง€๋„์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ํ•˜์–—๊ฒŒ ๋น„์–ด๋ฒ„๋ฆฌ๋Š” ์ฐธ๊ทน์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2. ๋ฆฌ์น˜๋กœ๋“œ ์ฃผ์†Œ ์ •์ œ ๋ฐ ์Šค๋งˆํŠธ ํด๋ฐฑ ํŒŒ์ดํ”„๋ผ์ธ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ €ํฌ๋Š” ๋ฐ์ดํ„ฐ ์ •์ œ ํŒŒ์ดํ”„๋ผ์ธ ์ „๋ฉด์— ์ •๊ทœํ‘œํ˜„์‹ ํด๋ Œ์ €(Cleanser)์™€ Y๋ถ„์„ ํด๋ฐฑ ์—”์ง„์„ ๊ฐ€๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋…ธ์ด์ฆˆ ๊ด„ํ˜ธ ๋ฌธ๊ตฌ ์ œ๊ฑฐ: ์ฃผ์†Œ ๋’ท๋ถ€๋ถ„์— ๋ถ™์€ "[๋ณธ์ธ์†Œ์œ ]", "(๋ฐฐ์šฐ์ž์ง€๋ถ„ 1/2)", "์™ธ 2ํ•„์ง€" ๋“ฑ์˜ ์ •ํ˜• ๋…ธ์ด์ฆˆ ํ…์ŠคํŠธ๋ฅผ Regex ํŒจํ„ด์œผ๋กœ ์ „๋ถ€ ์ œ๊ฑฐํ•˜๊ณ  ํ‘œ์ค€ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋งŒ ๋ฐœ๋ผ๋ƒ…๋‹ˆ๋‹ค.
  2. 1์ฐจ ์ •๋ฐ€ ์ง€์˜ค์ฝ”๋”ฉ ์‹œ๋„: ์ •์ œ๋œ ์ฃผ์†Œ ์ „์ฒด๋กœ API๋ฅผ ํ˜ธ์ถœํ•ด ์ •๋ฐ€ ์ขŒํ‘œ(์ง€๋ฒˆ/๋„๋กœ๋ช… ์ˆ˜์ค€) ๋ณ€ํ™˜์„ ๋…ธ๋ฆฝ๋‹ˆ๋‹ค.
  3. ๋ฒˆ์ง€์ˆ˜ ์ˆœ์ฐจ์  ์ ˆ์‚ญ ํด๋ฐฑ (์Šค๋งˆํŠธ ํด๋ฐฑ): 1์ฐจ ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ, ์ฃผ์†Œ ๋ฌธ์ž์—ด์˜ ์šฐ์ธก ๋ ๋‹จ์–ด(ํ˜ธ์‹ค ๋ฒˆํ˜ธ, ๋™ ๋ฒˆํ˜ธ, ์ƒ์„ธ ์ง€๋ฒˆ)๋ฅผ ์ŠคํŽ˜์ด์Šค ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ž˜๋ผ๊ฐ€๋ฉฐ API ์žฌ์‹œ๋„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. Y-ํด๋ฐฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ์‚ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
async function geocodeWithFallback(rawAddress) {
  // 1๋‹จ๊ณ„: ๊ด„ํ˜ธ ์ฃผ์„ ๋ฐ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
  let cleanAddress = rawAddress.replace(/\s*\[.*?\]|\s*\(.*?\)/g, "").trim();
  cleanAddress = cleanAddress.split(" ์™ธ ")[0].trim(); // ์™ธ ํ•„์ง€ ์ œ๊ฑฐ

  const addressTokens = cleanAddress.split(" ");
  
  // 2๋‹จ๊ณ„: ๋ฒˆ์ง€์ˆ˜ ์ž๋ฅด๋ฉฐ ํด๋ฐฑ ๋ฃจํ”„ ์‹คํ–‰
  for (let i = addressTokens.length; i > 1; i--) {
    const trialAddress = addressTokens.slice(0, i).join(" ");
    try {
      const response = await callGeocodingAPI(trialAddress);
      if (response.success) {
        return {
          coords: response.coords,
          precision: i === addressTokens.length ? "EXACT" : "APPROXIMATE",
          level: i // ๋งค์นญ์— ์„ฑ๊ณตํ•œ ์ฃผ์†Œ ํ† ํฐ ๊นŠ์ด ์ €์žฅ
        };
      }
    } catch (e) {
      console.error("Geocoding Error:", e);
    }
  }
  return null; // ์ตœ์ข… ์‹คํŒจ
}

3. 97.2% ๋งค์นญ ์„ฑ๊ณต์˜ ๊ฒฐ๊ณผ์™€ GIS ์‹œ์‚ฌ์ 

์Šค๋งˆํŠธ Y-ํด๋ฐฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋„์ž… ๊ฒฐ๊ณผ, ๋ฆฌ์น˜๋กœ๋“œ์˜ ์ฃผ์†Œ-์ขŒํ‘œ ๋ณ€ํ™˜ ์„ฑ๊ณต๋ฅ ์€ ๊ธฐ์กด 48.7%์—์„œ ๋ฌด๋ ค 97.2%๋กœ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ ์ง€๋ฒˆ ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์ตœ์†Œํ•œ ์ยท๋ฉดยท๋™ ๋‹จ์œ„ ํ˜น์€ ๊ตฌยท๊ตฐ ๋‹จ์œ„์˜ ์ค‘์‹ฌ ์ขŒํ‘œ(APPROXIMATE ์ˆ˜์ค€)๋กœ ์ง€๋„ ์ƒ์— ๊ณต์ง์ž์˜ ๋ถ€๋™์‚ฐ ๋ณด์œ  ํ˜„ํ™ฉ์ด ์ด˜์ด˜ํžˆ ๋งตํ•‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์  ๋•€๋ฐฉ์šธ์ด ๋ชจ์—ฌ, ์ผ๋ฐ˜ ์‹œ๋ฏผ ๋ˆ„๊ตฌ๋‚˜ ์ง€๋„๋กœ ๊ณต์ง์ž ๋ถ€๋™์‚ฐ ๋ณด์œ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž…์ฒด์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค GIS ๋ฐ์ดํ„ฐ ์ •์ œ์˜ ์‹ค์ „ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ์„œ ํƒ€ ํ”„๋กœ์ ํŠธ์—๋„ ํฐ ๋ณดํƒฌ์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.