์ด ํฌ์คํธ์์๋ geolocation API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ๊ตฌํ ํด ๋ณผ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ ํ์ด ์นด์ฐ์น์ฝ๋ฉ์์ ๊ฐ๋ฐํ๊ณ ์๋ CampUs ์๋น์ค๋ ๋ฉ์ธํ์ด์ง์์ ์ฌ์ฉ์์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
์ฌ์ฉ์ ์ฃผ๋ณ ์บ ํ์ฅ์ ์ถ์ฒํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค.
์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ ๋ฉ์ธํ์ด์ง์ ๋ค์ด๊ฐ์๋ง์ ์ฌ์ฉ์์ ํ์ฌ์์น๋ฅผ ์์๋ด๋ ๊ฒ์ด ์ค์ํ๋ค !
ํ์ฌ์์น๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ navigator ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
navigator.geolocation.getCurrentPosition(์์น๋ฅผ ๋ฐ์ ๋ค์ ์คํํ ํจ์, ์๋ฌ๊ฐ ๋ฐ์ ํ์ ๋ ์คํํ ํจ์);
navigator ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ๋ฐ ๋ฒ์ ์ ๋ณด ๋ฑ์ ํฌํจํ ๋ธ๋ผ์ฐ์ ์ ๋ํ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด์ด๋ค .
getCurrentPosition() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ์์น๋ฅผ ์ ์ ์๋ค.
์ฒซ๋ฒ์งธ ์ธ์์๋ ์์น๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ ๋ค์ ์คํ ํ ํจ์, ๋๋ฒ์งธ ์ธ์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ์ ์คํํ ํจ์๋ฅผ ๋ฃ์ด์ค๋ค .
์ธ๋ฒ์งธ ํจ์๋ ์ ํ์ฌํญ์ผ๋ก 3๊ฐ์ง์ ์ต์ ์ ์ถ๊ฐํ ์ ์๋ค.
1. maximumAge - ์บ์์ ์ ์ฅํ ์์น์ ๋ณด๋ฅผ ๋์ ๋ฐํํ ์ ์๋ ์ต๋ ์๊ฐ์ ๋ํ๋ด๋ ์์ long ๊ฐ์ ๋๋ค. 0์ ์ง์ ํ ๊ฒฝ์ฐ ์ฅ์น๊ฐ ์์น์ ๋ณด ์บ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐ๋์ ์ค์๊ฐ์ผ๋ก ์์น๋ฅผ ์์๋ด๋ ค ์๋ํด์ผ ํ๋ค๋ ๋ป์ ๋๋ค. infinity๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ ์ง๋ ์๊ฐ์ ์๊ด์์ด ํญ์ ์บ์์ ์ ์ฅ๋ ์์น์ ๋ณด๋ฅผ ๋ฐํํด์ผ ํจ์ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ 0์ ๋๋ค.
2. timeout - ๊ธฐ๊ธฐ๊ฐ ์์น๋ฅผ ๋ฐํํ ๋ ์๋ชจํ ์ ์๋ ์ต๋ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋ํ๋ด๋ ์์ long ๊ฐ์ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ infinity๋ก, ์์น๋ฅผ ์์๋ด๊ธฐ ์ ์๋ getCurrentPosition()์ด ๋ฐํํ์ง ์์ ๊ฒ์์ ๋ํ๋ ๋๋ค.
3. enableHighAccuracy - ์์น์ ๋ณด๋ฅผ ๊ฐ์ฅ ๋์ ์ ํ๋๋ก ์์ ํ๊ณ ์ถ์์ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค. true๋ฅผ ์ง์ ํ์ผ๋ฉด, ์ง์ํ๋ ๊ฒฝ์ฐ ์ฅ์น๊ฐ ๋ ์ ํํ ์์น๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ต ์๋๊ฐ ๋๋ ค์ง๋ฉฐ ์ ๋ ฅ ์๋ชจ๋์ด ์ฆ๊ฐํ๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด false๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ ๊ธฐ๊ธฐ๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๊ณ ์ ๋ ฅ ์๋ชจ๋ ์ค์ผ ์ ์๋ ๋์ ์ ํ๋๊ฐ ๋จ์ด์ง๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ false์ ๋๋ค.
- MDN
์ด์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ฒ์ฒํ ์ดํดํด๋ณด์
const [geolocation, setGeolocation] = useState({
lat: null,
long: null,
});
function getLocation() {
let lat, long;
if (navigator.geolocation) {
// ์์น ๊ถํ์ ํ์ฉํ๋ฉด
navigator.geolocation.getCurrentPosition(
function (position) {
lat = position.coords.latitude;
long = position.coords.longitude;
setGeolocation((geolocation) => {
return {
...geolocation,
lat,
long,
};
});
},
function (error) {
console.error(error);
},
{
enableHighAccuracy: false,
maximumAge: 0,
timeout: Infinity,
},
);
} else {
alert('์์น ์ค์ ์ ํ์ฉํด์ฃผ์ธ์!');
return;
}
}
useEffect(() => {
getLocation();
}, []);
};
์๋ geolocation ์ผ๋ก ํ์ฌ ์ฌ์ฉ์์ ์์น๋ฅผ ๋ฐ์์ค๋ ์ฝ๋์ด๋ค.
์ฒ์ useEffect์์ getLocation() ํจ์๋ฅผ ์คํํ๋ฉด lat๊ณผ long์ด๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๋๋ฐ ๊ฐ ์๋์ ๊ฒฝ๋๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์์น ๊ถํ์ด ํ์ฉ๋์ด ์์น๋ฅผ ์ ์์ ์ผ๋ก ๋ฐ์์จ๋ค๋ฉด lat๊ณผ long ๋ณ์์ ์๋์ ๊ฒฝ๋์ ์ขํ๋ฅผ ๋ฃ์ด์ฃผ๊ณ
geolocation ์ด๋ผ๋ state์ ๋ด์์ค๋ค !
๋๋ฒ์งธ ์ธ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ์ ์คํ๋๋ ํจ์์ธ๋ฐ ์์น ๊ถํ์ด ํ์ฉ๋์ด ์์ง ์๋ค๋ฉด ์์น ์ค์ ์ ํ์ฉํด ๋ฌ๋ผ๋ alert ๋ฅผ ๋ณด์ฌ์ค๋ค
์ธ๋ฒ์งธ ์ธ์๋ ์ ํ์ฌํญ ์ด๋ฏ๋ก ์ ๋ณด๊ณ ์ต์ ์ ์ค์ ํด์ฃผ๋๋ก ํ์ !

์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์์ก๋ค๋ฉด ์ ์ฌ์ง์ฒ๋ผ ์๋์ ๊ฒฝ๋๊ฐ ์ ๋์ค๊ฒ ๋๋ค ! ๐