"오늘 공부하기 딱 좋은 카페, 어디일까?" SCM은 조용한 작업 공간이 필요한 카공족과 프리랜서들을 위해 주변 카페의 위치와 상세 정보를 제공하는 지도 기반 웹 서비스입니다.
- Live Demo: 데모링크
- Environment: Next.js, Supabase, Kakao Maps API
- Framework:
Next.js (App Router) - Language:
TypeScript - Database/Auth:
Supabase - Styling:
Tailwind CSS - Map API:
Kakao Maps API - Deployment:
Vercel
- 카카오 맵 API를 커스텀하여 주변 카페 위치를 마커로 시각화했습니다.
- 사용자의 현재 위치를 기반으로 지도를 초기화하고 이동시키는 기능을 구현했습니다.
- 마커 클릭 시 해당 카페의 상세 정보(이름, 주소, 이미지, 카공 편의성 등)를 사이드바를 통해 즉각적으로 노출합니다.
SelectedCafe상태 관리를 통해 지도와 사이드바 간의 끊김 없는 데이터 동기화를 달성했습니다.
- Supabase를 백엔드로 활용하여 카페 리스트, 사용자 리뷰 데이터를 실시간으로 페칭하고 렌더링합니다.
- 비동기 데이터 로딩 시 사용자 경험을 위해 스켈레톤 UI 및 로딩 상태 처리를 적용했습니다.
- 문제: 페이지 로드 시 카카오 맵 객체를 참조하지 못해
kakao is not defined에러 빈번히 발생. - 해결:
next/script의strategy="afterInteractive"와onLoad핸들러를 사용하여 스크립트 로드 완료 후에만 지도 초기화 함수가 실행되도록 보장했습니다.
- 문제: 데이터 업데이트 시 기존 마커가 삭제되지 않고 겹쳐 찍히는 현상으로 인해 브라우저 성능 저하.
- 해결:
useRef로 마커 객체 배열을 관리하고, 새로운 데이터를 그리기 전 반드시 기존 마커의setMap(null)을 호출하는 클린업 로직을 구현했습니다.
- 문제: 지도의 마커 클릭 이벤트와 리액트의 상태 관리가 분리되어 UI 반영이 늦어짐.
- 해결: 마커 이벤트 리스너 내부에서 리액트 상태 업데이트 함수를 직접 호출하도록 연결하고, 클릭된 좌표로 지도를 부드럽게 이동시키는
panTo기능을 추가하여 UX를 개선했습니다.
src/
├── app/
│ ├── api/ # 데이터 요청을 위한 API Route
│ ├── layout.tsx # 전역 레이아웃 및 폰트 설정
│ └── page.tsx # 메인 지도 페이지
├── components/
│ ├── Map.tsx # 카카오 맵 핵심 로직 및 마커 제어
│ ├── Sidebar.tsx # 카페 상세 정보 노출 UI
│ └── Header.tsx # 네비게이션 및 로고
└── lib/
└── supabase.ts # Supabase 클라이언트 설정