# 직장인 점심 추천 미니앱 구현 계획 ## 1. 기술 스택 제안 - MiniApp Frontend: Apps in Toss + Granite RN - Backend API: Node.js (NestJS/Express) or Java Spring Boot - DB: PostgreSQL - Cache: Redis (선택) - 지도/장소 데이터: Kakao/Google/Naver Place API 중 1개 선택 ## 2. 프론트엔드 디렉터리 구조 제안 ``` template/src/ _app.tsx pages/ index.tsx # 홈/목록 restaurants/[id].tsx # 식당 상세 reviews/edit.tsx # 리뷰 작성/수정 me/reviews.tsx # 내 리뷰 _404.tsx features/ location/ useCurrentLocation.ts restaurants/ api.ts models.ts hooks.ts reviews/ api.ts hooks.ts likes/ api.ts components/ RestaurantCard.tsx CategoryFilter.tsx SortSelector.tsx RatingStars.tsx EmptyState.tsx lib/ httpClient.ts queryClient.ts error.ts constants/ category.ts sort.ts ``` ## 3. 백엔드 모듈 구조 제안 - auth - 토스 사용자 식별자 검증/매핑 - restaurants - 주변 조회, 상세 조회 - reviews - 리뷰 upsert/delete/list - likes - 좋아요 토글 - users - 내 리뷰 조회 - integrations - 장소 API 클라이언트, 카테고리 매핑 ## 4. 핵심 유스케이스별 처리 ### 4.1 주변 식당 조회 1. FE가 현재 좌표(lat,lng) 획득 2. GET /v1/restaurants/nearby 호출 3. BE는 내부 캐시 우선 조회 4. 캐시 미스 시 장소 API 호출 + 표준 카테고리 매핑 + DB upsert 5. 통계(join restaurant_stat) 결합 후 반환 ### 4.2 리뷰 작성/수정 1. FE가 rating/content 전송 2. BE가 (restaurant_id, user_id) unique 기준 upsert 3. refresh_restaurant_stat(restaurant_id) 호출 4. 최신 리뷰/평점 반환 ### 4.3 좋아요 토글 1. row 존재 여부 확인 2. 있으면 delete, 없으면 insert 3. refresh_restaurant_stat 호출 4. liked 상태와 like_count 반환 ## 5. API 에러 규약 - 공통 포맷 ```json { "code": "INVALID_INPUT", "message": "rating must be between 1 and 5", "traceId": "..." } ``` - 주요 코드 - UNAUTHORIZED - FORBIDDEN - NOT_FOUND - INVALID_INPUT - RATE_LIMITED - INTERNAL_ERROR ## 6. 보안/악용 방지 - 리뷰/좋아요 API 인증 필수 - 리뷰 작성 rate limit (예: 사용자당 분당 5회) - 욕설 필터(간단 키워드 + 신고 플래그) - SQL injection/XSS 대비(파라미터 바인딩, escaping) ## 7. QA 체크리스트 - 위치 권한 허용/거부 둘 다 정상 동작 - 권한 거부 시 수동 지역 선택 제공 - 0개 결과(empty state) UI - 느린 네트워크에서 skeleton/loading 표시 - 리뷰 저장 후 목록/평점 즉시 반영 - 좋아요 토글 연타 시 데이터 일관성 확인 - 앱 백그라운드 전환 후 복귀 시 상태 복원 ## 8. 출시 전 운영 준비 - 개인정보처리방침/이용약관 페이지 - 고객 문의 채널(이메일/채팅 URL) - 모니터링 대시보드 - API 성공률 - p95 latency - 에러율 - 장애 대응 runbook ## 9. 개발 일정(예시, 2주) ### Day 1-2 - 프로젝트 구조 확장 - 공통 HTTP 클라이언트/에러 처리 ### Day 3-5 - 식당 목록/상세 API + 화면 - 위치 권한/좌표 처리 ### Day 6-8 - 리뷰 CRUD + 좋아요 토글 - 통계 반영 ### Day 9-10 - 내 활동 화면 - QA/버그 수정 ### Day 11-12 - 성능/로그 점검 - 검수 대응 문서 정리 ## 10. 바로 시작할 개발 순서 1. `granite.config.ts`의 appName/brand 값 실서비스 값으로 변경 2. 홈 목록 화면에 위치 권한 + nearby API 연결 3. 식당 상세와 리뷰 작성 페이지 연결 4. 리뷰/좋아요 API 붙이고 optimistic update 적용 5. 검수 체크리스트 기준 점검 후 배포