Skip to content

yeji424/road-pick-fe

Repository files navigation

image

RoadPick


1. Project Overview (프로젝트 개요)

본 프로젝트는 URECA의 미니 프로젝트로, 여행 일정을 효율적으로 관리할 수 있는 웹 플랫폼 **‘로드픽(RoadPick)’**을 개발하는 것을 목표로 합니다.
사용자가 쉽고 체계적으로 여행 계획을 세울 수 있도록 돕는 기능을 중심으로, 팀원 간의 협업을 통해 기획부터 디자인, 프론트엔드 구현까지 전 과정을 경험합니다.

  • 🔹 프로젝트명: RoadPick
  • 🔹 프로젝트 기간: 2025.05.07 ~ 2025.05.20 (2주)
  • 🔹 개발 인원: 김준서, 김민석, 김예지, 홍석준
  • 🔹 주요 목표: 사용자 맞춤형 여행 일정 관리 기능 구현

2. Service Introduction (서비스 소개)

[URECA] Mini Project 김준서, 김민석, 김예지, 홍석준

로드픽은 여행을 계획하는 모든 사용자를 대상으로 하지만 특히 바쁜 일상 속에서도 여행을 즐기고자 하는 20대 사용자를 주요 페르소나로 설정하였습니다.
보다 효율적이고 체계적인 여행 일정을 설계할 수 있도록 돕는 여행 일정 관리 중심 플랫폼으로,
다양한 여행지 정보와 관련 축제·행사 추천 등 풍부한 콘텐츠를 기반으로
사용자가 자신만의 맞춤 여행 일정을 쉽게 구성하고, 즐거운 여행 경험을 누릴 수 있도록 지원합니다.


3.RoadPick에 대해 더 알아보고 싶다면?

약식 기획서 : 약식기획서 보러가기

4. 기술 스택

FrontEnd

개발환경 :

프레임워크 :

스타일링 :

라이브러리 :

배포 :

BackEnd

서버 환경 :

DataBase :

Cooperation

5. ✨Key Features(주요 기능)✨

선택 여행지별 축제 및 행사 정보 추천

선택한 지역 주변에서 진행되는 축제 및 행사 정보를 추천합니다. 지도 위에서 주변 이벤트를 마커로 시각화해 보여줍니다.

여행 일정 관리 기능

여행지를 찜 목록에 저장하고 이를 기반으로 나만의 여행 일정을 만들 수 있습니다. 캘린더를 통해 일정을 시각화하며 날짜를 클릭하면 해당 날짜의 상세 일정으로 이동합니다.

여행 일정 관리에는 다음 기능이 포함됩니다

  • 방문 날짜 설정
  • 일정 간 이동 동선 정리
  • 시작일 ~ 종료일까지의 일정 커스터마이징

지도(Map) 기반 관광지 탐색 기능

선택한 지역 내의 관광지 및 축제를 지도에 마커로 표시합니다. 마커 클릭 시 모달이 나타나며, 디테일 페이지로 이동할 수 있습니다. 사용자가 선택한 지역을 벗어나 지도를 클릭하면 "이 지역 재검색" 버튼이 나타나고, 해당 지역의 관광지를 다시 검색할 수 있습니다.

찜 기능 및 마이페이지

원하는 관광지를 찜할 수 있으며, 마이페이지에서 사용자별 찜 목록을 확인할 수 있습니다.

마이페이지에서는 다음 기능을 지원합니다

  • 프로필 이미지 및 이름 변경
  • 찜한 여행지 목록 확인
  • 저장한 여행 일정 관리

기술 및 UX 요소

  • KakaoMap API를 활용한 지도 및 위치 기반 기능
  • React Spring을 이용한 바텀시트 애니메이션 구현
  • 모바일 퍼스트 기반 반응형 웹사이트 제작
  • 직관적인 UI/UX 흐름과 사용자 중심의 기능 구성
  • 공통 컴포넌트 개발 => 재사용성과 유지보수 유용

6.Team Members (팀원 소개)


김준서(팀장)


홍석준


김민석


김예지

7.주요 화면

📱 주요 화면 미리보기


📍 여행지 찜하기 및 찜 취소 기능

🎉 여행지 검색 및 상세 정보 확인

🔐react-spring 활용한 바텀 시트

🗺️ 지도에서 관광지 & 축제 정보 확인 및 마커 표시 변경

📆 여행 계획 생성 및 내 여행 목록 확인

👤여행 세부 일정 추가 및 이동 경로 시각화

8. 🛠 트러블슈팅 & 개선 사례

🔧 1. 공통 컴포넌트 설계로 재사용성 향상


