๐Ÿš€ ์นด์นด์˜ค ์ง€๋„: ์บ ํ•‘์žฅ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

Yeonnยท2025๋…„ 3์›” 10์ผ
0

๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
6/10
post-thumbnail

โœ”๏ธ '์‚ฌ์šฉ์ž ์œ„์น˜ ๊ธฐ๋ฐ˜' ์บ ํ•‘์žฅ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

์ฒ˜์Œ์—๋Š” '์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์บ ํ•‘์žฅ ๊ฒ€์ƒ‰' ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํžˆ ํ˜„์žฌ ์œ ์ €์˜ ์œ„์น˜์˜ ์ •ํ•ด์ง„ ๋ฐ˜๊ฒฝ, 5KM ๋‚ด ๊ฒ€์ƒ‰ ์šฉ๋„์˜€๋‹ค.

์บ ํ•‘์žฅ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ,
๊ธฐ์กด์˜ โ€œ๋ฐ˜๊ฒฝ 5KM ๋‚ด ์บ ํ•‘์žฅ ๊ฒ€์ƒ‰โ€ ๊ธฐ๋Šฅ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋ถˆํŽธํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ์ง‘ ์ฃผ๋ณ€์ด๋‚˜ ์ด๋™ํ•  ๋•Œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜๋Š”๋ฐ, ์บ ํ•‘์žฅ์ด ๋ณ„๋กœ ์—†๋Š” ์ง€์—ญ์—์„œ๋Š” ์ง€๋„๋งŒ ๋ณด์ด๊ณ  ์•„๋ฌด๋Ÿฐ ๊ฒฐ๊ณผ๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋‹ค.

โ€œ์ด ํŽ˜์ด์ง€๋Š” ๋„๋Œ€์ฒด ๋ญ˜ ํ•˜๋Š” ํŽ˜์ด์ง€์ง€?โ€ ๋ผ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.


โ“ ๊ธฐ์กด ๋ฌธ์ œ์ 

๋ณดํ†ต ์ง€๋„์—์„œ '๋‚ด ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์œ„์น˜์—์„œ ๊ฐ€๊นŒ์šด ๊ณณ' ์„ ๋ณด๊ธฐ ์œ„ํ•ด ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด์ง€, ์ •ํ™•ํžˆ ์–ด๋–ค ๋ฐ˜๊ฒฝ ๋‚ด์˜ ์ •๋ณด๋งŒ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฑด ์•„๋‹ ๊ฒƒ์ด๋‹ค ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.


โ—๏ธ ์ง€๋„ ์ด๋™ ๊ฐ์ง€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

๋จผ์ € ์›๋ž˜๋Š” ์ •ํ™•ํžˆ ๋‚ด ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋„๋ฅผ ์›€์ง์ผ ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•ด๋‘์—ˆ๋˜ ๋ถ€๋ถ„์„ ์ง€์›Œ์ฃผ์—ˆ๋‹ค.

	map.setDraggable(false); // ์นด์นด์˜ค ์ง€๋„์—์„œ ๋“œ๋ž˜๊ทธ๋กœ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ฝ”๋“œ

