๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Dev-diary/์ผ์ƒ

๋ฆฌํŒฉํ† ๋ง : 4์ฃผ์ฐจ ํ”Œ์  kakao Map API ๋งˆ์ปค ์ƒํƒœ ๊ด€๋ฆฌ (1)

by ciocio 2022. 2. 16.

๐Ÿ“  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ ํ›„ ์•„์‰ฌ์› ๋˜ ๊ฒƒ๋“ค

 

๋‹น์—ฐํžˆ ๋ถ€์กฑํ•˜๊ณ , ์•„์‰ฌ์šด ๊ฒƒ๋“ค ํˆฌ์„ฑ์ด๋‹ค. 

์Šค์Šค๋กœ ์ž์ฑ…ํ•˜๊ธฐ ๋ณด๋‹จ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณ ์ณ๋‚˜๊ฐ€๊ธฐ๋กœ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๊ณ ์น  ์ ๋“ค์„ ๋ฆฌ์ŠคํŠธ์—… ํ•ด๋ณธ๋‹ค.

๊ทธ๋‚  ๊ทธ๋‚  ๊ณ ์นœ ์ ๋“ค์„ ์ ๊ณ  ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”์ง€,

๋˜ ์–ด๋–ค ์‹์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ์ง€ ๋“ฑ์„ ๊ธฐ๋กํ•œ ๋ฆฌํŒฉํ† ๋ง ๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค ๐Ÿ‘€

 

โœ”  ๋ฃจํŠธ ์ƒ์„ฑ ํŽ˜์ด์ง€, ๋ฃจ์ธ  ์ˆ˜์ • ํŽ˜์ด์ง€ : ๋งˆ์ปค ์—ฌ๋Ÿฌ๊ฐœ (5๊ฐœ ์ด์ƒ) ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ํ™”๋ฉด์ด ํ•˜์–˜์ง€๋Š” ์—๋Ÿฌ

 

-->  ์ด๊ฑฐ ์ •๋ง ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์˜€๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฑฐ์˜ ๋๋‚  ๋•Œ์ฆˆ์Œ์— ๋งŒ๋‚œ ์—๋Ÿฌ๋ผ ๊ธฐ๊ฐ„ ๋‚ด์— ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ œ์ถœํ–ˆ์—ˆ๋‹ค. ๐Ÿ˜“

์‹ฌ์ง€์–ด ํŒ€์›๋ถ„์ด "๋งˆ์ปค๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ํ•˜๋ฉด ํ™”๋ฉด ๋™์ž‘์ด ๋Š๋ ค์ ธ์š” !" ๋ผ๊ณ  ์•Œ๋ ค์ฃผ์…”์„œ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋๋‹ค.

 

๋…ธํŠธ๋ถ์—์„œ, ํ˜น์€ ๋ชจ๋ฐ”์ผ์—์„œ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ๋‹นํ• ๊นŒ ?-? ๋ฅผ ๊ณ ๋ฏผํ•˜์ง€ ์•Š์€ ๋Œ€๊ฐ€์˜€๋‹ค.

๋ณ€๋ช…์„ ํ•˜์ž๋ฉด, ๋ฐ์Šคํฌํƒ‘์„ ์“ฐ๋Š๋ผ ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ง€ ์บ์น˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค .. ใ… .ใ… 

 

๐Ÿ˜จ  BEFORE

 

 

๋งˆ์ปค๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค  (์ง€๋„์— ๋งˆ์ปค๊ฐ€ ์–นํ˜€์งˆ ๋•Œ๋งˆ๋‹ค) ๋Š˜์–ด๋‚˜๋Š” ํƒœ๊ทธ๋“ค์ด ๋ณด์ด์‹ญ๋‹ˆ๊นŒ ..!

์˜ค๋ฅธ์ชฝ ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์ ์  ์งง์•„์ง€๋Š” ๊ฑธ ๋ณด๋ฉด ์ƒˆ์‚ผ ๋†€๋ž๋‹ค.

