尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證오늘의 떡볶이 - 오떠끼
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
떡볶이 맛집을 지도에서 찾고, 등록하고, 리뷰를 남기는 떡볶이 특화 맛집 서비스 배포: https://oh-topokki.vercel.app (iOS는 Capacitor 래핑, 심사 준비 중) 일반 맛집 앱은 "떡볶이집"이라는 것까지만 알려줍니다. 오떠끼는 떡볶이를 좋아하는 사람이 실제로 궁금해하는 것 — 밀떡/쌀떡, 소스 종류, 매운맛 단계와 조절 가능 여부, 사리·사이드 구성, 순대 내장 종류 — 를 구조화된 데이터로 쌓는 것을 목표로 합니다. Feature-Sliced Design을 참고한 레이어 구조입니다. 1. 데이터 유실 사고에서 시작한 백엔드 재구축 초기 버전은 Supabase 무료 플랜이었는데, 미사용으로 일시정지된 뒤 복원 기한(90일)이 지나 서비스 데이터를 전부 잃었습니다. 백업 파일을 받아봤지만 public 스키마 자체가 누락돼 복구 불가였습니다.檢視完整 README ↗
떡볶이 맛집을 지도에서 찾고, 등록하고, 리뷰를 남기는 떡볶이 특화 맛집 서비스
배포: https://tteokbokki.cc (iOS는 Capacitor 래핑, 심사 준비 중)
일반 맛집 앱은 "떡볶이집"이라는 것까지만 알려줍니다. 오떠끼는 떡볶이를 좋아하는 사람이 실제로 궁금해하는 것 — 밀떡/쌀떡, 소스 종류, 매운맛 단계와 조절 가능 여부, 사리·사이드 구성, 순대 내장 종류 — 를 구조화된 데이터로 쌓는 것을 목표로 합니다.
| 영역 | 선택 | 이유 |
|---|---|---|
| 프레임워크 | Next.js (App Router) + React 19 | 프론트와 API를 하나의 모놀리스로 운영 |
| API | Route Handler (app/api/**) REST | Server Actions 대신 REST 유지 — 모바일 클라이언트가 같은 API를 재사용 |
| DB / ORM | Neon (Postgres) + Prisma | 풀링/다이렉트 URL 분리, 스키마 자산 재활용 |
| 인증 | Better Auth | TS 네이티브, Prisma 어댑터로 세션·계정 테이블을 같은 DB에서 관리 |
| 상태 관리 | TanStack Query + Jotai | 서버 상태와 클라이언트 상태(지도 위치 등) 분리 |
| UI | Tailwind CSS 4, Base UI, overlay-kit, sonner | |
| 지도 | Naver Maps SDK + 네이버 지역검색 API | |
| 모바일 | Capacitor (iOS) | 웹뷰 원격 URL 모드로 웹 배포 = 앱 업데이트 |
Feature-Sliced Design을 참고한 레이어 구조입니다.
app/ # 라우팅 + API Route Handler
widgets/ # 지도, 플로팅 메뉴 등 조합 단위
features/ # auth · restaurant · review · favorite · search
shared/ # api, hooks, store, ui, types 등 공용 계층
lib/ # Better Auth 서버/클라이언트 인스턴스
prisma/ # 스키마 (User + 도메인 모델 통합)
초기 버전은 Supabase 무료 플랜이었는데, 미사용으로 일시정지된 뒤 복원 기한(90일)이 지나 서비스 데이터를 전부 잃었습니다. 백업 파일을 받아봤지만 public 스키마 자체가 누락돼 복구 불가였습니다.
pg_dump 자동 백업(.github/workflows/backup.yml)을 가장 먼저 세팅했습니다.schema.prisma로 테이블은 재생성하고, 데이터 0건인 시점을 기회 삼아 미뤄뒀던 스키마 정리(enum 도입, 필드명 일관화, FK 인덱스 추가)를 일괄 진행했습니다.name을 DB 컬럼 nickname에 매핑하고, 앱 전역에서는 AuthContext가 nickname으로 정규화해 도메인 용어를 통일했습니다.데이터 성격에 따라 삭제 정책을 다르게 가져갔습니다.
authorId를 nullable로 두고 onDelete: SetNull로 보존onDelete: SetNull로 내용·별점은 보존하고 "탈퇴한 사용자"로 표시 (별점 집계도 그대로 유지)onDelete: Cascade로 함께 삭제topokkiType, sundaeType)은 enum으로 강제하고, 다중 선택(소스·사리 등)은 확장이 쉬운 String[]로 유지했습니다.unrank 플래그로 구분해 서비스 초기에도 랭킹이 비어 보이지 않게 했습니다.es-hangul로 조사(을/를 등)를 자동 처리해 동적 문구가 자연스럽게 읽히도록 했습니다.build 단계에서 prisma generate 포함pg_dump → artifact 90일 보관scripts/import-restaurants.mjs로 JSON 일괄 등록 (재실행 시 skipDuplicates로 멱등)pnpm install
# .env: DATABASE_URL, DIRECT_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL,
# NAVER_CLIENT_ID, NAVER_CLIENT_SECRET
pnpm db:push
pnpm dev