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.
Files changed (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/bin/tsq.js +6 -0
  4. package/dist/commands/feedback.d.ts +3 -0
  5. package/dist/commands/feedback.d.ts.map +1 -0
  6. package/dist/commands/feedback.js +142 -0
  7. package/dist/commands/feedback.js.map +1 -0
  8. package/dist/commands/full.d.ts +3 -0
  9. package/dist/commands/full.d.ts.map +1 -0
  10. package/dist/commands/full.js +87 -0
  11. package/dist/commands/full.js.map +1 -0
  12. package/dist/commands/git/commit.d.ts +3 -0
  13. package/dist/commands/git/commit.d.ts.map +1 -0
  14. package/dist/commands/git/commit.js +88 -0
  15. package/dist/commands/git/commit.js.map +1 -0
  16. package/dist/commands/git/index.d.ts +5 -0
  17. package/dist/commands/git/index.d.ts.map +1 -0
  18. package/dist/commands/git/index.js +5 -0
  19. package/dist/commands/git/index.js.map +1 -0
  20. package/dist/commands/git/pr.d.ts +3 -0
  21. package/dist/commands/git/pr.d.ts.map +1 -0
  22. package/dist/commands/git/pr.js +138 -0
  23. package/dist/commands/git/pr.js.map +1 -0
  24. package/dist/commands/git/release.d.ts +3 -0
  25. package/dist/commands/git/release.d.ts.map +1 -0
  26. package/dist/commands/git/release.js +158 -0
  27. package/dist/commands/git/release.js.map +1 -0
  28. package/dist/commands/git/sync.d.ts +3 -0
  29. package/dist/commands/git/sync.d.ts.map +1 -0
  30. package/dist/commands/git/sync.js +132 -0
  31. package/dist/commands/git/sync.js.map +1 -0
  32. package/dist/commands/init.d.ts +3 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +150 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/log.d.ts +3 -0
  37. package/dist/commands/log.d.ts.map +1 -0
  38. package/dist/commands/log.js +271 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/metrics.d.ts +3 -0
  41. package/dist/commands/metrics.d.ts.map +1 -0
  42. package/dist/commands/metrics.js +299 -0
  43. package/dist/commands/metrics.js.map +1 -0
  44. package/dist/commands/quick.d.ts +3 -0
  45. package/dist/commands/quick.d.ts.map +1 -0
  46. package/dist/commands/quick.js +136 -0
  47. package/dist/commands/quick.js.map +1 -0
  48. package/dist/commands/retro.d.ts +3 -0
  49. package/dist/commands/retro.d.ts.map +1 -0
  50. package/dist/commands/retro.js +280 -0
  51. package/dist/commands/retro.js.map +1 -0
  52. package/dist/commands/status.d.ts +3 -0
  53. package/dist/commands/status.d.ts.map +1 -0
  54. package/dist/commands/status.js +127 -0
  55. package/dist/commands/status.js.map +1 -0
  56. package/dist/commands/watch.d.ts +3 -0
  57. package/dist/commands/watch.d.ts.map +1 -0
  58. package/dist/commands/watch.js +213 -0
  59. package/dist/commands/watch.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +50 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/config.d.ts +34 -0
  65. package/dist/lib/config.d.ts.map +1 -0
  66. package/dist/lib/config.js +108 -0
  67. package/dist/lib/config.js.map +1 -0
  68. package/dist/lib/project.d.ts +47 -0
  69. package/dist/lib/project.d.ts.map +1 -0
  70. package/dist/lib/project.js +191 -0
  71. package/dist/lib/project.js.map +1 -0
  72. package/dist/lib/template.d.ts +33 -0
  73. package/dist/lib/template.d.ts.map +1 -0
  74. package/dist/lib/template.js +151 -0
  75. package/dist/lib/template.js.map +1 -0
  76. package/dist/types/config.d.ts +75 -0
  77. package/dist/types/config.d.ts.map +1 -0
  78. package/dist/types/config.js +66 -0
  79. package/dist/types/config.js.map +1 -0
  80. package/dist/types/feedback.d.ts +59 -0
  81. package/dist/types/feedback.d.ts.map +1 -0
  82. package/dist/types/feedback.js +26 -0
  83. package/dist/types/feedback.js.map +1 -0
  84. package/dist/types/index.d.ts +4 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +5 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/project.d.ts +89 -0
  89. package/dist/types/project.d.ts.map +1 -0
  90. package/dist/types/project.js +44 -0
  91. package/dist/types/project.js.map +1 -0
  92. package/dist/utils/colors.d.ts +30 -0
  93. package/dist/utils/colors.d.ts.map +1 -0
  94. package/dist/utils/colors.js +54 -0
  95. package/dist/utils/colors.js.map +1 -0
  96. package/dist/utils/date.d.ts +25 -0
  97. package/dist/utils/date.d.ts.map +1 -0
  98. package/dist/utils/date.js +65 -0
  99. package/dist/utils/date.js.map +1 -0
  100. package/dist/utils/fs.d.ts +49 -0
  101. package/dist/utils/fs.d.ts.map +1 -0
  102. package/dist/utils/fs.js +84 -0
  103. package/dist/utils/fs.js.map +1 -0
  104. package/dist/utils/prompts.d.ts +31 -0
  105. package/dist/utils/prompts.d.ts.map +1 -0
  106. package/dist/utils/prompts.js +95 -0
  107. package/dist/utils/prompts.js.map +1 -0
  108. package/dist/utils/yaml.d.ts +21 -0
  109. package/dist/utils/yaml.d.ts.map +1 -0
  110. package/dist/utils/yaml.js +40 -0
  111. package/dist/utils/yaml.js.map +1 -0
  112. package/package.json +71 -0
  113. package/templates/common/CLAUDE.md.template +254 -0
  114. package/templates/common/claude/agents/tsq-dba.md +290 -0
  115. package/templates/common/claude/agents/tsq-designer.md +304 -0
  116. package/templates/common/claude/agents/tsq-developer.md +118 -0
  117. package/templates/common/claude/agents/tsq-planner.md +90 -0
  118. package/templates/common/claude/agents/tsq-prompter.md +336 -0
  119. package/templates/common/claude/agents/tsq-qa.md +134 -0
  120. package/templates/common/claude/agents/tsq-retro.md +168 -0
  121. package/templates/common/claude/agents/tsq-security.md +190 -0
  122. package/templates/common/claude/skills/architecture/SKILL.md +123 -0
  123. package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
  124. package/templates/common/claude/skills/coding/SKILL.md +171 -0
  125. package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
  126. package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
  127. package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
  128. package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
  129. package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
  130. package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
  131. package/templates/common/claude/skills/planning/SKILL.md +90 -0
  132. package/templates/common/claude/skills/security/SKILL.md +234 -0
  133. package/templates/common/claude/skills/testing/SKILL.md +146 -0
  134. package/templates/common/claude/skills/typescript/SKILL.md +435 -0
  135. package/templates/common/config.template.yaml +131 -0
  136. package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
  137. package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
  138. package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
  139. package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
  140. package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
  141. package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
  142. package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
  143. package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
  144. package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
  145. package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
  146. package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
  147. package/templates/common/timsquad/generators/data-design.xml +290 -0
  148. package/templates/common/timsquad/generators/prd.xml +280 -0
  149. package/templates/common/timsquad/generators/requirements.xml +220 -0
  150. package/templates/common/timsquad/generators/service-spec.xml +266 -0
  151. package/templates/common/timsquad/logs/_example.md +81 -0
  152. package/templates/common/timsquad/logs/_template.md +46 -0
  153. package/templates/common/timsquad/patterns/cqrs.xml +127 -0
  154. package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
  155. package/templates/common/timsquad/patterns/repository.xml +64 -0
  156. package/templates/common/timsquad/process/state-machine.xml +343 -0
  157. package/templates/common/timsquad/process/validation-rules.xml +308 -0
  158. package/templates/common/timsquad/process/workflow-base.xml +202 -0
  159. package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
  160. package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
  161. package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
  162. package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
  163. package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
  164. package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
  165. package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
  166. package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
  167. package/templates/common/timsquad/ssot/data-design.template.md +132 -0
  168. package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
  169. package/templates/common/timsquad/ssot/env-config.template.md +346 -0
  170. package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
  171. package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
  172. package/templates/common/timsquad/ssot/glossary.template.md +148 -0
  173. package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
  174. package/templates/common/timsquad/ssot/planning.template.md +94 -0
  175. package/templates/common/timsquad/ssot/prd.template.md +102 -0
  176. package/templates/common/timsquad/ssot/requirements.template.md +117 -0
  177. package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
  178. package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
  179. package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
  180. package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
  181. package/templates/common/timsquad/state/workspace.xml +217 -0
@@ -0,0 +1,384 @@
1
+ ---
2
+ title: "배포 명세서 (Deployment 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
+ # 배포 명세서 (Deployment Specification)
12
+
13
+ > 인프라 아키텍처, CI/CD 파이프라인, 배포 환경을 정의합니다.
14
+ > Level 3 (Enterprise) 프로젝트 필수 문서입니다.
15
+
16
+ ---
17
+
18
+ ## 1. 인프라 개요
19
+
20
+ ### 1.1 아키텍처 다이어그램
21
+
22
+ ```
23
+ ┌─────────────┐
24
+ │ CDN │
25
+ │ (CloudFront)│
26
+ └──────┬──────┘
27
+
28
+ ┌──────▼──────┐
29
+ │ Load Balancer│
30
+ │ (ALB) │
31
+ └──────┬──────┘
32
+
33
+ ┌─────────────────┼─────────────────┐
34
+ │ │ │
35
+ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐
36
+ │ App #1 │ │ App #2 │ │ App #3 │
37
+ │(Container)│ │(Container)│ │(Container)│
38
+ └────┬────┘ └────┬────┘ └────┬────┘
39
+ │ │ │
40
+ └─────────────────┼─────────────────┘
41
+
42
+ ┌────────────┼────────────┐
43
+ │ │ │
44
+ ┌────▼────┐ ┌───▼────┐ ┌───▼────┐
45
+ │ DB │ │ Redis │ │ S3 │
46
+ │ (RDS) │ │(Cache) │ │(Storage)│
47
+ └─────────┘ └────────┘ └────────┘
48
+ ```
49
+
50
+ ### 1.2 환경 구성
51
+
52
+ | 환경 | 용도 | URL | 인프라 |
53
+ |-----|------|-----|--------|
54
+ | Development | 개발 | dev.example.com | 단일 인스턴스 |
55
+ | Staging | QA/테스트 | staging.example.com | Production 유사 |
56
+ | Production | 서비스 운영 | example.com | 고가용성 |
57
+
58
+ ---
59
+
60
+ ## 2. 클라우드 리소스
61
+
62
+ ### 2.1 컴퓨팅
63
+
64
+ | 리소스 | 서비스 | 사양 | 환경별 수량 |
65
+ |-------|-------|------|-----------|
66
+ | 애플리케이션 | ECS Fargate | 0.5 vCPU, 1GB | Dev:1, Stg:2, Prod:3+ |
67
+ | 배치 작업 | Lambda | 256MB | 필요 시 |
68
+
69
+ ### 2.2 데이터베이스
70
+
71
+ | 리소스 | 서비스 | 사양 | 백업 |
72
+ |-------|-------|------|------|
73
+ | Primary DB | RDS PostgreSQL | db.t3.medium | 7일 |
74
+ | Read Replica | RDS (Prod만) | db.t3.medium | - |
75
+ | Cache | ElastiCache Redis | cache.t3.micro | - |
76
+
77
+ ### 2.3 스토리지
78
+
79
+ | 리소스 | 서비스 | 용도 |
80
+ |-------|-------|------|
81
+ | 정적 파일 | S3 | 이미지, 파일 업로드 |
82
+ | 로그 | S3 + CloudWatch | 애플리케이션 로그 |
83
+ | 백업 | S3 Glacier | DB 백업 장기 보관 |
84
+
85
+ ### 2.4 네트워크
86
+
87
+ | 리소스 | 서비스 | 설정 |
88
+ |-------|-------|------|
89
+ | VPC | VPC | 10.0.0.0/16 |
90
+ | Public Subnet | 2개 AZ | 10.0.1.0/24, 10.0.2.0/24 |
91
+ | Private Subnet | 2개 AZ | 10.0.10.0/24, 10.0.20.0/24 |
92
+ | NAT Gateway | 각 AZ | 아웃바운드 트래픽 |
93
+ | Security Group | 서비스별 | 최소 권한 |
94
+
95
+ ---
96
+
97
+ ## 3. CI/CD 파이프라인
98
+
99
+ ### 3.1 파이프라인 개요
100
+
101
+ ```
102
+ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
103
+ │ Push │ → │ Build │ → │ Test │ → │ Deploy │ → │ Verify │
104
+ │ (Main) │ │ (Docker)│ │ (Auto) │ │ (Auto) │ │ (Smoke) │
105
+ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
106
+ ```
107
+
108
+ ### 3.2 브랜치 전략
109
+
110
+ | 브랜치 | 용도 | 배포 환경 | 자동 배포 |
111
+ |-------|------|----------|:--------:|
112
+ | `main` | 프로덕션 릴리스 | Production | ❌ (승인 필요) |
113
+ | `develop` | 개발 통합 | Staging | ✅ |
114
+ | `feature/*` | 기능 개발 | - | ❌ |
115
+ | `hotfix/*` | 긴급 수정 | Production | ❌ (승인 필요) |
116
+
117
+ ### 3.3 배포 단계
118
+
119
+ ```yaml
120
+ # .github/workflows/deploy.yml
121
+ name: Deploy
122
+
123
+ on:
124
+ push:
125
+ branches: [main, develop]
126
+
127
+ jobs:
128
+ build:
129
+ runs-on: ubuntu-latest
130
+ steps:
131
+ - name: Checkout
132
+ uses: actions/checkout@v4
133
+
134
+ - name: Build & Push Docker
135
+ run: |
136
+ docker build -t $IMAGE_NAME .
137
+ docker push $IMAGE_NAME
138
+
139
+ test:
140
+ needs: build
141
+ steps:
142
+ - name: Unit Tests
143
+ run: npm test
144
+
145
+ - name: Integration Tests
146
+ run: npm run test:integration
147
+
148
+ - name: Security Scan
149
+ run: npm audit
150
+
151
+ deploy-staging:
152
+ needs: test
153
+ if: github.ref == 'refs/heads/develop'
154
+ steps:
155
+ - name: Deploy to Staging
156
+ run: ./deploy.sh staging
157
+
158
+ deploy-production:
159
+ needs: test
160
+ if: github.ref == 'refs/heads/main'
161
+ environment: production # 승인 필요
162
+ steps:
163
+ - name: Deploy to Production
164
+ run: ./deploy.sh production
165
+
166
+ verify:
167
+ needs: [deploy-staging, deploy-production]
168
+ steps:
169
+ - name: Smoke Test
170
+ run: ./smoke-test.sh
171
+ ```
172
+
173
+ ### 3.4 롤백 전략
174
+
175
+ | 상황 | 롤백 방식 | 소요 시간 |
176
+ |-----|----------|:--------:|
177
+ | 배포 실패 | 자동 롤백 (이전 버전) | < 5분 |
178
+ | 버그 발견 | 수동 롤백 | < 10분 |
179
+ | 긴급 상황 | Blue-Green 스위칭 | < 1분 |
180
+
181
+ ---
182
+
183
+ ## 4. 컨테이너 설정
184
+
185
+ ### 4.1 Dockerfile
186
+
187
+ ```dockerfile
188
+ # Build stage
189
+ FROM node:20-alpine AS builder
190
+ WORKDIR /app
191
+ COPY package*.json ./
192
+ RUN npm ci --only=production
193
+ COPY . .
194
+ RUN npm run build
195
+
196
+ # Production stage
197
+ FROM node:20-alpine
198
+ WORKDIR /app
199
+ COPY --from=builder /app/dist ./dist
200
+ COPY --from=builder /app/node_modules ./node_modules
201
+ EXPOSE 3000
202
+ USER node
203
+ CMD ["node", "dist/main.js"]
204
+ ```
205
+
206
+ ### 4.2 컨테이너 설정
207
+
208
+ | 설정 | 값 | 비고 |
209
+ |-----|-----|------|
210
+ | Base Image | node:20-alpine | 보안 업데이트 유지 |
211
+ | Port | 3000 | 내부 포트 |
212
+ | User | node (non-root) | 보안 |
213
+ | Health Check | /health | 30초 간격 |
214
+
215
+ ### 4.3 리소스 제한
216
+
217
+ | 환경 | CPU | Memory | 최소/최대 인스턴스 |
218
+ |-----|:---:|:------:|:---------------:|
219
+ | Development | 0.25 | 512MB | 1/1 |
220
+ | Staging | 0.5 | 1GB | 1/2 |
221
+ | Production | 1.0 | 2GB | 2/10 |
222
+
223
+ ---
224
+
225
+ ## 5. 환경 변수
226
+
227
+ ### 5.1 환경 변수 목록
228
+
229
+ → [env-config.md](./env-config.md) 참조
230
+
231
+ | 변수 | 설명 | 시크릿 | 환경별 |
232
+ |-----|------|:------:|:------:|
233
+ | NODE_ENV | 실행 환경 | ❌ | ✅ |
234
+ | DATABASE_URL | DB 연결 문자열 | ✅ | ✅ |
235
+ | JWT_SECRET | JWT 서명 키 | ✅ | ✅ |
236
+ | REDIS_URL | Redis 연결 | ✅ | ✅ |
237
+ | AWS_REGION | AWS 리전 | ❌ | ❌ |
238
+
239
+ ### 5.2 시크릿 관리
240
+
241
+ | 관리 도구 | 용도 |
242
+ |----------|------|
243
+ | AWS Secrets Manager | 데이터베이스 자격 증명 |
244
+ | GitHub Secrets | CI/CD 환경 변수 |
245
+ | AWS Parameter Store | 애플리케이션 설정 |
246
+
247
+ ---
248
+
249
+ ## 6. 모니터링
250
+
251
+ ### 6.1 메트릭
252
+
253
+ | 메트릭 | 도구 | 알림 조건 |
254
+ |-------|------|----------|
255
+ | CPU 사용률 | CloudWatch | > 80% (5분) |
256
+ | Memory 사용률 | CloudWatch | > 85% (5분) |
257
+ | 응답 시간 (P95) | CloudWatch | > 500ms |
258
+ | 에러율 | CloudWatch | > 1% |
259
+ | 4xx/5xx 응답 | ALB Metrics | > 10/분 |
260
+
261
+ ### 6.2 로깅
262
+
263
+ | 로그 유형 | 저장소 | 보존 기간 |
264
+ |---------|-------|----------|
265
+ | 애플리케이션 | CloudWatch Logs | 30일 |
266
+ | 액세스 로그 | S3 | 90일 |
267
+ | 에러 로그 | CloudWatch + 알림 | 90일 |
268
+ | 감사 로그 | S3 (Glacier) | 7년 |
269
+
270
+ ### 6.3 알림
271
+
272
+ | 채널 | 용도 | 대상 |
273
+ |-----|------|------|
274
+ | Slack | 일반 알림 | #alerts |
275
+ | PagerDuty | 긴급 알림 (P1) | On-call |
276
+ | Email | 일일 리포트 | 팀 전체 |
277
+
278
+ ---
279
+
280
+ ## 7. 스케일링
281
+
282
+ ### 7.1 Auto Scaling 정책
283
+
284
+ | 조건 | 액션 | 쿨다운 |
285
+ |-----|------|:------:|
286
+ | CPU > 70% (3분) | Scale Out (+1) | 300초 |
287
+ | CPU < 30% (10분) | Scale In (-1) | 300초 |
288
+ | Memory > 80% | Scale Out (+1) | 300초 |
289
+
290
+ ### 7.2 예상 트래픽
291
+
292
+ | 시간대 | 예상 RPS | 인스턴스 수 |
293
+ |-------|:-------:|:---------:|
294
+ | 평시 | 100 | 2 |
295
+ | 피크 (오후 2-6시) | 500 | 5 |
296
+ | 이벤트 | 1000+ | 10+ |
297
+
298
+ ---
299
+
300
+ ## 8. 재해 복구 (DR)
301
+
302
+ ### 8.1 RPO/RTO
303
+
304
+ | 메트릭 | 목표 | 전략 |
305
+ |-------|:----:|------|
306
+ | RPO (복구 시점 목표) | 1시간 | 시간별 백업 |
307
+ | RTO (복구 시간 목표) | 4시간 | 자동화된 복구 |
308
+
309
+ ### 8.2 백업 전략
310
+
311
+ | 대상 | 주기 | 보존 | 복구 테스트 |
312
+ |-----|------|------|-----------|
313
+ | DB 스냅샷 | 매일 | 7일 | 월간 |
314
+ | S3 데이터 | 실시간 (버전관리) | 30일 | 분기별 |
315
+ | 설정 파일 | 변경 시 (Git) | 영구 | - |
316
+
317
+ ### 8.3 Multi-AZ 구성
318
+
319
+ | 리소스 | AZ 분산 |
320
+ |-------|:------:|
321
+ | ECS Tasks | 2 AZ |
322
+ | RDS | 2 AZ (Multi-AZ) |
323
+ | ElastiCache | 2 AZ |
324
+ | ALB | 2 AZ |
325
+
326
+ ---
327
+
328
+ ## 9. 보안
329
+
330
+ ### 9.1 네트워크 보안
331
+
332
+ | 레이어 | 보안 설정 |
333
+ |-------|----------|
334
+ | Edge | CloudFront + WAF |
335
+ | ALB | HTTPS only, Security Group |
336
+ | Application | Private Subnet |
337
+ | Database | Private Subnet, 암호화 |
338
+
339
+ ### 9.2 접근 제어
340
+
341
+ | 리소스 | 접근 방식 |
342
+ |-------|----------|
343
+ | AWS Console | IAM + MFA 필수 |
344
+ | 서버 접속 | SSM Session Manager (SSH 없음) |
345
+ | DB 접속 | Bastion + IAM Auth |
346
+
347
+ ---
348
+
349
+ ## 10. 비용 최적화
350
+
351
+ ### 10.1 예상 비용 (월간)
352
+
353
+ | 리소스 | 예상 비용 | 비고 |
354
+ |-------|:--------:|------|
355
+ | ECS Fargate | $150 | 3 tasks 기준 |
356
+ | RDS | $100 | db.t3.medium |
357
+ | ElastiCache | $30 | cache.t3.micro |
358
+ | S3 + Transfer | $50 | 100GB 기준 |
359
+ | CloudWatch | $20 | 로그 + 메트릭 |
360
+ | **총계** | **$350** | |
361
+
362
+ ### 10.2 비용 절감 방안
363
+
364
+ | 방안 | 절감율 | 적용 |
365
+ |-----|:------:|------|
366
+ | Reserved Instance | 30-50% | 운영 안정 후 |
367
+ | Spot Instance (비운영) | 70-90% | Dev/Test |
368
+ | S3 Intelligent Tiering | 20% | 자동 |
369
+
370
+ ---
371
+
372
+ ## 11. 관련 문서
373
+
374
+ - [환경 설정](./env-config.md) - 환경 변수
375
+ - [보안 명세](./security-spec.md) - 보안 설정
376
+ - [테스트 명세](./test-spec.md) - CI/CD 테스트
377
+
378
+ ---
379
+
380
+ ## 변경 이력
381
+
382
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
383
+ |------|------|--------|----------|
384
+ | 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |
@@ -0,0 +1,346 @@
1
+ ---
2
+ title: "환경 설정 (Environment Configuration)"
3
+ version: 1.0.0
4
+ last_updated: {{DATE}}
5
+ author: tsq-planner
6
+ status: draft
7
+ project: {{PROJECT_NAME}}
8
+ ---
9
+
10
+ # 환경 설정 (Environment Configuration)
11
+
12
+ > 환경별 설정값, 환경변수, 시크릿 관리를 정의합니다.
13
+
14
+ ---
15
+
16
+ ## 1. 환경 개요
17
+
18
+ ### 1.1 환경 목록
19
+
20
+ | 환경 | 용도 | URL | 비고 |
21
+ |-----|------|-----|------|
22
+ | **local** | 로컬 개발 | localhost:3000 | 개인 개발 |
23
+ | **development** | 개발 서버 | dev.example.com | 통합 테스트 |
24
+ | **staging** | QA/테스트 | staging.example.com | Production 유사 |
25
+ | **production** | 서비스 운영 | example.com | 실서비스 |
26
+
27
+ ### 1.2 환경별 특성
28
+
29
+ | 특성 | Local | Development | Staging | Production |
30
+ |-----|:-----:|:-----------:|:-------:|:----------:|
31
+ | 디버그 모드 | ✅ | ✅ | ❌ | ❌ |
32
+ | 로그 레벨 | debug | debug | info | warn |
33
+ | 외부 API | Mock | Sandbox | Sandbox | Real |
34
+ | DB | Local | Shared | Dedicated | Dedicated |
35
+ | SSL | ❌ | ✅ | ✅ | ✅ |
36
+
37
+ ---
38
+
39
+ ## 2. 환경변수 목록
40
+
41
+ ### 2.1 애플리케이션 설정
42
+
43
+ | 변수명 | 설명 | 타입 | 필수 | 기본값 |
44
+ |-------|------|------|:----:|--------|
45
+ | `NODE_ENV` | 실행 환경 | string | ✅ | development |
46
+ | `PORT` | 서버 포트 | number | ❌ | 3000 |
47
+ | `HOST` | 호스트 주소 | string | ❌ | 0.0.0.0 |
48
+ | `API_VERSION` | API 버전 | string | ❌ | v1 |
49
+ | `LOG_LEVEL` | 로그 레벨 | enum | ❌ | info |
50
+ | `TZ` | 타임존 | string | ❌ | UTC |
51
+
52
+ ### 2.2 데이터베이스 설정
53
+
54
+ | 변수명 | 설명 | 타입 | 필수 | 시크릿 |
55
+ |-------|------|------|:----:|:------:|
56
+ | `DATABASE_URL` | DB 연결 문자열 | string | ✅ | ✅ |
57
+ | `DB_HOST` | DB 호스트 | string | ⚪ | ❌ |
58
+ | `DB_PORT` | DB 포트 | number | ⚪ | ❌ |
59
+ | `DB_NAME` | DB 이름 | string | ⚪ | ❌ |
60
+ | `DB_USER` | DB 사용자 | string | ⚪ | ✅ |
61
+ | `DB_PASSWORD` | DB 비밀번호 | string | ⚪ | ✅ |
62
+ | `DB_SSL` | SSL 사용 여부 | boolean | ❌ | ❌ |
63
+ | `DB_POOL_MIN` | 최소 커넥션 | number | ❌ | ❌ |
64
+ | `DB_POOL_MAX` | 최대 커넥션 | number | ❌ | ❌ |
65
+
66
+ > ⚪ = `DATABASE_URL` 사용 시 불필요
67
+
68
+ ### 2.3 캐시/세션 설정
69
+
70
+ | 변수명 | 설명 | 타입 | 필수 | 시크릿 |
71
+ |-------|------|------|:----:|:------:|
72
+ | `REDIS_URL` | Redis 연결 문자열 | string | ⚪ | ✅ |
73
+ | `REDIS_HOST` | Redis 호스트 | string | ⚪ | ❌ |
74
+ | `REDIS_PORT` | Redis 포트 | number | ❌ | ❌ |
75
+ | `REDIS_PASSWORD` | Redis 비밀번호 | string | ⚪ | ✅ |
76
+ | `SESSION_SECRET` | 세션 시크릿 | string | ✅ | ✅ |
77
+ | `SESSION_TTL` | 세션 만료 (초) | number | ❌ | ❌ |
78
+
79
+ ### 2.4 인증/보안 설정
80
+
81
+ | 변수명 | 설명 | 타입 | 필수 | 시크릿 |
82
+ |-------|------|------|:----:|:------:|
83
+ | `JWT_SECRET` | JWT 서명 키 | string | ✅ | ✅ |
84
+ | `JWT_EXPIRES_IN` | JWT 만료 시간 | string | ❌ | ❌ |
85
+ | `JWT_REFRESH_SECRET` | Refresh 토큰 키 | string | ⚪ | ✅ |
86
+ | `JWT_REFRESH_EXPIRES_IN` | Refresh 만료 | string | ❌ | ❌ |
87
+ | `BCRYPT_ROUNDS` | 해시 라운드 | number | ❌ | ❌ |
88
+ | `CORS_ORIGINS` | 허용 Origin | string | ❌ | ❌ |
89
+
90
+ ### 2.5 외부 서비스 설정
91
+
92
+ | 변수명 | 설명 | 타입 | 필수 | 시크릿 |
93
+ |-------|------|------|:----:|:------:|
94
+ | `AWS_REGION` | AWS 리전 | string | ⚪ | ❌ |
95
+ | `AWS_ACCESS_KEY_ID` | AWS 액세스 키 | string | ⚪ | ✅ |
96
+ | `AWS_SECRET_ACCESS_KEY` | AWS 시크릿 키 | string | ⚪ | ✅ |
97
+ | `S3_BUCKET` | S3 버킷명 | string | ⚪ | ❌ |
98
+ | `SMTP_HOST` | SMTP 서버 | string | ⚪ | ❌ |
99
+ | `SMTP_USER` | SMTP 사용자 | string | ⚪ | ✅ |
100
+ | `SMTP_PASSWORD` | SMTP 비밀번호 | string | ⚪ | ✅ |
101
+
102
+ ---
103
+
104
+ ## 3. 환경별 설정값
105
+
106
+ ### 3.1 Local
107
+
108
+ ```env
109
+ # .env.local
110
+ NODE_ENV=development
111
+ PORT=3000
112
+ LOG_LEVEL=debug
113
+
114
+ # Database (Local)
115
+ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/{{PROJECT_NAME}}_dev
116
+
117
+ # Redis (Local)
118
+ REDIS_URL=redis://localhost:6379
119
+
120
+ # Auth
121
+ JWT_SECRET=local-dev-secret-change-in-production
122
+ JWT_EXPIRES_IN=1d
123
+ SESSION_SECRET=local-session-secret
124
+
125
+ # 기타
126
+ CORS_ORIGINS=http://localhost:3000,http://localhost:3001
127
+ ```
128
+
129
+ ### 3.2 Development
130
+
131
+ ```env
132
+ # .env.development
133
+ NODE_ENV=development
134
+ PORT=3000
135
+ LOG_LEVEL=debug
136
+
137
+ # Database
138
+ DATABASE_URL=${DEV_DATABASE_URL}
139
+
140
+ # Redis
141
+ REDIS_URL=${DEV_REDIS_URL}
142
+
143
+ # Auth (시크릿 매니저에서 관리)
144
+ JWT_SECRET=${DEV_JWT_SECRET}
145
+ SESSION_SECRET=${DEV_SESSION_SECRET}
146
+
147
+ # External Services (Sandbox)
148
+ AWS_REGION=ap-northeast-2
149
+ ```
150
+
151
+ ### 3.3 Staging
152
+
153
+ ```env
154
+ # .env.staging
155
+ NODE_ENV=staging
156
+ PORT=3000
157
+ LOG_LEVEL=info
158
+
159
+ # Database
160
+ DATABASE_URL=${STAGING_DATABASE_URL}
161
+
162
+ # Redis
163
+ REDIS_URL=${STAGING_REDIS_URL}
164
+
165
+ # Auth
166
+ JWT_SECRET=${STAGING_JWT_SECRET}
167
+ SESSION_SECRET=${STAGING_SESSION_SECRET}
168
+
169
+ # External Services
170
+ AWS_REGION=ap-northeast-2
171
+ ```
172
+
173
+ ### 3.4 Production
174
+
175
+ ```env
176
+ # .env.production
177
+ NODE_ENV=production
178
+ PORT=3000
179
+ LOG_LEVEL=warn
180
+
181
+ # Database (시크릿 매니저)
182
+ DATABASE_URL=${PROD_DATABASE_URL}
183
+
184
+ # Redis
185
+ REDIS_URL=${PROD_REDIS_URL}
186
+
187
+ # Auth
188
+ JWT_SECRET=${PROD_JWT_SECRET}
189
+ JWT_EXPIRES_IN=15m
190
+ JWT_REFRESH_EXPIRES_IN=7d
191
+ SESSION_SECRET=${PROD_SESSION_SECRET}
192
+
193
+ # External Services
194
+ AWS_REGION=ap-northeast-2
195
+ ```
196
+
197
+ ---
198
+
199
+ ## 4. 시크릿 관리
200
+
201
+ ### 4.1 시크릿 목록
202
+
203
+ | 시크릿명 | 환경 | 관리 도구 | 비고 |
204
+ |---------|------|----------|------|
205
+ | `DATABASE_URL` | All | AWS Secrets Manager | DB 연결 |
206
+ | `JWT_SECRET` | All | AWS Secrets Manager | 토큰 서명 |
207
+ | `SESSION_SECRET` | All | AWS Secrets Manager | 세션 암호화 |
208
+ | `REDIS_PASSWORD` | Staging/Prod | AWS Secrets Manager | 캐시 인증 |
209
+ | `AWS_SECRET_ACCESS_KEY` | All | IAM Role (권장) | AWS 인증 |
210
+ | `SMTP_PASSWORD` | All | AWS Secrets Manager | 이메일 발송 |
211
+
212
+ ### 4.2 시크릿 관리 정책
213
+
214
+ ```yaml
215
+ secret_policy:
216
+ rotation:
217
+ DATABASE_URL: 90d
218
+ JWT_SECRET: 30d
219
+ SESSION_SECRET: 30d
220
+
221
+ access:
222
+ development:
223
+ - team: developers
224
+ permission: read
225
+ staging:
226
+ - team: developers
227
+ permission: read
228
+ - team: qa
229
+ permission: read
230
+ production:
231
+ - team: devops
232
+ permission: admin
233
+ - team: developers
234
+ permission: none # CI/CD만 접근
235
+ ```
236
+
237
+ ### 4.3 시크릿 접근 방법
238
+
239
+ **Local (dotenv):**
240
+ ```typescript
241
+ // .env.local 파일에서 로드
242
+ import 'dotenv/config';
243
+
244
+ const secret = process.env.JWT_SECRET;
245
+ ```
246
+
247
+ **Production (AWS Secrets Manager):**
248
+ ```typescript
249
+ import { SecretsManager } from '@aws-sdk/client-secrets-manager';
250
+
251
+ const client = new SecretsManager({ region: 'ap-northeast-2' });
252
+ const secret = await client.getSecretValue({ SecretId: 'prod/jwt-secret' });
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 5. 설정 검증
258
+
259
+ ### 5.1 필수 환경변수 검증
260
+
261
+ ```typescript
262
+ // config/validation.ts
263
+ import { z } from 'zod';
264
+
265
+ const envSchema = z.object({
266
+ NODE_ENV: z.enum(['development', 'staging', 'production']),
267
+ PORT: z.coerce.number().default(3000),
268
+ DATABASE_URL: z.string().url(),
269
+ JWT_SECRET: z.string().min(32),
270
+ SESSION_SECRET: z.string().min(32),
271
+ });
272
+
273
+ export const env = envSchema.parse(process.env);
274
+ ```
275
+
276
+ ### 5.2 시작 시 검증
277
+
278
+ | 검증 항목 | 실패 시 동작 |
279
+ |---------|-------------|
280
+ | 필수 변수 누락 | 앱 시작 중단 + 에러 로그 |
281
+ | DB 연결 실패 | 앱 시작 중단 + 알림 |
282
+ | Redis 연결 실패 | 경고 + 폴백 (in-memory) |
283
+ | 시크릿 형식 오류 | 앱 시작 중단 |
284
+
285
+ ---
286
+
287
+ ## 6. Feature Flags
288
+
289
+ ### 6.1 플래그 목록
290
+
291
+ | 플래그 | 설명 | 기본값 | 환경별 |
292
+ |-------|------|:------:|--------|
293
+ | `FEATURE_NEW_UI` | 새 UI 활성화 | false | Staging만 true |
294
+ | `FEATURE_BETA_API` | Beta API 노출 | false | Dev만 true |
295
+ | `FEATURE_MAINTENANCE` | 점검 모드 | false | 필요 시 true |
296
+
297
+ ### 6.2 플래그 사용
298
+
299
+ ```typescript
300
+ // 환경변수 방식
301
+ if (process.env.FEATURE_NEW_UI === 'true') {
302
+ // 새 UI 렌더링
303
+ }
304
+
305
+ // 설정 서비스 방식 (권장)
306
+ if (await featureService.isEnabled('NEW_UI', userId)) {
307
+ // 사용자별 롤아웃 지원
308
+ }
309
+ ```
310
+
311
+ ---
312
+
313
+ ## 7. 배포 시 체크리스트
314
+
315
+ ### 7.1 환경별 체크리스트
316
+
317
+ | 항목 | Dev | Staging | Prod |
318
+ |-----|:---:|:-------:|:----:|
319
+ | 환경변수 설정 완료 | ✅ | ✅ | ✅ |
320
+ | 시크릿 등록 완료 | ✅ | ✅ | ✅ |
321
+ | DB 마이그레이션 | ✅ | ✅ | ✅ |
322
+ | SSL 인증서 | ❌ | ✅ | ✅ |
323
+ | 모니터링 연동 | ❌ | ✅ | ✅ |
324
+ | 알림 설정 | ❌ | ⚪ | ✅ |
325
+
326
+ ### 7.2 롤백 시 주의사항
327
+
328
+ - 시크릿 변경 후 롤백 시 **이전 시크릿 값 필요**
329
+ - Feature flag 롤백은 **즉시 적용됨**
330
+ - DB 스키마 변경은 **backwards-compatible 필수**
331
+
332
+ ---
333
+
334
+ ## 8. 관련 문서
335
+
336
+ - [배포 명세](./deployment-spec.md) - CI/CD 설정
337
+ - [보안 명세](./security-spec.md) - 인증/암호화
338
+ - [외부 연동 명세](./integration-spec.md) - 외부 서비스
339
+
340
+ ---
341
+
342
+ ## 변경 이력
343
+
344
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
345
+ |------|------|--------|----------|
346
+ | 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |