์ฒ์์๋ '์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์บ ํ์ฅ ๊ฒ์' ๊ธฐ๋ฅ์ ๋จ์ํ ํ์ฌ ์ ์ ์ ์์น์ ์ ํด์ง ๋ฐ๊ฒฝ, 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๋ฅผ ์ถ๊ฐํด ์ฌ์ฉ์์๊ฒ ์ง๊ด์ ์ผ๋ก ํ์ด์ง์ ์ฌ์ฉ๋ฒ/์ฌ์ฉ์ฒ๋ฅผ ์ ๋ฌํ๋ค.