📌 문제 여러 컴포넌트를 화면마다 반복 작성 변경 시 일일이 수정해야 해서 유지보수 비효율 발생

✅ 해결 props와 name을 이용해 공통 컴포넌트 설계 유연하게 커스터마이징 가능한 구조로 개발

🎯 효과 코드 재사용성 증가 컴포넌트 일관성 확보 협업 및 유지보수 효율화

🚨 2. API 호출 오류 대응 + 캐싱 처리


📌 문제 외부 API 호출 중 간헐적 실패 발생 빈 화면 또는 데이터 미노출 이슈 발생 (429에러) 많은 호출

✅ 해결 sessionStorage에 정상 데이터 캐싱 오류 발생 시 캐시 데이터로 대체 렌더링 TanStack Query(React Query)로 데이터 상태 관리 및 에러 핸들링

🎯 효과 사용자 경험 개선 (에러 시에도 데이터 제공) 상태 관리 체계 강화 → 안정적 앱 구성

🌐 3. 공공 API 파라미터 변경 대응


📌 문제 한국관광공사 API 응답 실패 원인은 API 파라미터 변경 (문서 업데이트 미반영)

✅ 해결 공식 문서 확인 후 변경된 파라미터 반영 테스트를 통해 호출 정상화 확인

🎯 효과 빠르게 문제 진단 및 대응 외부 API 사용 시 문서 체크 및 예외 대응 역량 강화

🌐 4. 페이지 로딩 지연 대응

📌 문제 페이지 처음 접근 시 로딩이 길어지는 현상.

✅ 해결 lazy를 사용해 import가 된후 생성되게끔, img에는 loding="lazy"추가 => 이때 화면에 주가 되는 부분은 하면 안됨 처음 화면에 보이지 않는 요소중 🎯 효과 빠른 로딩시간, 사용자 경험(UX)증가

9.폴더 구조

FrontEnd
📦src
 ┣ 📂apis
 ┃ ┣ 📜authApi.js
 ┃ ┣ 📜favoriteApi.js
 ┃ ┣ 📜getKeywordTourList.js
 ┃ ┣ 📜getLocationTourList.js
 ┃ ┣ 📜getTourDetailCommon.js
 ┃ ┣ 📜getTourDetailIntro.js
 ┃ ┣ 📜getTourList.js
 ┃ ┣ 📜index.js
 ┃ ┣ 📜scheduleApi.js
 ┃ ┣ 📜schedulsDetailApi.js
 ┃ ┗ 📜userApi.js
 ┣ 📂assets
 ┃ ┣ 📂icons
 ┃ ┃ ┣ 📜addIcon.svg
 ┃ ┃ ┣ 📜AppIcon.svg
 ┃ ┃ ┣ 📜archiveAddIcon.svg
 ┃ ┃ ┣ 📜arrowLeftIcon.svg
 ┃ ┃ ┣ 📜arrowUpIcon.svg
 ┃ ┃ ┣ 📜calendarIcon.svg
 ┃ ┃ ┣ 📜checkBoxIcon.svg
 ┃ ┃ ┣ 📜checkIcon.svg
 ┃ ┃ ┣ 📜eye-close.svg
 ┃ ┃ ┣ 📜eye-open.svg
 ┃ ┃ ┣ 📜googleIcon.svg
 ┃ ┃ ┣ 📜homeIcon.svg
 ┃ ┃ ┣ 📜kakaoIcon.svg
 ┃ ┃ ┣ 📜loginIcon.svg
 ┃ ┃ ┣ 📜logoutIcon.svg
 ┃ ┃ ┣ 📜markerDefault.svg
 ┃ ┃ ┣ 📜markerSelected.svg
 ┃ ┃ ┣ 📜moreIcon.svg
 ┃ ┃ ┣ 📜PlusBtnIcon.svg
 ┃ ┃ ┣ 📜refresh.svg
 ┃ ┃ ┣ 📜saveIcon.svg
 ┃ ┃ ┣ 📜searchIcon.svg
 ┃ ┃ ┣ 📜starIcon.svg
 ┃ ┃ ┗ 📜userIcon.svg
 ┃ ┗ 📂imgs
 ┃ ┃ ┣ 📜BannerImg1.png
 ┃ ┃ ┣ 📜BannerImg2.png
 ┃ ┃ ┣ 📜noImageImg.png
 ┃ ┃ ┣ 📜ProfileBasicImg.png
 ┃ ┃ ┣ 📜registerImg.png
 ┃ ┃ ┗ 📜TripListImg.png
 ┣ 📂components
 ┃ ┣ 📂common
 ┃ ┃ ┣ 📂BottomSheet
 ┃ ┃ ┃ ┣ 📜BottomSheet.jsx
 ┃ ┃ ┃ ┣ 📜BottomSheet.module.css
 ┃ ┃ ┃ ┣ 📜BottomSheetContent.jsx
 ┃ ┃ ┃ ┣ 📜BottomSheetPlan.jsx
 ┃ ┃ ┃ ┗ 📜generateDateRange.js
 ┃ ┃ ┣ 📂Calendar
 ┃ ┃ ┃ ┣ 📜Calendar.jsx
 ┃ ┃ ┃ ┣ 📜Calendar.module.css
 ┃ ┃ ┃ ┗ 📜CalendarLogic.js
 ┃ ┃ ┣ 📂Footer
 ┃ ┃ ┃ ┗ 📜Footer.jsx
 ┃ ┃ ┣ 📂Header
 ┃ ┃ ┃ ┣ 📜Header.jsx
 ┃ ┃ ┃ ┗ 📜Header.module.css
 ┃ ┃ ┣ 📂ListCard
 ┃ ┃ ┃ ┣ 📜HeartToggle.jsx
 ┃ ┃ ┃ ┣ 📜ListCard.jsx
 ┃ ┃ ┃ ┗ 📜ListCard.module.css
 ┃ ┃ ┣ 📂Map
 ┃ ┃ ┃ ┣ 📜DetailMap.jsx
 ┃ ┃ ┃ ┣ 📜DetailMap.module.css
 ┃ ┃ ┃ ┣ 📜Map.jsx
 ┃ ┃ ┃ ┣ 📜Map.module.css
 ┃ ┃ ┃ ┣ 📜MapModal.jsx
 ┃ ┃ ┃ ┣ 📜MapModal.module.css
 ┃ ┃ ┃ ┣ 📜PlanMap.jsx
 ┃ ┃ ┃ ┗ 📜TourApi.js
 ┃ ┃ ┣ 📂Modal
 ┃ ┃ ┃ ┣ 📜AlertModal.jsx
 ┃ ┃ ┃ ┣ 📜AlertModal.module.css
 ┃ ┃ ┃ ┣ 📜DeleteModal.jsx
 ┃ ┃ ┃ ┣ 📜LogoutModal.jsx
 ┃ ┃ ┃ ┣ 📜Modal.module.css
 ┃ ┃ ┃ ┣ 📜ModalRoot.jsx
 ┃ ┃ ┃ ┣ 📜PlanModal.jsx
 ┃ ┃ ┃ ┣ 📜RegisterModal.jsx
 ┃ ┃ ┃ ┗ 📜RegistModal.jsx
 ┃ ┃ ┣ 📂Navbar
 ┃ ┃ ┃ ┣ 📜Navbar.jsx
 ┃ ┃ ┃ ┗ 📜Navbar.module.css
 ┃ ┃ ┣ 📂RelativeOptionCard
 ┃ ┃ ┃ ┣ 📜RelativeOptionCard.jsx
 ┃ ┃ ┃ ┗ 📜RelativeOptionCard.module.css
 ┃ ┃ ┗ 📂Search
 ┃ ┃ ┃ ┣ 📜SearchCard.jsx
 ┃ ┃ ┃ ┗ 📜SearchCard.module.css
 ┃ ┣ 📂detail
 ┃ ┃ ┣ 📂FestivalSlider
 ┃ ┃ ┃ ┣ 📜FestivalSlider.jsx
 ┃ ┃ ┃ ┗ 📜FestivalSlider.module.css
 ┃ ┃ ┣ 📜Detail.module.css
 ┃ ┃ ┣ 📜DetailBasicInfo.jsx
 ┃ ┃ ┣ 📜DetailContent.jsx
 ┃ ┃ ┣ 📜DetailImage.jsx
 ┃ ┃ ┣ 📜DetailTitle.jsx
 ┃ ┃ ┗ 📜FestivalInfo.jsx
 ┃ ┣ 📂EventBanner
 ┃ ┃ ┣ 📜EventBanner.jsx
 ┃ ┃ ┗ 📜EventBanner.module.css
 ┃ ┣ 📂loading
 ┃ ┃ ┣ 📜Spinner.jsx
 ┃ ┃ ┗ 📜Spinner.module.css
 ┃ ┗ 📂mypageTaps
 ┃ ┃ ┣ 📜FriendsList.jsx
 ┃ ┃ ┣ 📜MypageListCard.jsx
 ┃ ┃ ┣ 📜mypageTaps.module.css
 ┃ ┃ ┣ 📜MyTrips.jsx
 ┃ ┃ ┗ 📜SavedList.jsx
 ┣ 📂hooks
 ┃ ┣ 📜requireAuth.jsx
 ┃ ┣ 📜useDeleteFavorite.js
 ┃ ┣ 📜useDetailsCommon.js
 ┃ ┣ 📜useFavorite.js
 ┃ ┣ 📜useKeywordList.js
 ┃ ┣ 📜useLocationTourList.js
 ┃ ┣ 📜useModal.jsx
 ┃ ┣ 📜usePopularTourList.js
 ┃ ┣ 📜useRecommendTourList.js
 ┃ ┣ 📜useScheduleDetail.js
 ┃ ┣ 📜useScheduleList.js
 ┃ ┣ 📜useTourDetail.js
 ┃ ┗ 📜useTourList.js
 ┣ 📂layout
 ┃ ┗ 📜MainLayout.jsx
 ┣ 📂loaders
 ┃ ┣ 📜kakaoLoader.js
 ┃ ┗ 📜listLoader.js
 ┣ 📂pages
 ┃ ┣ 📜CalendarPage.jsx
 ┃ ┣ 📜CalendarPage.module.css
 ┃ ┣ 📜DetailPage.jsx
 ┃ ┣ 📜DetailPage.module.css
 ┃ ┣ 📜FirstLoadingPage.jsx
 ┃ ┣ 📜ListPage.jsx
 ┃ ┣ 📜LoginPage.jsx
 ┃ ┣ 📜LoginPage.module.css
 ┃ ┣ 📜MainPage.jsx
 ┃ ┣ 📜MainPage.module.css
 ┃ ┣ 📜MapPage.jsx
 ┃ ┣ 📜MapPage.module.css
 ┃ ┣ 📜MyPage.jsx
 ┃ ┣ 📜MyPage.module.css
 ┃ ┣ 📜NotFoundPage.jsx
 ┃ ┣ 📜PlanPage.jsx
 ┃ ┣ 📜PlanPage.module.css
 ┃ ┣ 📜ProfileEditPage.jsx
 ┃ ┣ 📜ProfileEditPage.module.css
 ┃ ┣ 📜RegisterPage.jsx
 ┃ ┣ 📜SaveListPage.jsx
 ┃ ┣ 📜SaveListPage.module.css
 ┃ ┣ 📜SearchPage.jsx
 ┃ ┣ 📜SearchPage.module.css
 ┃ ┣ 📜SearchPopularPage.jsx
 ┃ ┣ 📜SelectDatePage.jsx
 ┃ ┗ 📜SelectDatePage.module.css
 ┣ 📂routes
 ┃ ┗ 📜AppRouter.jsx
 ┣ 📂store
 ┃ ┣ 📜authSlice.js
 ┃ ┗ 📜store.js
 ┣ 📂utils
 ┃ ┗ 📜features.js
 ┣ 📜app.jsx
 ┣ 📜index.css
 ┗ 📜main.jsx