ํ„ฐ์น˜/๋งˆ์šฐ์Šค๋กœ ์ง€๋„ ์ด๋™์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด mouseup ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

  useEffect(() => {
    // ์นด์นด์˜ค ์ง€๋„ ๊ฐ์ฒด๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๋ฐฉ์ง€
    if (!kakaoMap) return;
    
    // ์ง€์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ ์ด๋™ ๊ฐ์ง€ ์‹คํ–‰
    if (!regionQuery) { 
      // mouseup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์‹คํ–‰ํ•  ํ•จ์ˆ˜
      const onMapCenterChanged = () => {
        // ์ง€๋„์˜ ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ ์–ป์–ด์˜ค๋Š” ๋ฉ”์„œ๋“œ
        const center = kakaoMap.getCenter();
        
        // ๋ฐฑ์—”๋“œ API ํ˜ธ์ถœ์„ ์œ„ํ•ด ์ค‘์‹ฌ ์ขŒํ‘œ์—์„œ ์œ„๋„/๊ฒฝ๋„ ์ถ”์ถœ
        const updatedLat = center.getLat();
        const updatedLon = center.getLng();

        // ์œ„๋„/๊ฒฝ๋„ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
        setLat(updatedLat);
        setLon(updatedLon);

        // ํ˜„์žฌ ์ง€๋„์˜ ์ค‘์‹ฌ ์œ„๋„/๊ฒฝ๋„ ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ฐ˜๊ฒฝ 5KM ๋‚ด ์บ ํ•‘์žฅ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” API ํ˜ธ์ถœ
        getNearByCampings(updatedLat, updatedLon);
      };

      // mouseup ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ํ•จ์ˆ˜ ํ˜ธ์ถœ
      kakaoMap.addListener('mouseup', onMapCenterChanged);

      // ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ
      return () => {
        kakaoMap.removeListener('mouseup', onMapCenterChanged);
      };
    }
  }, [kakaoMap]); // ์ง€๋„๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰

๐Ÿ“ƒ ์ฐธ๊ณ  ์นด์นด์˜ค๋ฌธ์„œ: ์ค‘์‹ฌ์ขŒํ‘œ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋“ฑ๋กํ•˜๊ธฐ

์ง€์—ญ ๊ฒ€์ƒ‰ ์‹œ์—๋Š” ์ง€๋„๋ฅผ ์ด๋™ํ•ด๋„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ง€๋„๊ฐ€ ์ด๋™๋  ๋•Œ๋งˆ๋‹ค, ์ฆ‰ mouseup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
mouseup ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋“œ๋ž˜๊ทธ ํ›„ ๋งˆ์šฐ์Šค๋ฅผ ๋—„ ๋•Œ ์‹คํ–‰ ๋œ๋‹ค.

  const getNearByCampings = async (updatedLat: number, updatedLon: number) => {
    try {
      const apiUrl = createApiUrl('/campings/map', [
        { name: 'lat', value: updatedLat },
        { name: 'lon', value: updatedLon },
      ]);

      const res = await api.get(apiUrl);

      setCampList(res.data.data);
    } catch (error) {
      console.error(error);
    }
  };

์ด๋™์ด ์™„๋ฃŒ๋˜๋ฉด ์ง€๋„ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์บ ํ•‘์žฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getNearByCampings๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๋ณ€๊ฒฝ๋œ ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ updatedLat, updatedLon์œผ๋กœ ๋ฐ›์•„์™€ createApiUrl์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ API URL์„ ์ƒ์„ฑํ•œ๋‹ค.
ํ•ด๋‹ค api์— GET์š”์ฒญ์„ ๋ณด๋‚ด ํ•ด๋‹น ์œ„์น˜์˜ ์บ ํ•‘์žฅ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋งˆ์ปค์™€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ ์šฉํ•œ๋‹ค.

๐Ÿ“ ๋งˆ์ปค์™€ ํด๋Ÿฌ์Šคํ„ฐ ์ ์šฉํ•˜๊ธฐ ํฌ์ŠคํŒ…

๊ทธ๋ฆฌ๊ณ  ์ง€๋„๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์˜ ์šฉ๋„๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

โœจ ๊ตฌํ˜„ ๊ฒฐ๊ณผ ๋ฐ ๊ฐœ์„ ๋œ ์  !

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์ด๋™ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์บ ํ•‘์žฅ์„ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ๊ฐœ์„ ๋˜์—ˆ๋‹ค.
  • ์ •ํ•ด์ง„ '5KM' ๋ฐ˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ '๊ทผ์ฒ˜ ํƒ์ƒ‰' ๊ฐœ๋…์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ• ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ UI๋ฅผ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง๊ด€์ ์œผ๋กœ ํŽ˜์ด์ง€์˜ ์‚ฌ์šฉ๋ฒ•/์‚ฌ์šฉ์ฒ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

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