149 lines
3.7 KiB
Markdown
149 lines
3.7 KiB
Markdown
# 직장인 점심 추천 미니앱 구현 계획
|
|
|
|
## 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. 검수 체크리스트 기준 점검 후 배포
|