Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 0.5px border
- 0.75px border
- github
- literal
- 10px
- angular
- Props
- 당근마켓
- npm
- TypeScript
- 0.25px border
- 데이터베이스 #try #이중
- ZOOM
- 컴포넌튼
- Websocket
- ES5
- 전역변수
- jwt
- es6
- 1px border
- &연산
- 서버리스 #
- entity
- 으
- 문서번호
- TS
- Strict
- 타입스크립트
- font-size
- 클론코딩
Archives
- Today
- Total
복잡한뇌구조마냥
✈️ TripHub - 여행 계획 추천 플랫폼 (1등 수상 프로젝트) 본문
🧭 왜 만들었는가
여행 일정 짤 때, 단순히 장소만 나열된 정보는 부족하다.
방문 시간, 체류 시간, 비용 등을 기준으로 직접 여행 계획을 세울 수 있는 구체적인 여행 추천 플랫폼이 있으면 좋겠다.
이런 문제의식에서 출발하여, 팀 프로젝트로 TripHub를 기획하게 되었습니다.
🧩 핵심 기능 소개
✔️ 여행지
- 장소 이름, 메모, 비용, 지역, 카테고리 등 입력
- 대표 이미지 선택 + 이미지 최대 6장 업로드
- 좋아요, 즐겨찾기, 리뷰, 별점, 조회수 기능
✔️ 게시글(일정)
- 여행지들을 묶어 일정 구성
- 일정 요약 (예산 총합, 방문 지역, 활동 수)
- GPT 챗봇을 통한 여행지 추천 → 즉시 일정에 반영 가능
- 일정 탭 + 본문 탭 UI 구성
✔️ 탐색 기능
- 여행지/게시글 목록 피드 형태 제공
- 검색 / 필터 / 정렬 가능
- 메인 페이지에서 Best 여행지/일정 하이라이팅
✔️ 마이페이지
- 내가 등록한 여행지, 일정 관리 (수정/삭제 가능)
- 즐겨찾기/좋아요한 항목 목록 확인
✔️ 기타
- 로그인 없이 조회 가능
- 로그인하면 작성, 좋아요, 즐겨찾기 가능
- 소셜 로그인(Google, Kakao)
- 게시글 공유 (URL 복사)
- 게시글/여행지 임시 저장 기능
🗂️ DB 설계 (ERD)
🔧 설계 방향 및 고려사항
- posts – places 관계를 M:N으로 설계하여, 여러 게시글에 같은 여행지를 포함할 수 있도록 유연성 확보
- post_places 중간 테이블을 통해 게시글과 여행지를 연결
- 게시글 내 여행지 순서를 visit_start_time 필드로 관리
- **리뷰, 좋아요, 즐겨찾기, 조회수**는 각각의 테이블로 분리해 기능별로 독립적인 관리 및 통계 분석이 가능하도록 설계
- Supabase 인증 시스템을 기준으로, 추가 프로필 정보는 별도 user_profiles 테이블로 분리해 보안과 확장성을 고려
- 게시글/여행지의 좋아요 수, 즐겨찾기 수 등 추가 기능은 RPC를 이용하여 게시글/여행지 조회 시 가져오는 방식으로 변경함
🔄 설계 변경 사항
- 초기에 supabase의 auth.user를 이용한 사용자 관리를 계획하였으나 정보를 불러올 수 없어서 user_profiles 테이블 추가
- 대표이미지 관련 정보를 별도의 테이블로 관리하였으나, 관리와 연동의 어려움으로 thumbnail_image_id 필드 추가
- chat_message 테이블은 계획에 없었으나 AI를 활용한 여행지 추천 기능 추가하면서 채팅 내용 저장을 위해서 추가
🏗 시스템 아키텍처
개발 & 배포
- Cursor를 이용한 개발
- github에서 컨벤션을 통한 이슈 및 PR 관리
- main 브랜치 merge 후 git action을 통한 자동 빌드 테스트
- 개인 레포로 sync fork를 이용해서 vercel에 배포 (조직 레포 배포시 유료로 인해 sync fork 적용)
- 완벽한 CI/CD 구조는 아니지만 CI/CD 구현
서비스 구성
- 사용자에서 프론트 엔드
- 프론트엔드는 supabase의 백엔드 시스템에서 정보를 가져옴
- 챗봇 기반 여행지 추천은 DB에 없어도 GPT에서 데이터를 가져오기 때문에 GPT 추가 연결
🛠️ 기술 스택
항목 | 기술 |
프론트엔드 | Next.js, Tailwind CSS, shadcn/ui |
상태관리 | Context API, Zustand |
유틸 도구 | date-fns (날짜 처리), nanoid (경량 고유 ID 생성) |
정적 분석 | Prettier, ESLint |
백엔드 | Supabase (auth, DB, storage), PostgreSQL |
인증 | Supabase Auth (Google, Kakao 소셜 로그인) |
AI 서비스 | OpenAI GPT API (챗봇 기반 추천) |
AI UI 도구 | Readdy.ai, Cursor |
배포 | Vercel (CI/CD 자동 배포) |
협업 | GitHub (GitHub Flow 전략), Notion, Slack |
🎯 맡은 역할 (PM / 팀장)
- 전체 프로젝트 기획 및 컨셉 제안
- ERD/DB 구조 설계 및 Supabase 세팅
- 여행지/게시글 CRUD, 리뷰, 좋아요, 즐겨찾기 등 핵심 기능 전담
- GPT 챗봇 모달 및 대화 저장 구현
- 상태 관리 구조 설계 (Zustand)
- 공통 컴포넌트 구조 설계 및 모듈화
- GitHub 협업 전략 수립 (브랜치 규칙, PR 템플릿, CI/CD 구성)
- 발표자료 제작 및 최종 발표 진행
🧯 문제 해결 경험 (Troubleshooting)
짧은 기간 내에 다양한 기능을 구현하면서도 예상치 못한 문제가 자주 발생했지만, 그 과정 자체가 성장의 발판이 되었습니다. 특히 다음과 같은 문제를 직접 해결했습니다.
1. Supabase API가 아예 동작하지 않음
- 원인: .env 환경변수에 SUPABASE_URL, SUPABASE_ANON_KEY 값을 잘못 입력
- 해결: 정확한 키로 수정 후 정상 연결됨
2. useSearchParams()가 작동하지 않음
- 원인: Next.js App Router에서 해당 훅이 Suspense 컨텍스트 안에서만 동작
- 해결: 해당 컴포넌트를 <Suspense>로 감싸 해결
3. 게시글 조회수가 두 번씩 올라감
- 원인: React StrictMode 환경에서 useEffect가 두 번 실행
- 해결: useCallback + 조건 분기로 중복 호출 방지
4. Supabase 인증 충돌 문제
- 원인: 브라우저에서 같은 프로젝트를 여러 탭으로 열었을 때 토큰 충돌
- 해결: 동일 브라우저에서 한 인스턴스만 켜도록 안내하고 로컬 저장소 재검토
5. API 호출 시 user 정보가 반영되지 않음
- 원인: useCallback 의존성 배열에 user 미포함
- 해결: user 포함 후 정상 작동
6. 여행 기간이 음수로 표시됨
- 원인: date-fns의 differenceInDays 함수에서 날짜 순서 반대
- 해결: 시작일과 종료일 순서 수정
🧹 리팩토링 및 개선 사례
기능 구현 외에도 코드의 가독성, 재사용성, 유지보수성 향상을 위해 적극적으로 리팩토링을 진행했습니다.
1. Supabase RPC 재작성 (목록 조회)
- Before: 기존 RPC는 UI에 필요한 필터/정렬 기준을 반영하지 못하고 데이터 구조도 일관되지 않음
- After: 조건에 맞는 데이터를 정확히 불러오는 RPC로 재작성 → 클라이언트 로직 단순화, 정렬/필터 정확도 향상
2. 등록 폼 컴포넌트 분리
- Before: 게시글과 여행지 등록 화면이 서로 다른 구조로 구현되어 중복 코드와 복잡성 증가
- After: 입력 필드를 공통 컴포넌트로 추출, 유효성 검사 및 초기화 로직은 lib, hooks로 분리 → 유지보수성과 확장성 향상
3. 게시글 상세 페이지 컴포넌트 통합
- Before: 일정 탭 / 본문 탭에서 유사한 여행지 리스트 UI를 서로 다른 컴포넌트로 구현 → 로직 중복 발생
- After: 하나의 공통 컴포넌트로 통합하고 props로 분기 처리 → 코드 일관성 및 재사용성 확보
🧪 발표 & 피드백
✅ 긍정 피드백
- GitHub Flow 기반 협업 체계가 잘 정리됨
- 커밋/PR 관리, 발표자료 구성 등 관리력이 뛰어남
- 챗봇·정렬·검색 등 기능이 실제 사용 시나리오와 잘 연결됨
- 구현 폭이 넓고 UI/UX 구성도 목적에 부합함
⚠️ 개선 피드백
- 메인 페이지 Top30 → 갯수 제한 또는 페이지네이션 필요
- 로딩 처리 부족 → 스켈레톤 or 다이얼로그 도입 필요
- 정렬 기준에 대한 시각적 피드백 부족
- 모바일에서 회원가입 화면 UX 미흡
- textarea 크기 자동 조절 미지원
🏆 프로젝트 결과
- 1주일 만에 핵심 기능 전체 구현 + 배포 완료 (MVP 달성)
- AIBE3 1차 팀 프로젝트 평가에서 팀 전체 투표로 압도적 1등 선정
- 기획, 설계, 구현, 협업, 발표 전 과정을 주도하며 주체적으로 리딩
- 실제 사용자 시나리오를 반영한 챗봇 + 일정 관리라는 차별화된 경험 제공
📸 핵심 화면 예시
🧭 공통
![]() |
![]() |
![]() |
![]() |
메인 - 게시글 | 메인 - 여행지 | 메인 - 검색 | 여행 추천 챗봇 |
📍 여행지
![]() |
![]() |
![]() |
![]() |
![]() |
목록 | 상세 | 리뷰 | 등록된 목록 | 수정 |
📝 게시글 (여행 일정)
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
목록 | 부가기능 | 상세 (여행 일정) | 상세 (여행 후기) | 리뷰 | 등록 |
🙋마이페이지
![]() |
![]() |
![]() |
![]() |
로그인 | 회원가입 | 마이페이지 - 게시글 | 마이페이지 - 여행지 |
💬 회고
- 짧은 시간이었지만, 기획부터 배포까지의 전체 개발 사이클을 처음부터 끝까지 경험할 수 있었던 밀도 높은 프로젝트였습니다.다만, 리팩토링이나 타입 안정성, UX 디테일에서는 아쉬운 부분도 있었고,
다음 프로젝트에서는 더 체계적인 설계와 사용자 중심의 완성도를 높이는 걸 목표로 삼게 되었습니다. - 특히 기능 구현뿐 아니라 디자인, 협업 환경 구성, 발표까지 스스로 리딩하며 전 과정을 주도했던 점이 가장 큰 성장의 계기가 되었습니다.
- 프로젝트가 끝나고 팀 발표에서 1등으로 선정되었을 때, 정말 뿌듯했고 그동안의 실력이 실제 결과로 검증되는 느낌이었습니다.
🔗 관련 링크
- 🖥️ 배포 링크: https://aibe-3-project1-team04.vercel.app
- 📂 GitHub Repository: GitHub - TripHub
- 📄 발표자료 보기: TripHub 발표자료 (PDF)
LIST
'공통 > 프로젝트' 카테고리의 다른 글
BIP ( 약속스케줄러 + 재능기부 커뮤니티 ) 설계 (0) | 2022.11.25 |
---|---|
당근 마켓 클론 코딩 (0) | 2022.11.22 |
도박신고는 1336 (어른들을 위한 간단한 놀이 서비스) - 미니 프로젝트 (0) | 2022.11.21 |
미니 프로젝트 결산 ( Sparta Travler ) (0) | 2022.08.07 |
첫번째 미니 프로젝트 github 연결 (0) | 2022.07.31 |