ํ˜„์žฌ๋Š” ๋ฐ์Šคํฌํƒ‘์—์„œ ์—ฐ๊ฑฐ๋ผ ํ™”๋ฉด์ด ํ•˜์–˜์ง€๊ฑฐ๋‚˜ ๋™์ž‘์ด ๋ฉˆ์ถ”๋Š” ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ

๋…ธํŠธ๋ถ์—์„œ๋Š” 5๊ฐœ ์ด์ƒ๋งŒ ๋˜๋„ ๋ฒ„๋ฒ…์˜€๋‹ค... ๐Ÿ˜ฐ

 

์ง€๋„ API๋Š” useEffect๋ฅผ ์‚ฌ์šฉํ•ด DOM Element์— ์ง์ ‘ ์–น๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์ง€๋„ ์œ„์— ์–ด๋–ค ์ •๋ณด๋ฅผ ์–น๊ธฐ ์œ„ํ•ด์„  HTML Element๋‚˜ HTML ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์‚ฝ์ž…ํ•ด์ค˜์•ผํ–ˆ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋ Œ๋”๋ง๋˜๋Š” ๋ฆฌ์•กํŠธ์˜ ํŠน์„ฑ๊ณผ ๋ฐ˜๋Œ€๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ

๋ Œ๋”๋ง ์ดํ›„์— ์ƒ์„ฑ๋œ DOM์€ ๋‚ด๊ฐ€ ์ง ์ ‘ ์ฐพ ์•„ ์„œ ์ง€์›Œ์ค˜์•ผํ•œ๋‹ค.

 

๐Ÿ™Œ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

 

์นด์นด์˜ค ์ง€๋„ API๋ฅผ ๋ณด๋ฉด

setMap(๋งˆ์ปค) ์ฒ˜๋Ÿผ ์ •๋ณด๋ฅผ ์ง€๋„ ์œ„์— ํ‘œ์‹œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ์žˆ์ง€๋งŒ

setMap(null) ์ฒ˜๋Ÿผ ์ •๋ณด๋ฅผ ์ง€๋„ ์œ„์—์„œ ์ง€์šฐ๋Š” ๋ฉ”์„œ๋“œ๋„ ์žˆ๋‹ค.

 

๋‚œ ํ‘œ์‹œํ•  ์ค„๋งŒ ์•Œ์•˜์ง€, ์ง€์šธ ์ƒ๊ฐ์€ ์ถ”ํ˜ธ๋„ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

// ์ด์ „ ์ฝ”๋“œ : ์ƒ์„ฑ๋งŒ ํ•จ
// marker๋ฉ”์„œ๋“œ์— mapํ‚ค์— ์ƒ์„ฑ๋œ ์ง€๋„๋ฅผ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด 
// setMap(๋งˆ์ปค) ๋ฉ”์„œ๋“œ ์—†์ด๋„ ์ง€๋„ ์œ„์— ํ‘œ์‹œ๋œ๋‹ค.

const markerForSearch = new kakao.maps.Marker({
  image: markerImageForSearch,
  map: map,
  position: new kakao.maps.LatLng(
    sliceLatLng(place.y),
    sliceLatLng(place.x),
  ),
  clickable: true,
});

 

// ์ดํ›„ ์ฝ”๋“œ : ์ƒ์„ฑ + ํ•ด์ œ ๊ฒธ๋น„
// ์ด์ „์— ์ €์žฅ๋œ ๋งˆ์ปค๊ฐ€ ์žˆ๋‹ค๋ฉด setMap(null)๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋งˆ์ปค๋ฅผ ํ•ด์ œ์‹œ์ผœ์ค€ ํ›„
// ์ƒˆ๋กœ์šด ๋งˆ์ปค๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์ ์šฉํ–ˆ๋‹ค.

const [, setBlueMarkers] = useState<any>(null);

