โจ ์์ฃผ๋ํ๊ต ๊ธฐ์์ฌ๋ฅผ ์ด์ฉํ๋ ํ์๋ค์ ์คํ 9์์ ๊ธฐ์์ฌ ๋งค์ ์ด ๋ฌธ์ ๋ซ๊ธฐ ๋๋ฌธ์, ํ์ํ ๊ฒ์ด ์์ผ๋ฉด ํ๊ต ๋ฐ์ ๋๊ฐ, ํธ์์ ์ผ๋ก ํฅํด์ผ ํ๋ค.
โจ ๋ฌผ๋ก , ๊ธฐํ ํ ๋ฐฐ๋ฌ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ง๋ง, ๋ฐฐ๋ฌ๋น๊ฐ ๋๋ฌด ๋น์ธ๊ณ , ์ฌ์ํ ์กํ์ ๊ฒฝ์ฐ์๋ ๋ฐฐ๋ฌ์ด ๋์ง ์๋๋ค.
โจ ์์ฒญ์๋ ์ต์์ฃผ๋ฌธ๊ธ์ก์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ฌ์ํ ์กํ๊น์ง ๋ฐฐ๋ฌ๋ฐ์ ์ ์๊ณ ,๋ฐฐ๋ฌ์๋ ํจ์จ์ ์ธ ์๊ฐํ์ฉ์ ํตํด ๋ถ์์ ์ธ ์์ต์ ์ป์ ์ ์๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ๋ค.
โจ Errander ์๋น์ค๋ฅผ ์ด์ฉํจ์ผ๋ก์จ ์์ฒญ์๋ ๋ค๋ฅธ ์๋น์ค๋ณด๋ค ์ ๋ ดํ ๋ฐฐ๋ฌ๋น๋ก, ๋ค์ํ ํ๋ชฉ์ ๋ํด ๋ฐฐ๋ฌ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๊ณ ,
โจ ๋ฐฐ๋ฌ์๋ ์์ ์ด ์ํ๋ ์๊ฐ์ ์ํ๋ ๋ฐฐ๋ฌ์ ๊ณจ๋ผ ์ํํ๊ณ ๊ทธ์๋ฐ๋ฅธ ๋ณด์์ผ๋ก ๋ถ์์ ์ธ ์์ต์ ์ป์ ์ ์๋ค.
โจ ์๋น์ค ์ด์ฉ์๋ ์ญํ ์ ๊ตฌ๋ถํ์ง ์๊ณ ๋๊ตฌ๋ ์์ฒญ์๊ฐ ๋ ์๋, ๋ฐฐ๋ฌ์๊ฐ ๋ ์๋ ์๋๋ก ํจ์ผ๋ก์จ ๋ง์ ์ฌ๋์ด ์ ์ฝ์์ด ์ด์ฉํ ์ ์๋ค.
๐ Tech ๐
Errander์ ๋ชจ๋ ํ์ด์ง๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ฐ์ํ์ผ๋ก ์ ์๋์ด ์์ต๋๋ค.
- ๋ฉ์ธํ๋ฉด์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ์ ๋์, ๋ก๊ทธ์ธ ํ์ง ์์์ ๋๋ฅผ ๋๋์ด ๋ํ๋ ๋๋ค
- ๋ก๊ทธ์ธ ์ํ ์ฌ๋ถ๋ Recoil์ atom Component์ ์ ์ ์ ์ ๋ณด๊ฐ ์๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํ๊ฒ ๋ฉ๋๋ค.
- ํ์ฌ๋ ๋ฐฑ์๋ ์๋ฒ๊ฐ ๊ตฌ์ฑ๋์ด ์์ง ์์, atom Component๋ฅผ ์ด์ฉํด dummy data๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด์ง๋ง, Backend์๋ฒ๊ฐ ์กด์ฌํ๋ค๋ฉด, Recoil์ Selector๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์ฟผ๋ฆฌ๋ก, ์๋ฒ๋ก ๋ถํฐ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐ์์ ๋ฐํํด์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ ์์ ์ ๋๋ค.
//login
const setUserNickname = useSetRecoilState(userNickNameInfo);
const onSubmit = useCallback((e)=>{
//๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ํฌํจํ ๋น๋๊ธฐ ์์ฒญ
e.preventDefault();
console.log(id);
console.log(pwd);
setUserNickname("๋ณ์ค");
},[id,pwd,setUserNickname]);
//main page
const userNickName = useRecoilValue(userNickNameInfo);
//Recoil
export const userNickNameInfo = atom<string>({
key : 'userNickNameInfo',
default : '',
})
- ์ฌ์ฉ์๋ ์ด 2๋จ๊ณ๋ฅผ ํตํด, ๋ฐฐ๋ฌ์ ์ ์ฒญํ ์ ์์ต๋๋ค.
- ์ฒซ๋ฒ์งธ ๋จ๊ณ์์ ์ฌ์ฉ์๋ ์ฃผ๋ฌธ์์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.(๋ถ๋ฅ, ์์ธํ๋ชฉ, ๋ฐฐ๋ฌ๋น, ๊ธฐํ ์์ฒญ์ฌํญ)
- ๋๋ฒ์งธ ๋จ๊ณ์์ ์ฌ์ฉ์๋ ์ง๋์ ์ง๋์์ ์กด์ฌํ๋ marker๋ฅผ ํตํด ํฝ์ ๋ฐ์ ์ฅ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
- ์ด๋, ๋ง์ปค์ ๊ธฐ๋ณธ์์น๋ ์ฌ์ฉ์์ ํ์ฌ ์์น๊ฐ ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด, geolocation api๋ฅผ ์ด์ฉํ custom Hook์ ๋ง๋ค์ด ์ฌ์ฉํ์ต๋๋ค.
type Location = {latitude : string; longitude : string};
const useCurrentLocation = (options = {}) => {
const [location, setLocation] = useState<Location | null>(null);
const [error, setError] = useState('');
const handleSuccess = (pos : any) => {
const { latitude , longitude } : {latitude : string, longitude : string} = pos.coords;
setLocation({
latitude,
longitude,
});
};
const handleError = (error : any) => {
setError(error.message);
};
useEffect(() => {
const { geolocation } = navigator;
if (!geolocation) {
setError("Geolocation is not supported.");
return;
}
geolocation.getCurrentPosition(handleSuccess, handleError, options);
}, [options]);
return { location, error };
};
export default useCurrentLocation;
- ์ง๋์ ๊ฒฝ์ฐ์๋, ์นด์นด์ค ๋งต api๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ํ๋ฉด์ด ๋๋๋ค๋ฉด, useEffect hook์ ์ด์ฉํด, useCurrentLocation hook์ ํตํด ๊ฐ์ ธ์จ ์ฌ์ฉ์์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง๋๋ฅผ ๊ทธ๋ ค์ฃผ๊ฒ ๋ฉ๋๋ค.
const {location : currentLocation, error : currentError} = useCurrentLocation(geolocationOptions);
useEffect(()=>{
if(currentLocation){
var container = document.getElementById('map');
var options = {
center: new kakao.maps.LatLng(currentLocation.latitude, currentLocation.longitude),
level: 3
};
var map = new kakao.maps.Map(container, options);
var markerPosition = new kakao.maps.LatLng(currentLocation.latitude, currentLocation.longitude);
var marker = new kakao.maps.Marker({
position: markerPosition
});
marker.setMap(map);
marker.setDraggable(true);
kakao.maps.event.addListener(marker, 'dragend', function(){
const {La ,Ma } = marker.getPosition()
setPickUpPos({
La : La,
Ma : Ma,
});
})
}
},[setPickUpPos,currentLocation]);
- marker์๋ dragend์ ๋ํ eventListner๋ฅผ ์ถ๊ฐํด, ์ฌ์ฉ์๊ฐ marker๋ฅผ ์ด์ฉํด ํฝ์ ์ฅ์์ ์์น๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ง๋ค, ํด๋น ์์น์ ์๋, ๊ฒฝ๋ ๊ฐ์ state์ ์ ์ฅํ ์ ์๋๋ก ํ์ต๋๋ค.
- ๋ฉ์ธ ํ์ด์ง์์ ๋ฐฐ๋ฌ ๋ชฉ๋ก ํ์ธํ๊ธฐ๋ฅผ ํตํด, ๋ฐฐ๋ฌ ๋ชฉ๋ก ํ์ธํ์ด์ง๋ก ์ด๋ํ๋ฉด, ์ฌ์ฉ์๋ ํ์ฌ Errander์ ์ฌ๋ผ์จ ๋ฐฐ๋ฌ ๋ชฉ๋ก์ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฐ์ ๋ฐฐ๋ฌ ๋ชฉ๋ก๋ค์ ๋ฆฌ์คํธ์ ํํ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๊ฒ ๋๋ฉฐ, ์ฌ์ฉ์๋ ํด๋น ๋ด์ฉ์ ๋ณด๊ณ ๋ง์์ ๋ค๊ฑฐ๋ ์์ ์ด ์ํํ ์ ์๋ ๋ฐฐ๋ฌ์ ์๋ฝํด ๋ฐฐ๋ฌ์ ์งํํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฐ์ ๋ฐฐ๋ฌ์ ๋ํ PickUp ์์น ์ญ์ ์นด์นด์ค๋งต api๋ฅผ ์ด์ฉํด ํ๋ฉด์ ๋๋๋๊ฒ ๋๋๋ฐ, ์ด๋๋ marker์ ์์น๋ ํด๋น ๋ฐฐ๋ฌ์ ๋ฑ๋กํ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์์น๊ฐ ๋ฉ๋๋ค.