One Thread per Trip
로그인 없이 초대 코드 하나로 여행 멤버가 모여 여행지를 함께 정하고, 사진과 이야기를 나누는 익명 여행 스레드 서비스.
- 여행 만들기: 이름, 날짜를 입력해 여행을 생성하고 초대 코드를 발급받는다.
- 초대 코드로 참여: 초대 코드 입력 → 닉네임 설정 2단계로 합류한다.
- 초대 공유: 모바일에서는 시스템 공유 시트, 데스크톱에서는 클립보드 복사로 초대 코드를 전달한다.
- 복구 코드: 기기를 바꾸거나 localStorage가 초기화되어도 복구 코드로 멤버십을 되찾을 수 있다.
- 익명 인증: 로그인 없이
device_id(localStorage UUID) + 여행별member_token으로 신원을 관리한다.
- 멤버가 여행지를 자유롭게 제안한다.
- 1인 1표 투표, 과반수(>50%) 달성 시 자동 확정된다.
- 호스트는 투표를 수동으로 마감해 최다 득표 여행지를 확정할 수 있다 (동률 시 먼저 제안된 것 우선).
- 여행지 확정 후 게시판이 활성화된다.
- 게시글에 텍스트와 사진을 함께 올릴 수 있다.
- 게시글을 클릭하면 댓글 스레드 페이지로 이동한다.
- 댓글은 최대 3단계(depth 0→1→2)까지 중첩 답글을 달 수 있다.
- 본인이 작성한 게시글/댓글은 수정 및 삭제할 수 있다.
- 호스트는 모든 멤버의 게시글/댓글을 삭제할 수 있다.
- 게시글 수정 시 사진을 교체하거나 삭제할 수 있다.
- 게시글 삭제 시 연결된 Storage 이미지와 댓글이 함께 제거된다.
- 데스크톱: 여행 페이지 우측 사이드바에 항상 표시.
- 모바일: "멤버 보기" 버튼 → 모달로 확인.
- 각 멤버: 이니셜 아바타, 닉네임, 호스트 뱃지, "(나)" 표시.
| 분류 | 사용 기술 |
|---|---|
| Frontend | React 19, TypeScript, Vite |
| UI | Mantine v7, Tailwind CSS |
| 상태 관리 | TanStack Query v5 (서버), Zustand (클라이언트) |
| 백엔드/DB | Supabase (PostgreSQL + Storage + Auth-less RLS) |
| 아키텍처 | Feature-Sliced Design (FSD) |
| 배포 | AWS EC2 + ECR, Docker + nginx, GitHub Actions |
main 브랜치에 push가 발생하면 GitHub Actions 워크플로우가 실행된다.
GitHub Actions 러너에서 Dockerfile을 기반으로 Vite 정적 파일을 포함한 nginx 이미지를 빌드한다.
빌드된 Docker 이미지를 AWS ECR에 버전 태그와 함께 푸시한다.
ECR 푸시 완료 후 GitHub Actions가 SSH로 EC2에 접속한다.
EC2에서 docker compose pull을 실행해 최신 이미지를 ECR에서 다운로드한다.
docker compose up -d --force-recreate로 기존 컨테이너를 최신 이미지 기반으로 재생성한다.
EC2의 Docker가 nginx 컨테이너를 재시작하고, 80포트를 통해 최신 정적 파일이 서비스된다.