/Errander

๐Ÿ›ต Ajou University Delivery Service

Primary LanguageTypeScript

Errander

๐ŸŒŸ์„œ๋น„์Šค์†Œ๊ฐœ

๐Ÿ›ต ์•„์ฃผ๋Œ€ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ ์‚ฌ์ƒ๋“ค์„ ์œ„ํ•œ ๋ฐฐ๋‹ฌ ๋Œ€ํ–‰ ์„œ๋น„์Šค.


โœจ ์•„์ฃผ๋Œ€ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ๋ฅผ ์ด์šฉํ•˜๋Š” ํ•™์ƒ๋“ค์€ ์˜คํ›„ 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์˜ ์œ„์น˜๋Š” ํ•ด๋‹น ๋ฐฐ๋‹ฌ์„ ๋“ฑ๋กํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ์œ„์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ถ”ํ›„ README ์ถ”๊ฐ€ ์˜ˆ์ •