10. Development Workflow (개발 워크플로우)

브랜치 전략

커밋 유형 의미
Feat 새로운 기능 추가
Fix 버그 수정
Docs 문서 수정
Style 코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
Refactor 코드 리팩토링
Test 테스트 코드, 리팩토링 테스트 코드 추가
Chore 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
Design CSS 등 사용자 UI 디자인 변경
Comment 필요한 주석 추가 및 변경
Rename 파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
Remove 파일을 삭제하는 작업만 수행한 경우
!BREAKING CHANGE 커다란 API 변경의 경우
!HOTFIX 급하게 치명적인 버그를 고쳐야 하는 경우

main 브랜치는 배포 가능한 최신 상태를 유지하고 기능 개발이나 버그 수정은 별도의 브랜치에서 작업한 후,

리뷰를 거쳐 main 브랜치에 Merge 하는 방식으로 진행 하였습니다.

Prettier

{
  "semi": false,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "es5",
  "printWidth": 100,
  "bracketSpacing": true,
  "arrowParens": "avoid",
  "endOfLine": "auto"
}

테이블 구조

유저플로우

개선 목표

  1. 여행 일정 공유 사용자가 직접 작성한 여행 일정을 함께 여행하는 친구들과 쉽게 공유할 수 있는 기능을 추가합니다.
  2. AI를 활용한 여행 일정 및 동선 제시 GPT API를 활용하여 여행 기간을 입력 시, 여행 일정 및 동선을 자동으로 제시합니다.
  3. API호출 다 받아서 DB에 저장하기
  4. 여행지 후기 작성 서비스 구현
  5. Kakao, Google O Auth 구현
  6. 지도 페이지에서 재탐색 했을 때 지도 확대 레벨 수정 (지도가 2중으로 겹치는 현상? 때문에 이상하게 보임)

프로젝트 소감

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •