๐Ÿ“– TIL - React์—์„œ ์นด์นด์˜ค๋งต API๋กœ ์ง€์˜ค์ฝ”๋”ฉ ๊ตฌํ˜„ํ•˜๊ธฐ

์Š˜ยท2025๋…„ 2์›” 28์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
67/90

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

์˜ค๋Š˜ React ํ”„๋กœ์ ํŠธ์—์„œ ์นด์นด์˜ค๋งต API๋ฅผ ์‚ฌ์šฉํ•ด ์ง€๋„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. ํŠนํžˆ ์ขŒํ‘œ์™€ ์ฃผ์†Œ๋ฅผ ์„œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ง€์˜ค์ฝ”๋”ฉ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ๋Š”๋ฐ, ์ฒ˜์Œ ์จ๋ณด๋Š” ๊ฑฐ๋ผ ์ด๊ฒƒ์ €๊ฒƒ ์‚ฝ์งˆ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

๐Ÿค” ๋ฌธ์ œ ์ ‘๊ทผ

  1. ์ผ๋‹จ ๊ธฐ๋ณธ ์ง€๋„๋ถ€ํ„ฐ ๋„์›Œ๋ณด์ž
  2. ์ง€๋„์—์„œ ์œ„์น˜ ์„ ํƒํ•˜๋Š” ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ
  3. ์„ ํƒํ•œ ์œ„์น˜์˜ ์ฃผ์†Œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
  4. ์ฃผ์†Œ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ์œ„์น˜ ์ฐพ๊ธฐ

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ง€๋„ ์ปดํฌ๋„ŒํŠธ

React-Kakao-Maps-SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Map, MapMarker ๊ฐ™์€ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•ด์„œ ์ง€๋„๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ง€๋„๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ทธ ์œ„์น˜์— ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ํ•ด๋‹น ์œ„์น˜์˜ ์ขŒํ‘œ๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ๋งŒ๋“ค์—ˆ๋‹ค.

์—ญ์ง€์˜ค์ฝ”๋”ฉ (์ขŒํ‘œ โ†’ ์ฃผ์†Œ)

์ด ๋ถ€๋ถ„์ด ์ข€ ํ—ท๊ฐˆ๋ ธ๋‹ค. React-Kakao-Maps-SDK๋Š” ์ง€๋„ ์ปดํฌ๋„ŒํŠธ๋งŒ ์ œ๊ณตํ•˜๊ณ , ์ง€์˜ค์ฝ”๋”ฉ ๊ฐ™์€ ์„œ๋น„์Šค๋Š” ์›๋ž˜ ์นด์นด์˜ค๋งต API๋ฅผ ๊ทธ๋Œ€๋กœ ์จ์•ผ ํ–ˆ๋‹ค.

useRef๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์˜ค์ฝ”๋” ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ–ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋ผ๋„ ๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋˜๋Š” ์žฅ์ ์ด ์žˆ์—ˆ๋‹ค.

// ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Œ (๊ฐ„๋žตํžˆ)
const geocoder = useRef(null);

useEffect(() => {
  geocoder.current = new window.kakao.maps.services.Geocoder();
}, []);

// ์ขŒํ‘œ๋กœ ์ฃผ์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ
const getAddress = (lat, lng) => {
  geocoder.current.coord2Address(lng, lat, (result, status) => {
    if (status === window.kakao.maps.services.Status.OK) {
      // ์—ฌ๊ธฐ์„œ ์ฃผ์†Œ ์ •๋ณด ์ฒ˜๋ฆฌ
    }
  });
};

์ฃผ์†Œ ๊ฒ€์ƒ‰ (์ฃผ์†Œ โ†’ ์ขŒํ‘œ)

๊ฒ€์ƒ‰์ฐฝ์— ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ง€๋„์—์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๊ธฐ๋Šฅ๋„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์—ญ์ง€์˜ค์ฝ”๋”ฉ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์นด์นด์˜ค API๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

โœจ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ์ 

  1. ์นด์นด์˜ค๋งต API ๊ตฌ์กฐ

    • JavaScript API์™€ React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์จ์•ผ ํ•œ๋‹ค๋Š” ์ 
    • ์ง€๋„ ํ‘œ์‹œ์™€ ์ง€์˜ค์ฝ”๋”ฉ ์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์ 
  2. useRef์˜ ํ™œ์šฉ

    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ React์—์„œ ๊ด€๋ฆฌํ•  ๋•Œ useRef๊ฐ€ ์ •๋ง ์œ ์šฉํ•จ
    • ๋ Œ๋”๋ง๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 
  3. ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ

    • ์นด์นด์˜ค๋งต API๋Š” ๋Œ€๋ถ€๋ถ„ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•จ
    • Promise๋กœ ๊ฐ์‹ธ์„œ async/await ์Šคํƒ€์ผ๋กœ ๋ฐ”๊ฟ” ์“ธ ์ˆ˜๋„ ์žˆ์Œ

๐Ÿš€ ์ด๋Ÿฐ ์ ์ด ํšจ์œจ์ ์ด์—์š”

๋‹จ๊ณ„๋ณ„๋กœ ์ ‘๊ทผํ•œ ๊ฒŒ ๋„์›€์ด ๋งŽ์ด ๋๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค๋ฉด ๋” ํ—ท๊ฐˆ๋ ธ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ธฐ๋ณธ ์ง€๋„ ํ‘œ์‹œ โ†’ ๋งˆ์ปค ์ถ”๊ฐ€ โ†’ ์ง€์˜ค์ฝ”๋”ฉ ์ถ”๊ฐ€ ์ˆœ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋”๋‹ˆ ๋””๋ฒ„๊น…๋„ ์‰ฌ์› ๊ณ  ์ดํ•ด๋„ ์ž˜ ๋๋‹ค.

useRef๋ฅผ ์จ์„œ ์ง€์˜ค์ฝ”๋” ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•œ ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด์—ˆ๋‹ค. useState๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์—๋Š” ์ด ๊ธฐ๋Šฅ์„ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉฐ, ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•ด๋ณด๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋” ๋†’์•„์งˆ ๊ฒƒ ๊ฐ™๋‹ค.

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€