timsquad 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/bin/tsq.js +6 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +142 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/full.d.ts +3 -0
- package/dist/commands/full.d.ts.map +1 -0
- package/dist/commands/full.js +87 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/git/commit.d.ts +3 -0
- package/dist/commands/git/commit.d.ts.map +1 -0
- package/dist/commands/git/commit.js +88 -0
- package/dist/commands/git/commit.js.map +1 -0
- package/dist/commands/git/index.d.ts +5 -0
- package/dist/commands/git/index.d.ts.map +1 -0
- package/dist/commands/git/index.js +5 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/pr.d.ts +3 -0
- package/dist/commands/git/pr.d.ts.map +1 -0
- package/dist/commands/git/pr.js +138 -0
- package/dist/commands/git/pr.js.map +1 -0
- package/dist/commands/git/release.d.ts +3 -0
- package/dist/commands/git/release.d.ts.map +1 -0
- package/dist/commands/git/release.js +158 -0
- package/dist/commands/git/release.js.map +1 -0
- package/dist/commands/git/sync.d.ts +3 -0
- package/dist/commands/git/sync.d.ts.map +1 -0
- package/dist/commands/git/sync.js +132 -0
- package/dist/commands/git/sync.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +271 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/metrics.d.ts +3 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +299 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/quick.d.ts +3 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +136 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/retro.d.ts +3 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +280 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +213 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +108 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/project.d.ts +47 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +191 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/template.d.ts +33 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +151 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/config.d.ts +75 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/feedback.d.ts +59 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +26 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +89 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +44 -0
- package/dist/types/project.js.map +1 -0
- package/dist/utils/colors.d.ts +30 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +54 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/date.d.ts +25 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +65 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/fs.d.ts +49 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +84 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompts.d.ts +31 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +95 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/yaml.d.ts +21 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +40 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +71 -0
- package/templates/common/CLAUDE.md.template +254 -0
- package/templates/common/claude/agents/tsq-dba.md +290 -0
- package/templates/common/claude/agents/tsq-designer.md +304 -0
- package/templates/common/claude/agents/tsq-developer.md +118 -0
- package/templates/common/claude/agents/tsq-planner.md +90 -0
- package/templates/common/claude/agents/tsq-prompter.md +336 -0
- package/templates/common/claude/agents/tsq-qa.md +134 -0
- package/templates/common/claude/agents/tsq-retro.md +168 -0
- package/templates/common/claude/agents/tsq-security.md +190 -0
- package/templates/common/claude/skills/architecture/SKILL.md +123 -0
- package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
- package/templates/common/claude/skills/coding/SKILL.md +171 -0
- package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
- package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
- package/templates/common/claude/skills/planning/SKILL.md +90 -0
- package/templates/common/claude/skills/security/SKILL.md +234 -0
- package/templates/common/claude/skills/testing/SKILL.md +146 -0
- package/templates/common/claude/skills/typescript/SKILL.md +435 -0
- package/templates/common/config.template.yaml +131 -0
- package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
- package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
- package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
- package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
- package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
- package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
- package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
- package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
- package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
- package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
- package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
- package/templates/common/timsquad/generators/data-design.xml +290 -0
- package/templates/common/timsquad/generators/prd.xml +280 -0
- package/templates/common/timsquad/generators/requirements.xml +220 -0
- package/templates/common/timsquad/generators/service-spec.xml +266 -0
- package/templates/common/timsquad/logs/_example.md +81 -0
- package/templates/common/timsquad/logs/_template.md +46 -0
- package/templates/common/timsquad/patterns/cqrs.xml +127 -0
- package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
- package/templates/common/timsquad/patterns/repository.xml +64 -0
- package/templates/common/timsquad/process/state-machine.xml +343 -0
- package/templates/common/timsquad/process/validation-rules.xml +308 -0
- package/templates/common/timsquad/process/workflow-base.xml +202 -0
- package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
- package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
- package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
- package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
- package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
- package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
- package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
- package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
- package/templates/common/timsquad/ssot/data-design.template.md +132 -0
- package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
- package/templates/common/timsquad/ssot/env-config.template.md +346 -0
- package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
- package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
- package/templates/common/timsquad/ssot/glossary.template.md +148 -0
- package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
- package/templates/common/timsquad/ssot/planning.template.md +94 -0
- package/templates/common/timsquad/ssot/prd.template.md +102 -0
- package/templates/common/timsquad/ssot/requirements.template.md +117 -0
- package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
- package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
- package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
- package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
- package/templates/common/timsquad/state/workspace.xml +217 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "외부 연동 명세서 (Integration Specification)"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
last_updated: {{DATE}}
|
|
5
|
+
author: tsq-planner
|
|
6
|
+
status: draft
|
|
7
|
+
project: {{PROJECT_NAME}}
|
|
8
|
+
required_level: 3
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 외부 연동 명세서 (Integration Specification)
|
|
12
|
+
|
|
13
|
+
> 외부 API, 서드파티 서비스, Webhook 연동을 정의합니다.
|
|
14
|
+
> Level 3 (Enterprise) 또는 platform 타입 프로젝트 필수 문서입니다.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. 연동 개요
|
|
19
|
+
|
|
20
|
+
### 1.1 연동 서비스 목록
|
|
21
|
+
|
|
22
|
+
| 서비스 | 용도 | 제공사 | 우선순위 | 상태 |
|
|
23
|
+
|-------|------|--------|:--------:|:----:|
|
|
24
|
+
| 결제 | 카드/계좌 결제 | Stripe/Toss | P0 | 📋 |
|
|
25
|
+
| 인증 | OAuth 로그인 | Google/Kakao | P1 | 📋 |
|
|
26
|
+
| 이메일 | 알림/마케팅 | SendGrid | P1 | 📋 |
|
|
27
|
+
| SMS | 인증/알림 | Twilio | P2 | 📋 |
|
|
28
|
+
| 스토리지 | 파일 업로드 | AWS S3 | P1 | 📋 |
|
|
29
|
+
| 모니터링 | 에러 추적 | Sentry | P1 | 📋 |
|
|
30
|
+
| 분석 | 사용자 행동 | Amplitude | P2 | 📋 |
|
|
31
|
+
|
|
32
|
+
> 상태: 📋 계획 / 🚧 개발 중 / ✅ 완료 / ⏸️ 보류
|
|
33
|
+
|
|
34
|
+
### 1.2 연동 아키텍처
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
38
|
+
│ {{PROJECT_NAME}} │
|
|
39
|
+
│ │
|
|
40
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
41
|
+
│ │ Integration Layer │ │
|
|
42
|
+
│ │ │ │
|
|
43
|
+
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
|
|
44
|
+
│ │ │ Payment │ │ Auth │ │ Storage │ ... │ │
|
|
45
|
+
│ │ │ Adapter │ │ Adapter │ │ Adapter │ │ │
|
|
46
|
+
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
|
|
47
|
+
│ └───────┼────────────┼────────────┼────────────────────┘ │
|
|
48
|
+
│ │ │ │ │
|
|
49
|
+
└──────────┼────────────┼────────────┼─────────────────────────┘
|
|
50
|
+
│ │ │
|
|
51
|
+
▼ ▼ ▼
|
|
52
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
53
|
+
│ Stripe │ │ Google │ │ AWS S3 │
|
|
54
|
+
│ Toss │ │ Kakao │ │ │
|
|
55
|
+
└──────────┘ └──────────┘ └──────────┘
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 2. 결제 연동
|
|
61
|
+
|
|
62
|
+
### 2.1 서비스 정보
|
|
63
|
+
|
|
64
|
+
| 항목 | 값 |
|
|
65
|
+
|-----|---|
|
|
66
|
+
| **제공사** | Stripe / Toss Payments |
|
|
67
|
+
| **API 버전** | 2023-10-16 |
|
|
68
|
+
| **환경** | Sandbox (Dev/Staging) / Live (Prod) |
|
|
69
|
+
| **문서** | https://stripe.com/docs/api |
|
|
70
|
+
|
|
71
|
+
### 2.2 지원 결제 수단
|
|
72
|
+
|
|
73
|
+
| 결제 수단 | 지원 | 비고 |
|
|
74
|
+
|---------|:----:|------|
|
|
75
|
+
| 신용카드 | ✅ | Visa, Master, Amex |
|
|
76
|
+
| 체크카드 | ✅ | |
|
|
77
|
+
| 계좌이체 | ✅ | 실시간 |
|
|
78
|
+
| 가상계좌 | ✅ | 무통장입금 |
|
|
79
|
+
| 간편결제 | ⚪ | 카카오페이, 네이버페이 |
|
|
80
|
+
|
|
81
|
+
### 2.3 API 엔드포인트
|
|
82
|
+
|
|
83
|
+
| 기능 | Method | Endpoint | 설명 |
|
|
84
|
+
|-----|--------|----------|------|
|
|
85
|
+
| 결제 생성 | POST | `/v1/payments` | 결제 의도 생성 |
|
|
86
|
+
| 결제 확인 | POST | `/v1/payments/{id}/confirm` | 결제 승인 |
|
|
87
|
+
| 결제 취소 | POST | `/v1/payments/{id}/cancel` | 전체/부분 취소 |
|
|
88
|
+
| 결제 조회 | GET | `/v1/payments/{id}` | 상태 조회 |
|
|
89
|
+
| 환불 요청 | POST | `/v1/refunds` | 환불 처리 |
|
|
90
|
+
|
|
91
|
+
### 2.4 Webhook 이벤트
|
|
92
|
+
|
|
93
|
+
| 이벤트 | 트리거 | 처리 |
|
|
94
|
+
|-------|-------|------|
|
|
95
|
+
| `payment.success` | 결제 성공 | 주문 상태 업데이트 |
|
|
96
|
+
| `payment.failed` | 결제 실패 | 알림 발송, 재시도 |
|
|
97
|
+
| `payment.refunded` | 환불 완료 | 재고 복원 |
|
|
98
|
+
| `payment.disputed` | 분쟁 발생 | 관리자 알림 |
|
|
99
|
+
|
|
100
|
+
### 2.5 에러 처리
|
|
101
|
+
|
|
102
|
+
| 에러 코드 | 설명 | 대응 |
|
|
103
|
+
|----------|------|------|
|
|
104
|
+
| `card_declined` | 카드 거절 | 다른 결제 수단 안내 |
|
|
105
|
+
| `insufficient_funds` | 잔액 부족 | 금액 확인 안내 |
|
|
106
|
+
| `expired_card` | 만료된 카드 | 카드 정보 업데이트 |
|
|
107
|
+
| `processing_error` | 처리 오류 | 재시도 (3회) |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 3. 인증 연동 (OAuth)
|
|
112
|
+
|
|
113
|
+
### 3.1 지원 제공자
|
|
114
|
+
|
|
115
|
+
| 제공자 | Client ID | Scope | Callback URL |
|
|
116
|
+
|-------|-----------|-------|--------------|
|
|
117
|
+
| Google | `GOOGLE_CLIENT_ID` | email, profile | `/auth/google/callback` |
|
|
118
|
+
| Kakao | `KAKAO_CLIENT_ID` | profile, email | `/auth/kakao/callback` |
|
|
119
|
+
| Naver | `NAVER_CLIENT_ID` | name, email | `/auth/naver/callback` |
|
|
120
|
+
| Apple | `APPLE_CLIENT_ID` | name, email | `/auth/apple/callback` |
|
|
121
|
+
|
|
122
|
+
### 3.2 OAuth 플로우
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
┌──────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐
|
|
126
|
+
│Client│ │ Server │ │ Provider │ │ DB │
|
|
127
|
+
└──┬───┘ └────┬────┘ └────┬─────┘ └────┬─────┘
|
|
128
|
+
│ │ │ │
|
|
129
|
+
│ 1. Login │ │ │
|
|
130
|
+
│─────────────>│ │ │
|
|
131
|
+
│ │ │ │
|
|
132
|
+
│ 2. Redirect │ │ │
|
|
133
|
+
│<─────────────│ │ │
|
|
134
|
+
│ │ │ │
|
|
135
|
+
│ 3. Auth Request │ │
|
|
136
|
+
│─────────────────────────────>│ │
|
|
137
|
+
│ │ │ │
|
|
138
|
+
│ 4. Auth Code│ │ │
|
|
139
|
+
│<─────────────────────────────│ │
|
|
140
|
+
│ │ │ │
|
|
141
|
+
│ 5. Callback │ │ │
|
|
142
|
+
│─────────────>│ │ │
|
|
143
|
+
│ │ 6. Token Exchange │
|
|
144
|
+
│ │──────────────>│ │
|
|
145
|
+
│ │ │ │
|
|
146
|
+
│ │ 7. User Info │ │
|
|
147
|
+
│ │<──────────────│ │
|
|
148
|
+
│ │ │ │
|
|
149
|
+
│ │ 8. Create/Update User │
|
|
150
|
+
│ │────────────────────────────────>
|
|
151
|
+
│ │ │ │
|
|
152
|
+
│ 9. JWT │ │ │
|
|
153
|
+
│<─────────────│ │ │
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 3.3 사용자 매핑
|
|
157
|
+
|
|
158
|
+
| Provider 필드 | 내부 필드 | 비고 |
|
|
159
|
+
|--------------|----------|------|
|
|
160
|
+
| `sub` / `id` | `provider_id` | 고유 식별자 |
|
|
161
|
+
| `email` | `email` | 이메일 검증 필요 |
|
|
162
|
+
| `name` / `nickname` | `name` | |
|
|
163
|
+
| `picture` / `profile_image` | `avatar_url` | 선택적 |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 4. 이메일 연동
|
|
168
|
+
|
|
169
|
+
### 4.1 서비스 정보
|
|
170
|
+
|
|
171
|
+
| 항목 | 값 |
|
|
172
|
+
|-----|---|
|
|
173
|
+
| **제공사** | SendGrid |
|
|
174
|
+
| **API 버전** | v3 |
|
|
175
|
+
| **일일 한도** | 10,000 (Free), Unlimited (Paid) |
|
|
176
|
+
|
|
177
|
+
### 4.2 이메일 템플릿
|
|
178
|
+
|
|
179
|
+
| 템플릿 ID | 용도 | 트리거 |
|
|
180
|
+
|----------|------|--------|
|
|
181
|
+
| `welcome` | 회원가입 환영 | 가입 완료 |
|
|
182
|
+
| `verify-email` | 이메일 인증 | 가입/변경 요청 |
|
|
183
|
+
| `reset-password` | 비밀번호 재설정 | 재설정 요청 |
|
|
184
|
+
| `order-confirm` | 주문 확인 | 결제 완료 |
|
|
185
|
+
| `order-shipped` | 배송 알림 | 배송 시작 |
|
|
186
|
+
|
|
187
|
+
### 4.3 API 사용
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// 이메일 발송
|
|
191
|
+
interface SendEmailRequest {
|
|
192
|
+
to: string;
|
|
193
|
+
template_id: string;
|
|
194
|
+
dynamic_template_data: Record<string, any>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// POST /v3/mail/send
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 5. 파일 스토리지 연동
|
|
203
|
+
|
|
204
|
+
### 5.1 서비스 정보
|
|
205
|
+
|
|
206
|
+
| 항목 | 값 |
|
|
207
|
+
|-----|---|
|
|
208
|
+
| **제공사** | AWS S3 |
|
|
209
|
+
| **리전** | ap-northeast-2 |
|
|
210
|
+
| **버킷** | `{{PROJECT_NAME}}-{env}` |
|
|
211
|
+
|
|
212
|
+
### 5.2 폴더 구조
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
s3://{{PROJECT_NAME}}-prod/
|
|
216
|
+
├── uploads/ # 사용자 업로드
|
|
217
|
+
│ ├── images/
|
|
218
|
+
│ ├── documents/
|
|
219
|
+
│ └── temp/
|
|
220
|
+
├── assets/ # 정적 자산
|
|
221
|
+
│ ├── images/
|
|
222
|
+
│ └── fonts/
|
|
223
|
+
└── backups/ # 백업
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 5.3 업로드 정책
|
|
227
|
+
|
|
228
|
+
| 항목 | 값 |
|
|
229
|
+
|-----|---|
|
|
230
|
+
| 최대 파일 크기 | 10MB (이미지), 50MB (문서) |
|
|
231
|
+
| 허용 형식 | jpg, png, gif, pdf, docx, xlsx |
|
|
232
|
+
| 업로드 방식 | Pre-signed URL |
|
|
233
|
+
| 만료 시간 | 15분 |
|
|
234
|
+
|
|
235
|
+
### 5.4 Pre-signed URL 플로우
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
┌──────┐ ┌─────────┐ ┌─────────┐
|
|
239
|
+
│Client│ │ Server │ │ S3 │
|
|
240
|
+
└──┬───┘ └────┬────┘ └────┬────┘
|
|
241
|
+
│ │ │
|
|
242
|
+
│ 1. Request URL │
|
|
243
|
+
│─────────────>│ │
|
|
244
|
+
│ │ │
|
|
245
|
+
│ │ 2. Generate │
|
|
246
|
+
│ │ Pre-signed │
|
|
247
|
+
│ │ │
|
|
248
|
+
│ 3. Return URL│ │
|
|
249
|
+
│<─────────────│ │
|
|
250
|
+
│ │ │
|
|
251
|
+
│ 4. Direct Upload │
|
|
252
|
+
│─────────────────────────────>│
|
|
253
|
+
│ │ │
|
|
254
|
+
│ 5. Upload Complete │
|
|
255
|
+
│<─────────────────────────────│
|
|
256
|
+
│ │ │
|
|
257
|
+
│ 6. Confirm │ │
|
|
258
|
+
│─────────────>│ │
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 6. Webhook 수신
|
|
264
|
+
|
|
265
|
+
### 6.1 공통 설정
|
|
266
|
+
|
|
267
|
+
| 항목 | 값 |
|
|
268
|
+
|-----|---|
|
|
269
|
+
| 엔드포인트 | `/webhooks/{provider}` |
|
|
270
|
+
| 인증 | Signature 검증 |
|
|
271
|
+
| 재시도 | 3회 (exponential backoff) |
|
|
272
|
+
| 타임아웃 | 30초 |
|
|
273
|
+
|
|
274
|
+
### 6.2 Webhook 보안
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// Signature 검증 예시 (Stripe)
|
|
278
|
+
function verifyWebhook(payload: string, signature: string): boolean {
|
|
279
|
+
const expectedSig = crypto
|
|
280
|
+
.createHmac('sha256', process.env.WEBHOOK_SECRET)
|
|
281
|
+
.update(payload)
|
|
282
|
+
.digest('hex');
|
|
283
|
+
|
|
284
|
+
return crypto.timingSafeEqual(
|
|
285
|
+
Buffer.from(signature),
|
|
286
|
+
Buffer.from(expectedSig)
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 6.3 멱등성 처리
|
|
292
|
+
|
|
293
|
+
| 처리 | 설명 |
|
|
294
|
+
|-----|------|
|
|
295
|
+
| Event ID 저장 | DB에 처리된 이벤트 기록 |
|
|
296
|
+
| 중복 체크 | 동일 ID 재수신 시 무시 |
|
|
297
|
+
| 순서 보장 | timestamp 기반 처리 |
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 7. 모니터링/분석 연동
|
|
302
|
+
|
|
303
|
+
### 7.1 에러 추적 (Sentry)
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
// 초기화
|
|
307
|
+
Sentry.init({
|
|
308
|
+
dsn: process.env.SENTRY_DSN,
|
|
309
|
+
environment: process.env.NODE_ENV,
|
|
310
|
+
tracesSampleRate: 0.1,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// 에러 캡처
|
|
314
|
+
Sentry.captureException(error, {
|
|
315
|
+
tags: { module: 'payment' },
|
|
316
|
+
extra: { orderId: order.id },
|
|
317
|
+
});
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 7.2 분석 (Amplitude)
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
// 이벤트 추적
|
|
324
|
+
amplitude.track('purchase_completed', {
|
|
325
|
+
order_id: order.id,
|
|
326
|
+
amount: order.total,
|
|
327
|
+
items: order.items.length,
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 8. Rate Limiting & 재시도
|
|
334
|
+
|
|
335
|
+
### 8.1 제공사별 한도
|
|
336
|
+
|
|
337
|
+
| 서비스 | Rate Limit | 초과 시 |
|
|
338
|
+
|-------|-----------|---------|
|
|
339
|
+
| Stripe | 100 req/s | 429 + Retry-After |
|
|
340
|
+
| SendGrid | 600 req/min | 429 |
|
|
341
|
+
| S3 | 3,500 PUT/s | 503 |
|
|
342
|
+
|
|
343
|
+
### 8.2 재시도 전략
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
const retryConfig = {
|
|
347
|
+
maxRetries: 3,
|
|
348
|
+
baseDelay: 1000, // 1초
|
|
349
|
+
maxDelay: 30000, // 30초
|
|
350
|
+
factor: 2, // exponential
|
|
351
|
+
retryableErrors: [429, 500, 502, 503, 504],
|
|
352
|
+
};
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## 9. 테스트 전략
|
|
358
|
+
|
|
359
|
+
### 9.1 환경별 설정
|
|
360
|
+
|
|
361
|
+
| 환경 | 연동 방식 |
|
|
362
|
+
|-----|----------|
|
|
363
|
+
| Unit Test | Mock 사용 |
|
|
364
|
+
| Integration | Sandbox API |
|
|
365
|
+
| Staging | Sandbox API |
|
|
366
|
+
| Production | Live API |
|
|
367
|
+
|
|
368
|
+
### 9.2 테스트 데이터
|
|
369
|
+
|
|
370
|
+
| 서비스 | 테스트 데이터 |
|
|
371
|
+
|-------|-------------|
|
|
372
|
+
| Stripe | `4242 4242 4242 4242` (성공) |
|
|
373
|
+
| Stripe | `4000 0000 0000 0002` (거절) |
|
|
374
|
+
| OAuth | 테스트 계정 사용 |
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 10. 관련 문서
|
|
379
|
+
|
|
380
|
+
- [API 명세](./service-spec.md) - 내부 API
|
|
381
|
+
- [환경 설정](./env-config.md) - API 키 관리
|
|
382
|
+
- [에러 코드](./error-codes.md) - 에러 정의
|
|
383
|
+
- [보안 명세](./security-spec.md) - 인증/암호화
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 변경 이력
|
|
388
|
+
|
|
389
|
+
| 버전 | 날짜 | 작성자 | 변경 내용 |
|
|
390
|
+
|------|------|--------|----------|
|
|
391
|
+
| 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# {PROJECT_NAME} 기획서
|
|
2
|
+
|
|
3
|
+
**Version**: 1.0
|
|
4
|
+
**Created**: {DATE}
|
|
5
|
+
**PRD Reference**: [prd.md](./prd.md)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 프로젝트 개요
|
|
10
|
+
|
|
11
|
+
### 1.1 요약
|
|
12
|
+
PRD에서 정의한 목표를 달성하기 위한 실행 계획.
|
|
13
|
+
|
|
14
|
+
### 1.2 범위
|
|
15
|
+
- **In Scope**:
|
|
16
|
+
- **Out of Scope**:
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. 마일스톤
|
|
21
|
+
|
|
22
|
+
| Phase | 목표 | 산출물 | 완료 기준 |
|
|
23
|
+
|-------|-----|--------|----------|
|
|
24
|
+
| Phase 1 | | | |
|
|
25
|
+
| Phase 2 | | | |
|
|
26
|
+
| Phase 3 | | | |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 3. 기술 스택
|
|
31
|
+
|
|
32
|
+
### 3.1 Frontend
|
|
33
|
+
| 기술 | 용도 | 선택 이유 |
|
|
34
|
+
|-----|------|----------|
|
|
35
|
+
| | | |
|
|
36
|
+
|
|
37
|
+
### 3.2 Backend
|
|
38
|
+
| 기술 | 용도 | 선택 이유 |
|
|
39
|
+
|-----|------|----------|
|
|
40
|
+
| | | |
|
|
41
|
+
|
|
42
|
+
### 3.3 Infrastructure
|
|
43
|
+
| 기술 | 용도 | 선택 이유 |
|
|
44
|
+
|-----|------|----------|
|
|
45
|
+
| | | |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 4. 아키텍처 개요
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
[아키텍처 다이어그램]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4.1 주요 컴포넌트
|
|
56
|
+
| 컴포넌트 | 역할 | 기술 |
|
|
57
|
+
|---------|-----|-----|
|
|
58
|
+
| | | |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 5. 팀 구성
|
|
63
|
+
|
|
64
|
+
| 역할 | 담당 | 책임 |
|
|
65
|
+
|-----|-----|-----|
|
|
66
|
+
| | | |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 6. 의존성
|
|
71
|
+
|
|
72
|
+
### 6.1 외부 의존성
|
|
73
|
+
| 서비스/API | 용도 | 대안 |
|
|
74
|
+
|-----------|-----|-----|
|
|
75
|
+
| | | |
|
|
76
|
+
|
|
77
|
+
### 6.2 내부 의존성
|
|
78
|
+
-
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 7. 리스크 관리
|
|
83
|
+
|
|
84
|
+
| 리스크 | 확률 | 영향 | 대응 계획 |
|
|
85
|
+
|-------|-----|-----|----------|
|
|
86
|
+
| | | | |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 8. 변경 이력
|
|
91
|
+
|
|
92
|
+
| 버전 | 날짜 | 변경 내용 | 작성자 |
|
|
93
|
+
|-----|-----|----------|-------|
|
|
94
|
+
| 1.0 | {DATE} | 최초 작성 | |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# {PROJECT_NAME} PRD
|
|
2
|
+
|
|
3
|
+
**Version**: 1.0
|
|
4
|
+
**Created**: {DATE}
|
|
5
|
+
**Author**:
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 개요
|
|
10
|
+
|
|
11
|
+
### 1.1 한 줄 정의
|
|
12
|
+
>
|
|
13
|
+
|
|
14
|
+
### 1.2 배경
|
|
15
|
+
왜 이 프로젝트가 필요한가?
|
|
16
|
+
|
|
17
|
+
### 1.3 목표
|
|
18
|
+
- **Primary**:
|
|
19
|
+
- **Secondary**:
|
|
20
|
+
|
|
21
|
+
### 1.4 비목표 (Non-Goals)
|
|
22
|
+
이 프로젝트에서 하지 않을 것:
|
|
23
|
+
-
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. 타겟 사용자
|
|
28
|
+
|
|
29
|
+
### 2.1 Primary User
|
|
30
|
+
- **Who**:
|
|
31
|
+
- **Pain Point**:
|
|
32
|
+
- **Need**:
|
|
33
|
+
|
|
34
|
+
### 2.2 Secondary User
|
|
35
|
+
- **Who**:
|
|
36
|
+
- **Pain Point**:
|
|
37
|
+
- **Need**:
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 3. 핵심 기능
|
|
42
|
+
|
|
43
|
+
### 3.1 Must Have (P0)
|
|
44
|
+
| 기능 | 설명 | 성공 기준 |
|
|
45
|
+
|-----|------|----------|
|
|
46
|
+
| | | |
|
|
47
|
+
|
|
48
|
+
### 3.2 Should Have (P1)
|
|
49
|
+
| 기능 | 설명 | 성공 기준 |
|
|
50
|
+
|-----|------|----------|
|
|
51
|
+
| | | |
|
|
52
|
+
|
|
53
|
+
### 3.3 Nice to Have (P2)
|
|
54
|
+
| 기능 | 설명 |
|
|
55
|
+
|-----|------|
|
|
56
|
+
| | |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 4. 성공 지표
|
|
61
|
+
|
|
62
|
+
### 4.1 정량적 지표
|
|
63
|
+
| 지표 | 목표 | 측정 방법 |
|
|
64
|
+
|-----|------|----------|
|
|
65
|
+
| | | |
|
|
66
|
+
|
|
67
|
+
### 4.2 정성적 지표
|
|
68
|
+
-
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 5. 제약사항
|
|
73
|
+
|
|
74
|
+
### 5.1 기술적 제약
|
|
75
|
+
-
|
|
76
|
+
|
|
77
|
+
### 5.2 비즈니스 제약
|
|
78
|
+
-
|
|
79
|
+
|
|
80
|
+
### 5.3 일정
|
|
81
|
+
- **시작**:
|
|
82
|
+
- **목표 완료**:
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 6. 리스크
|
|
87
|
+
|
|
88
|
+
| 리스크 | 영향 | 대응 |
|
|
89
|
+
|-------|-----|-----|
|
|
90
|
+
| | | |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 7. 참고
|
|
95
|
+
|
|
96
|
+
### 7.1 관련 문서
|
|
97
|
+
-
|
|
98
|
+
|
|
99
|
+
### 7.2 용어 정의
|
|
100
|
+
| 용어 | 정의 |
|
|
101
|
+
|-----|------|
|
|
102
|
+
| | |
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# {PROJECT_NAME} 요건 정의서
|
|
2
|
+
|
|
3
|
+
**Version**: 1.0
|
|
4
|
+
**Created**: {DATE}
|
|
5
|
+
**PRD Reference**: [prd.md](./prd.md)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 기능 요건 (Functional Requirements)
|
|
10
|
+
|
|
11
|
+
### 1.1 사용자 인증
|
|
12
|
+
|
|
13
|
+
| ID | 요건 | 우선순위 | 상태 |
|
|
14
|
+
|----|-----|:--------:|:----:|
|
|
15
|
+
| FR-AUTH-001 | | P0 | 🔲 |
|
|
16
|
+
| FR-AUTH-002 | | P0 | 🔲 |
|
|
17
|
+
|
|
18
|
+
### 1.2 핵심 기능
|
|
19
|
+
|
|
20
|
+
| ID | 요건 | 우선순위 | 상태 |
|
|
21
|
+
|----|-----|:--------:|:----:|
|
|
22
|
+
| FR-CORE-001 | | P0 | 🔲 |
|
|
23
|
+
| FR-CORE-002 | | P1 | 🔲 |
|
|
24
|
+
|
|
25
|
+
### 1.3 관리 기능
|
|
26
|
+
|
|
27
|
+
| ID | 요건 | 우선순위 | 상태 |
|
|
28
|
+
|----|-----|:--------:|:----:|
|
|
29
|
+
| FR-ADMIN-001 | | P1 | 🔲 |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. 비기능 요건 (Non-Functional Requirements)
|
|
34
|
+
|
|
35
|
+
### 2.1 성능
|
|
36
|
+
|
|
37
|
+
| ID | 요건 | 목표치 | 측정 방법 |
|
|
38
|
+
|----|-----|-------|----------|
|
|
39
|
+
| NFR-PERF-001 | API 응답 시간 | < 200ms (p95) | APM |
|
|
40
|
+
| NFR-PERF-002 | 동시 사용자 | 1,000명 | 부하 테스트 |
|
|
41
|
+
|
|
42
|
+
### 2.2 가용성
|
|
43
|
+
|
|
44
|
+
| ID | 요건 | 목표치 |
|
|
45
|
+
|----|-----|-------|
|
|
46
|
+
| NFR-AVAIL-001 | 서비스 가용성 | 99.9% |
|
|
47
|
+
| NFR-AVAIL-002 | RTO (복구 시간) | < 1시간 |
|
|
48
|
+
|
|
49
|
+
### 2.3 보안
|
|
50
|
+
|
|
51
|
+
| ID | 요건 | 상세 |
|
|
52
|
+
|----|-----|-----|
|
|
53
|
+
| NFR-SEC-001 | 인증 | JWT/세션 기반 |
|
|
54
|
+
| NFR-SEC-002 | 암호화 | TLS 1.3, AES-256 |
|
|
55
|
+
| NFR-SEC-003 | 데이터 보호 | 개인정보 암호화 저장 |
|
|
56
|
+
|
|
57
|
+
### 2.4 확장성
|
|
58
|
+
|
|
59
|
+
| ID | 요건 | 상세 |
|
|
60
|
+
|----|-----|-----|
|
|
61
|
+
| NFR-SCALE-001 | 수평 확장 | 컨테이너 기반 오토스케일 |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. 제약 조건
|
|
66
|
+
|
|
67
|
+
### 3.1 기술적 제약
|
|
68
|
+
-
|
|
69
|
+
|
|
70
|
+
### 3.2 환경 제약
|
|
71
|
+
-
|
|
72
|
+
|
|
73
|
+
### 3.3 규제/컴플라이언스
|
|
74
|
+
-
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 4. 인터페이스 요건
|
|
79
|
+
|
|
80
|
+
### 4.1 사용자 인터페이스
|
|
81
|
+
-
|
|
82
|
+
|
|
83
|
+
### 4.2 외부 시스템 인터페이스
|
|
84
|
+
| 시스템 | 연동 방식 | 목적 |
|
|
85
|
+
|-------|---------|-----|
|
|
86
|
+
| | | |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 5. 데이터 요건
|
|
91
|
+
|
|
92
|
+
### 5.1 데이터 저장
|
|
93
|
+
-
|
|
94
|
+
|
|
95
|
+
### 5.2 데이터 보존
|
|
96
|
+
| 데이터 유형 | 보존 기간 | 삭제 정책 |
|
|
97
|
+
|-----------|---------|----------|
|
|
98
|
+
| | | |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 6. 상태 범례
|
|
103
|
+
|
|
104
|
+
| 상태 | 의미 |
|
|
105
|
+
|-----|------|
|
|
106
|
+
| 🔲 | 미착수 |
|
|
107
|
+
| 🔄 | 진행중 |
|
|
108
|
+
| ✅ | 완료 |
|
|
109
|
+
| ❌ | 취소/제외 |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 7. 변경 이력
|
|
114
|
+
|
|
115
|
+
| 버전 | 날짜 | 변경 내용 | 작성자 |
|
|
116
|
+
|-----|-----|----------|-------|
|
|
117
|
+
| 1.0 | {DATE} | 최초 작성 | |
|