setBlueMarkers((blueMarker: any) => {
  // ๋งˆ์ปค ์ƒํƒœ ๊ด€๋ฆฌ
  if (blueMarker !== null) {
    blueMarker.setMap(null);
  }
  return marker;
});

 

์ด๋ฒˆ์— ๊ฐœ๋…์„ ๋ณต์Šตํ•˜๋ฉด์„œ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์‚ฌ์‹ค์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

" ์–ด๋–ค ๊ฐ’์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜์— null์„ ์žฌํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๊ฐ’์ด ์—†๋‹ค๊ณ  ์ธ์‹ํ•ด,

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ž‘๋™ํ•ด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค " ๋Š” ๊ฒƒ !!

 

์•„ ๊ทธ๋ž˜์„œ ์นด์นด์˜ค ์ง€๋„ API๊ฐ€ ์ด๋ ‡๊ฒŒ ์„ค๊ณ„๋œ ๊ฑด๊ฐ€ ? ๋ž€ ์ถ”์ธก์„ ํ•˜๊ฒŒ๋๋‹ค ใ…Žใ…Ž

๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ null์„ ๋ฐ›์œผ๋ฉด ์ง€๋„ ์œ„์—์„œ ํ•ด์ œ์‹œํ‚ค๊ฒŒ๋” ?!

 

๐Ÿ˜Š  AFTER

 

 

์•„๋ฌด๋ฆฌ ์ถ”๊ฐ€ํ•ด๋„ ๋ณด์ด์ง€ ์•Š๋Š” ์Šคํฌ๋กค ๋ณด์ด์‹ญ๋‹ˆ๊นŒ ... ์บฌ  ๐Ÿคœ ๐Ÿค›

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ์ƒ ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋งˆ์ปค (ํŒŒ๋ž€์ƒ‰), ๊ฒ€์ƒ‰์œผ๋กœ ๋„์ถœ๋˜๋Š” ๋งˆ์ปค (ํšŒ์ƒ‰) ์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ๊ณ 

์—ฌ๊ธฐ์— "์ˆ˜์ •" ๊ธฐ๋Šฅ๊นŒ์ง€ ์ถ”๊ฐ€ํ•˜๋Š๋ผ ์•  ์ข€ ๋จน์—ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฟŒ๋“ฏํ–ˆ๋‹ค ! ใ… ใ…  

100๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ถ€ํ•˜๋Š” ์•ˆ์ƒ๊ธด๋‹ค !-!

 

๐Ÿคจ  ๋” ์•Œ์•„ ๋ณผ ๊ฒƒ

 

์นด์นด์˜ค ์ง€๋„๋ฅผ ๋ถˆ๋Ÿฌ์™”๋˜ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•˜๊ฒŒ useEffect๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ๋กœ์ง์„ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํŒŒ๋ž€์ƒ‰ ๋งˆ์ปค, ํšŒ์ƒ‰ ๋งˆ์ปค, ๋นจ๊ฐ„์ƒ‰ ๋งˆ์ปค ์ด 3๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ  dependency๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ๋ฆฌ๋žœ๋”๋ง์ด ์ผ์–ด๋‚˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ...!

 

๋™์ž‘์€ ์ž˜๋˜๋Š”๋ฐ, ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋Š๋‚Œ์ด ๊ฐ•ํ–ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ง€๋„ ๊ฐ์ฒด๋ฅผ redux ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋‚˜ ...? ๋ž€ ์ƒ๊ฐ๋„ ํ–ˆ๊ณ  ํ  .. ๐Ÿค”

์นด์นด์˜ค ์ง€๋„ api๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ  ์จ์•ผ ํ•˜๋‚˜ ...? (์ปค์Šคํ…€ ?)

 

์–ด์จŒ๋“ , ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ๋Š๊ผˆ๋‹ค. api๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋˜ ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค !!-!!

 

 

๐Ÿ“ map api ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€