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,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 | 초기 작성 |
|