[world-map-note] 프로젝트를 시작하면서

쏘소·2022년 9월 21일
0

기본개념

목록 보기
3/4

프로젝트 소개

World-map-note는 방문한 위치에 마커로 나만의 노트를 남기는 메모 지도 사이트 이다.
디자인은 네이버 지도 를 참고하였다.

고민한 점

map api 라이브러리 선정

지도를 띄워주기 위한 api 는 kakao map api 를 사용해주었다.
카카오 맵 sdk 를 설치하고 공식문서 에 나와있는 대로 map을 화면에 띄워주었다. 하지만 마커를 생성하는 과정에서와 마커를 눌렀을 때 나오는 커스텀 인포윈도우를 생성하고 띄워주기 위한 과정에서 react hook을 이용하여 state 등을 관리해주고 싶다는 생각을 하게 되었다.
커스텀 인포윈도우를 설정할 때도 다음과 같이 작성해주어야 했기 때문에,

이전 코드

const { kakao } = window

export default function kakaoMap(latitude: IKakaoMap['latitude'], longitude: IKakaoMap['longitude']) {
  const container = document.getElementById('kakaoMap')
  const options = {
    center: new kakao.maps.LatLng(latitude, longitude),
    level: 12,
  }

  const map = new kakao.maps.Map(container, options)

  return map
}

export function kakaoMapMark(map: any) {
  const marker = new kakao.maps.Marker({
    position: map.getCenter(),
  })
  marker.setMap(map)

  kakao.maps.event.addListener(map, 'click', (mouseEvent: any) => {
    const latlng = mouseEvent.latLng

    marker.setPosition(latlng)
  })
}

이 부분을 함수 컴포넌트로 대체해서 코드를 분리하고 재사용성을 높이며, 나중에 리팩토링이 쉽도록 하면 좋을 것 같았다.
이런 생각을 하던 중 react에 맞게 포팅한 라이브러리인 react-kakao-maps-sdk를 발견하게 되었다. 위에서 내가 추구하던 함수 컴포넌트로 이 카카오 맵 api 서비스를 사용할 수 있게 되어 이 라이브러리로 변경하게 되었다.

변경된 코드

const KakaoMap = () => {
  const [mapPosition, setMapPosition] = useRecoilState(mapPositionAtom)
  const [markPosition, setMarkPosition] = useRecoilState(markPositionAtom)
  
  return (
    <Map
      center={{
        lat: mapPosition.latitude,
        lng: mapPosition.longitude,
      }}
      style={{
        width: '100%',
        height: '100%',
      }}
      level={mapLevel}
      onClick={handleMapPositionClick}
      onCreate={() => setIsMapLoaded(true)}
    >
      {markPosition.memoPlacePosition.map((memoPosition: any, iMarker: number) => {
        const memoMarkerKey = `memoMarker-${iMarker}`
        return <Marker key={memoMarkerKey} markPosition={memoPosition} isMapLoaded={isMapLoaded} />
      })}
      <Marker markImg={geolocationMarkImg} markPosition={markPosition.geolocation} isMapLoaded={isMapLoaded} />
      {!isDeleteSearchMarker && (
        <Marker markImg={searchMarkImg} markPosition={markPosition.searchPosition} isMapLoaded={isMapLoaded} />
      )}
      )
}
      

모바일 화면의 메모 추가 폼 구현

마크를 클릭했을 때 나오는 인포윈도우에서 '메모 추가'를 클릭했을 시 나올 추가 폼을 어떤 방식으로 띄워줄지에 대한 고민이 있었다. 모바일 버전에서는 지도 위에 지도를 다 덮지는 않을 정도의 크기 폼 형태로 띄워주고자 하였고, 데스크탑 버전에서는 네이버 지도처럼 왼쪽에서 창이 나오도록 하고 싶었다.
모바일 버전에서 띄워주는 폼 형태를 모달로 띄워줘야할 지에 대한 고민이 있었다. 그런던 중 모달 개념 참고 블로그를 읽고,

모달은 모달(Modal)은 사용자의 이목을 끌기 위해 사용하는 화면전환 기법을 의미한다. 그래서 모달은 내비게이션 인터페이스와는 달리 정보의 흐름을 가지고 화면을 이동한다기 보다는 꼭 이목을 끌어야하는 화면에서 사용 한다.

라는 모달의 개념을 다시 짚을 수 있었다.

따라서 내가 띄워주고자 하는 '메모 추가' 폼은 이목을 끌어야하는 항목과는 거리가 멀어 모달로 띄워주기에는 부적절하다. 그래서 띄워주는 '메모 추가'는 컴포넌트로 생성하여 보여주기로 하였다.

profile
개발하면서 행복하기

0개의 댓글

관련 채용 정보