Files
nuxt-deep/docs/PRD_PROMPT.md

210 lines
7.4 KiB
Markdown

# PRD 생성 메타 프롬프트
# 노션 견적서 → 웹 뷰어 & PDF 다운로드 MVP
> **사용법**: 아래 `---START---`부터 `---END---`까지 전체를 복사하여 Claude에게 붙여넣으세요.
---START---
## 역할
당신은 시니어 프로덕트 매니저 겸 풀스택 아키텍트입니다.
아래 제품 아이디어와 기술 제약조건을 바탕으로 실행 가능한 MVP PRD 문서를 작성하세요.
---
## 제품 아이디어
**서비스명 (가칭)**: InvoiceLink
**한 줄 요약**:
노션 데이터베이스에 입력한 견적서를 고유 링크로 공유하면,
클라이언트가 브라우저에서 확인하고 PDF로 다운로드할 수 있는 웹 서비스.
**핵심 사용 흐름**:
1. 공급자(supplier)가 노션 데이터베이스에 견적 항목을 입력한다
2. InvoiceLink 대시보드에서 "견적서 발행" 클릭 → 고유 URL 생성
3. 공급자가 URL을 클라이언트에게 전달(이메일, 카카오톡 등)
4. 클라이언트가 링크를 열면 브랜딩된 견적서 페이지를 확인한다
5. 클라이언트가 "PDF 다운로드" 버튼을 클릭하여 파일을 저장한다
---
## 기술 제약조건 (반드시 반영)
이 프로젝트의 기존 스택을 기반으로 설계한다:
- **프레임워크**: Nuxt 3 (App Router 방식, `app/` 디렉토리 구조)
- **UI**: `@nuxt/ui` v4
- **인증/DB**: Supabase (`@nuxtjs/supabase`) — magic link + Google OAuth
- **AI 기능 (선택)**: Anthropic Claude Sonnet 4.6 (`@anthropic-ai/sdk`) — streaming
- **패키지 매니저**: pnpm
- **검증**: Zod
- **아이콘**: Lucide + Iconify
- **배포**: Vercel 또는 Netlify (서버리스 우선)
- **개발 인원**: 1인, 빠른 출시 우선, 비용 최소화
---
## PRD 작성 구조 (아래 순서대로 빠짐없이 작성)
### 1. 배경 및 문제 정의
- 현재 견적서 전달 방식의 Pain Point 3가지 (이메일 첨부, 엑셀, 구두 전달 등)
- 타겟 사용자 페르소나: 노션을 이미 사용하는 프리랜서 / 소규모 에이전시
- 해결하려는 핵심 문제를 **1문장**으로 정의
### 2. 목표 (Goals & Non-Goals)
**MVP Goals** (3개 이내, 측정 가능하게):
- 예: "견적서 발행부터 클라이언트 PDF 수령까지 5분 이내"
**Non-Goals** (MVP에서 의도적으로 제외):
- 클라이언트 서명/결재 기능
- 다국어 지원
- 그 외 범위 방어 항목 추가
### 3. 사용자 스토리
형식: `나는 [역할]로서, [목적]을 위해 [행동]을 할 수 있다.`
각 스토리마다 **수용 기준(Acceptance Criteria)** 2~3개 포함.
- 공급자(Supplier) 스토리 4개
- 클라이언트(Client) 스토리 3개
### 4. 기능 명세
#### F1. 노션 연동
- 연동 방식: Notion Integration Token (OAuth는 Non-Goal)
- 필수 데이터베이스 속성 매핑 테이블:
| 노션 속성명 | 타입 | InvoiceLink 필드 | 필수 여부 |
|---|---|---|---|
| 견적번호 | Title | quote_number | 필수 |
| 발행일 | Date | issued_at | 필수 |
| 유효기간 | Date | expires_at | 필수 |
| 수신자명 | Text | client_name | 필수 |
| 수신자 이메일 | Email | client_email | 선택 |
| 항목명 | Text | item_name | 필수 |
| 수량 | Number | quantity | 필수 |
| 단가 (원) | Number | unit_price | 필수 |
| 세율 (%) | Number | tax_rate | 필수 |
| 비고 | Text | notes | 선택 |
- 동기화 트리거 방식 및 근거 (수동 버튼 vs 자동 webhook 중 선택)
- 에러 처리: 필수 필드 누락 시 동작 정의
#### F2. 고유 링크 생성
- URL 구조: `/q/[uuid-v4]` (추측 불가 설계)
- 링크 유효기간 정책 (기본값 및 커스터마이징 범위)
- 비공개/공개 접근 제어: 링크 소유자만 비활성화 가능
- 링크 복사 UX (클립보드 복사 버튼)
#### F3. 견적서 웹 뷰어
레이아웃 구성 요소:
- 헤더: 공급자 로고, 상호명, 연락처
- 견적 메타: 견적번호, 발행일, 유효기간, 수신자 정보
- 품목 테이블: 항목명 / 수량 / 단가 / 세액 / 소계
- 합계 영역: 공급가액, 세액, 총액 (천 단위 콤마 포맷)
- 푸터: 비고, 공급자 사업자 정보
반응형 요구사항:
- 모바일(375px)에서 품목 테이블 가로 스크롤 허용
- PDF 출력 시 A4 1페이지 기준 최적화
브랜딩 커스터마이징 범위 (MVP):
- 로고 이미지 업로드
- Primary 컬러 선택 (6가지 프리셋)
#### F4. PDF 다운로드
- 생성 방식: **서버사이드** — Nuxt server route(`server/api/quote/[id]/pdf.get.ts`)에서 `@sparticuz/chromium` + `puppeteer-core`로 헤드리스 렌더링
- 근거: 클라이언트 `window.print()`는 브라우저별 출력 차이 존재, 서버사이드가 일관성 보장
- 파일명 규칙: `견적서_{견적번호}_{YYYYMMDD}.pdf`
- 다운로드 이벤트: Supabase `quote_events` 테이블에 `pdf_downloaded` 로그 기록
- Vercel 서버리스 함수 메모리 제한(1GB) 내 처리 가능 여부 명시
#### F5. 공급자 대시보드
- 견적서 목록 (발행일 내림차순, 페이지네이션)
- 견적서별 상태 표시: `draft` / `sent` / `viewed` / `expired`
- 클라이언트 조회 여부 및 PDF 다운로드 여부 표시
- 견적서 비활성화(링크 만료) 토글
### 5. 데이터 모델
아래 엔티티에 대해 Supabase(PostgreSQL) 기준 핵심 필드 정의.
필드명 영문 snake_case, PostgreSQL 타입 명시, RLS 정책 방향 포함.
- `suppliers` (공급자)
- `quotes` (견적서 헤더)
- `quote_items` (견적 항목)
- `quote_events` (조회/다운로드 이벤트 로그)
### 6. API 설계 (Nuxt Server Routes)
| Method | Route | 설명 | Auth |
|---|---|---|---|
| GET | /api/quote/[id] | 견적서 데이터 조회 | Public (링크 보유자) |
| GET | /api/quote/[id]/pdf | PDF 생성 및 다운로드 | Public |
| POST | /api/quotes | 견적서 생성 (노션 동기화) | Supplier |
| PATCH | /api/quotes/[id] | 견적서 상태 변경 | Supplier |
| GET | /api/notion/sync | 노션 DB 항목 목록 조회 | Supplier |
### 7. 기술 스택 최종 제안
아래 항목별로 선택한 라이브러리와 선택 이유를 한 줄로 명시:
- PDF 생성
- 노션 API 클라이언트
- 날짜 처리
- 숫자/통화 포맷
- 이메일 발송 (선택)
### 8. MVP 마일스톤
| Phase | 기간 | 완성 기준 |
|---|---|---|
| Phase 1 | Week 1~2 | ? |
| Phase 2 | Week 3~4 | ? |
| Launch | Week 5 | ? |
**런치 기준(Launch Criteria)**: 이 조건이 모두 충족되어야 배포 가능
- [ ] 조건 1
- [ ] 조건 2
- [ ] 조건 3
### 9. 성공 지표 (Metrics)
- **Primary Metric** (북극성 지표) 1개
- **Supporting Metrics** 3개 이내
- 각 지표의 측정 방법 및 도구 명시 (Supabase Analytics, PostHog 등)
### 10. 리스크 & 미해결 질문
**리스크**:
- Vercel 서버리스에서 Headless Chrome 실행 시 Cold Start 지연 가능성
- 노션 API rate limit (평균 3 req/s) 대응 전략 필요
**Open Questions** (의사결정 필요 항목 3~5개):
각 질문에 현재 유력한 가설(assumption)을 함께 명시.
---
## 출력 형식 요구사항
- 마크다운 형식
- 섹션: H2(`##`), 서브섹션: H3(`###`), 세부항목: H4(`####`)
- 테이블, 체크리스트, 코드블록 적극 활용
- SQL DDL은 코드블록(`sql`)으로 표현
- 분량: 2,000~3,000 단어
- 톤: 군더더기 없는 기술 문서체 (한국어)
- 추상적 표현 금지 — 모든 기능은 구현 레벨로 구체화
- 각 섹션 말미에 **구현 시 주의사항** 한 줄 추가
---END---