산 이름·지역·거리로 GPX 트래킹 코스를 찾는 등산 커뮤니티 서비스 — React + Vite 프론트엔드 프로젝트.
- 프로젝트 초기 세팅 (React + Vite, 디자인 시스템 구축)
- 리소그래프 스타일 디자인 시스템 설계 (색상 토큰, 폰트, 컴포넌트)
- 전체 페이지 레이아웃 및 반응형 처리
- 메인 페이지, 산 목록/상세 페이지
- 자유게시판·건의게시판 (목록/상세/작성/수정)
- 마이페이지, 관리자 페이지 (유저/산/경로 관리, 페이지네이션)
- 로그인·회원가입 UI
- Leaflet 지도 + GPX 트랙 시각화
- 기상청 날씨 연동 (일자별 탭, 시간대별 슬롯)
- 코스 즐겨찾기·추천 UI
- 코스별 후기(댓글) CRUD UI
- 플로팅 AI 어시스턴트 패널 (RAG 챗봇 연동)
- 추천 칩, 대화 스크롤, 로딩 상태 처리
apiFetch래퍼 함수 (자동 토큰 재발급, 401 처리)AuthContext전역 인증 상태 관리- Vercel 배포 설정 (vite.config, rewrite 규칙)
- 날씨 API 호출을
mtnName→ DB의lat/lng기반으로 변경 - 날씨 카드 너비 확대 (380px → 460px), 일자 탭 크기 균일화
- 산 상세 페이지 전체 너비 확대 (1700px → 1860px)
- 비로그인 상태에서 글쓰기 버튼 클릭 시 로그인 페이지로 이동 (자유게시판·건의게시판)
- 관리자에게 게시글 수정 버튼 표시
- 게시글 상세 이미지가 박스 너비에 맞게 꽉 차도록 CSS 수정 (
width: 100%,object-fit: contain) - 게시글 수정 시 기존 첨부 이미지를 썸네일로 미리보기, X 버튼으로 개별 삭제 가능
- 삭제된 기존 이미지는 저장 시
deletedImages로 BE에 전달
- 작성일 칸 200px → 180px, 댓글 칸
max-content→ 60px 고정으로 비율 개선
- 하드코딩된
MOUNTAINS좌표 배열 제거, DB의mtn.lat/mtn.lng직접 사용 - 관리자 코스 댓글 삭제 권한 추가
- 게시글·코스 후기 사진 첨부 최대 3장으로 제한
apiFetch에서 401 응답 시 자동으로/api/auth/reissue호출 후 재시도- 재발급 실패 시에만 로그아웃 처리
- POST 요청 시
addedImages→images로 필드명 수정 (BE와 일치) - 수정(PUT)은 기존대로
addedImages유지
- 산 상세 페이지에 플로팅 AI 어시스턴트 패널 추가
- POST
/api/chat연동 (산 ID 컨텍스트 포함) - 추천 칩, 대화 자동 스크롤, 로딩 상태 처리
- Leaflet 지도 + GPX 트랙 시각화
- 코스 즐겨찾기·추천 토글 UI
- 코스별 후기(댓글) CRUD UI (이미지 첨부 포함)
- 기상청 날씨 연동 (일자별 탭, 시간대별 슬롯, 자세히 보기)
- 일출/일몰 정보 연동
- 관리자 페이지 페이지네이션 추가
- Vercel 배포를 위한 vite.config, rewrite 규칙 설정
- CORS 관련 프록시 설정
- 산 상세 페이지, 검색바, 회원가입 UI, 즐겨찾기 관련 버그 수정
- 코스 일괄 업로드 기능 수정
- 산 목록 카드 사이즈 조정
- 산 상세 페이지 레이아웃 수정
- merge 충돌 해결
- 전체 페이지 UI 1차 수정 및 다듬기
- React + Vite 프로젝트 초기화
- 리소그래프 스타일 디자인 시스템 구축
- 전체 페이지 라우팅 및 레이아웃 구현
- 더미 데이터 기반 UI 완성 (메인, 산 목록/상세, 게시판, 마이페이지, 관리자)
- API 엔드포인트 연결 시작
Node.js(18+)가 필요합니다. (nodejs.org에서 설치)
npm install # 의존성 설치 (최초 1회)
npm run dev # 개발 서버 → http://localhost:5173
npm run build # 프로덕션 빌드 (dist/)| 라우트 | 페이지 | 파일 |
|---|---|---|
/ |
메인 | src/pages/MainPage.jsx |
/mountains |
산 목록 (필터·정렬·페이지네이션) | src/pages/MountainListPage.jsx |
/mountains/:id |
산 상세 (지도·고도·후기) | src/pages/MountainDetailPage.jsx |
/board |
자유게시판 | src/pages/FreeBoardPage.jsx |
/suggestions |
건의게시판 | src/pages/SuggestionBoardPage.jsx |
/mypage |
마이페이지 | src/pages/MyPage.jsx |
/admin/:tab |
어드민 (유저/산/경로 관리) | src/pages/AdminPage.jsx |
:tab = users · mountains · routes
src/
├─ main.jsx # 진입점 (라우터 + CSS import)
├─ App.jsx # 라우트 정의 (어드민은 자체 레이아웃)
├─ components/
│ ├─ Header.jsx # 공통 상단 네비
│ ├─ Footer.jsx # 공통 푸터
│ ├─ MountainCard.jsx # 산 카드
│ ├─ MountainScene.jsx # 리소그래프 산 풍경 SVG 생성기
│ └─ TrailMap.jsx # 등고선 지도 + 고도 프로필 생성기
├─ pages/ # 7개 페이지
├─ data/ # 더미 데이터 (mountains / posts / admin)
└─ styles/
├─ base.css # 디자인 시스템 토큰 + 공통 컴포넌트
└─ pages.css # 페이지별 스타일
"B급인 척하는 S급" — 리소그래프(실크스크린) 질감 + 빡빡한 그리드.
- 색: 따뜻한 종이
#efe9db/ 잉크#18211c/ 트레일 오렌지#ef6a39/ 포레스트#1f7a5a/ 골드#e9b949 - 폰트: Black Han Sans(제목) · Pretendard(본문) · Space Mono(라벨)
- 특징: 두꺼운 테두리(2.5px) + 하드 오프셋 그림자(
Npx Npx 0 ink) - 색·폰트 토큰은
src/styles/base.css상단:root에서 한 번에 수정 가능합니다.
- 검색/필터/정렬: 각 페이지의
useState값을 실제 데이터 쿼리에 연결 - 라우팅 데이터:
src/data/*더미를 API 응답으로 교체 - 로그인/회원가입:
Header의 버튼 → 인증 페이지/모달 추가 - 좋아요·저장:
MountainCard의fav상태를 서버와 동기화 - 어드민 CRUD: 테이블 행의 ✎ / 🗑 버튼에 핸들러 연결