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,264 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "테스트 명세서 (Test Specification)"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
last_updated: {{DATE}}
|
|
5
|
+
author: tsq-qa
|
|
6
|
+
status: draft
|
|
7
|
+
project: {{PROJECT_NAME}}
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 테스트 명세서 (Test Specification)
|
|
11
|
+
|
|
12
|
+
> 테스트 전략, 테스트 케이스, 품질 기준을 정의합니다.
|
|
13
|
+
> QA 에이전트와 Developer가 참조하는 테스트 가이드라인입니다.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. 테스트 전략
|
|
18
|
+
|
|
19
|
+
### 1.1 테스트 피라미드
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
/\
|
|
23
|
+
/E2E\ 10% - 핵심 사용자 흐름
|
|
24
|
+
/──────\
|
|
25
|
+
/Integration\ 20% - API, 서비스 간 연동
|
|
26
|
+
/──────────────\
|
|
27
|
+
/ Unit Tests \ 70% - 함수, 클래스 단위
|
|
28
|
+
────────────────────
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 1.2 테스트 유형별 목표
|
|
32
|
+
|
|
33
|
+
| 테스트 유형 | 범위 | 목표 커버리지 | 실행 시점 |
|
|
34
|
+
|-----------|------|:-----------:|----------|
|
|
35
|
+
| Unit | 함수, 클래스 | 80% | 커밋 전 |
|
|
36
|
+
| Integration | API, DB 연동 | 70% | PR 시 |
|
|
37
|
+
| E2E | 사용자 시나리오 | 핵심 흐름 100% | 배포 전 |
|
|
38
|
+
| Performance | 부하, 응답시간 | NFR 충족 | 릴리스 전 |
|
|
39
|
+
| Security | 취약점 | OWASP Top 10 | 릴리스 전 |
|
|
40
|
+
|
|
41
|
+
### 1.3 테스트 환경
|
|
42
|
+
|
|
43
|
+
| 환경 | 용도 | DB | 외부 연동 |
|
|
44
|
+
|-----|------|-----|----------|
|
|
45
|
+
| Local | 개발 중 테스트 | SQLite/Docker | Mock |
|
|
46
|
+
| CI | 자동화 테스트 | Test DB | Mock |
|
|
47
|
+
| Staging | 통합 테스트 | Staging DB | Sandbox |
|
|
48
|
+
| Production | 스모크 테스트 | Prod DB (읽기) | Real |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 2. 테스트 컨벤션
|
|
53
|
+
|
|
54
|
+
### 2.1 파일 명명 규칙
|
|
55
|
+
|
|
56
|
+
| 테스트 유형 | 파일 패턴 | 예시 |
|
|
57
|
+
|-----------|----------|------|
|
|
58
|
+
| Unit | `*.test.ts`, `*.spec.ts` | `user.service.test.ts` |
|
|
59
|
+
| Integration | `*.integration.test.ts` | `auth.integration.test.ts` |
|
|
60
|
+
| E2E | `*.e2e.test.ts` | `login.e2e.test.ts` |
|
|
61
|
+
|
|
62
|
+
### 2.2 테스트 구조 (AAA / Given-When-Then)
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
describe('UserService', () => {
|
|
66
|
+
describe('createUser', () => {
|
|
67
|
+
it('should create a user with valid data', () => {
|
|
68
|
+
// Arrange (Given)
|
|
69
|
+
const userData = { email: 'test@example.com', name: 'Test' };
|
|
70
|
+
|
|
71
|
+
// Act (When)
|
|
72
|
+
const result = userService.createUser(userData);
|
|
73
|
+
|
|
74
|
+
// Assert (Then)
|
|
75
|
+
expect(result).toHaveProperty('id');
|
|
76
|
+
expect(result.email).toBe(userData.email);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should throw error when email is invalid', () => {
|
|
80
|
+
// Arrange
|
|
81
|
+
const invalidData = { email: 'invalid', name: 'Test' };
|
|
82
|
+
|
|
83
|
+
// Act & Assert
|
|
84
|
+
expect(() => userService.createUser(invalidData))
|
|
85
|
+
.toThrow('Invalid email format');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 2.3 테스트 네이밍
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
[테스트 대상] should [기대 동작] when [조건]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
| 예시 |
|
|
98
|
+
|------|
|
|
99
|
+
| `createUser should return user with id when valid data provided` |
|
|
100
|
+
| `login should throw AuthError when password is wrong` |
|
|
101
|
+
| `getOrders should return empty array when user has no orders` |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 3. 테스트 케이스
|
|
106
|
+
|
|
107
|
+
### 3.1 기능별 테스트 케이스
|
|
108
|
+
|
|
109
|
+
#### TC-001: [기능명] 테스트
|
|
110
|
+
|
|
111
|
+
| 항목 | 내용 |
|
|
112
|
+
|-----|------|
|
|
113
|
+
| **관련 기능** | [FS-001](./functional-spec.md#FS-001) |
|
|
114
|
+
| **관련 API** | [POST /api/auth/login](./service-spec.md) |
|
|
115
|
+
| **우선순위** | High |
|
|
116
|
+
|
|
117
|
+
##### 테스트 시나리오
|
|
118
|
+
|
|
119
|
+
| TC ID | 시나리오 | 입력 | 기대 결과 | 우선순위 |
|
|
120
|
+
|-------|---------|------|----------|:--------:|
|
|
121
|
+
| TC-001-01 | 정상 로그인 | 유효한 이메일/비밀번호 | 200 + 토큰 반환 | High |
|
|
122
|
+
| TC-001-02 | 잘못된 비밀번호 | 유효한 이메일 + 틀린 비밀번호 | 401 + AUTH_001 | High |
|
|
123
|
+
| TC-001-03 | 존재하지 않는 사용자 | 미등록 이메일 | 401 + AUTH_002 | High |
|
|
124
|
+
| TC-001-04 | 이메일 형식 오류 | 잘못된 이메일 형식 | 400 + VALIDATION_001 | Medium |
|
|
125
|
+
| TC-001-05 | 빈 비밀번호 | 이메일만 입력 | 400 + VALIDATION_002 | Medium |
|
|
126
|
+
| TC-001-06 | 계정 잠금 | 5회 실패한 계정 | 403 + AUTH_003 | High |
|
|
127
|
+
|
|
128
|
+
##### 테스트 데이터
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"validUser": {
|
|
133
|
+
"email": "test@example.com",
|
|
134
|
+
"password": "Test1234!"
|
|
135
|
+
},
|
|
136
|
+
"invalidUser": {
|
|
137
|
+
"email": "wrong@example.com",
|
|
138
|
+
"password": "wrong"
|
|
139
|
+
},
|
|
140
|
+
"lockedUser": {
|
|
141
|
+
"email": "locked@example.com",
|
|
142
|
+
"password": "any"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### 3.2 API 테스트 매트릭스
|
|
150
|
+
|
|
151
|
+
| API | Happy Path | Invalid Input | Auth Error | Not Found | Server Error |
|
|
152
|
+
|-----|:----------:|:-------------:|:----------:|:---------:|:------------:|
|
|
153
|
+
| POST /auth/login | ✅ | ✅ | ✅ | N/A | ✅ |
|
|
154
|
+
| GET /users/:id | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
155
|
+
| POST /orders | ✅ | ✅ | ✅ | N/A | ✅ |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 4. 비기능 테스트
|
|
160
|
+
|
|
161
|
+
### 4.1 성능 테스트
|
|
162
|
+
|
|
163
|
+
| 테스트 | 조건 | 기준 | 도구 |
|
|
164
|
+
|-------|------|------|------|
|
|
165
|
+
| 응답 시간 | 일반 요청 | < 200ms (p95) | k6, Artillery |
|
|
166
|
+
| 처리량 | 동시 사용자 1000명 | > 500 RPS | k6 |
|
|
167
|
+
| 부하 | 피크 타임 시뮬레이션 | 에러율 < 1% | k6 |
|
|
168
|
+
|
|
169
|
+
### 4.2 보안 테스트
|
|
170
|
+
|
|
171
|
+
→ [security-spec.md](./security-spec.md) 참조
|
|
172
|
+
|
|
173
|
+
| 테스트 | 대상 | 도구 |
|
|
174
|
+
|-------|------|------|
|
|
175
|
+
| OWASP ZAP 스캔 | API 전체 | ZAP |
|
|
176
|
+
| 의존성 취약점 | npm packages | npm audit, Snyk |
|
|
177
|
+
| 코드 정적 분석 | 소스 코드 | ESLint security plugin |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 5. 테스트 자동화
|
|
182
|
+
|
|
183
|
+
### 5.1 CI 파이프라인
|
|
184
|
+
|
|
185
|
+
```yaml
|
|
186
|
+
test:
|
|
187
|
+
stages:
|
|
188
|
+
- lint # 코드 스타일 검사
|
|
189
|
+
- unit # 단위 테스트
|
|
190
|
+
- integration # 통합 테스트
|
|
191
|
+
- e2e # E2E 테스트 (선택적)
|
|
192
|
+
- coverage # 커버리지 리포트
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 5.2 커버리지 기준
|
|
196
|
+
|
|
197
|
+
| 메트릭 | 최소 기준 | 목표 |
|
|
198
|
+
|-------|:--------:|:----:|
|
|
199
|
+
| Line Coverage | 80% | 90% |
|
|
200
|
+
| Branch Coverage | 70% | 80% |
|
|
201
|
+
| Function Coverage | 80% | 90% |
|
|
202
|
+
|
|
203
|
+
### 5.3 실패 시 조치
|
|
204
|
+
|
|
205
|
+
| 상황 | 조치 |
|
|
206
|
+
|-----|------|
|
|
207
|
+
| 커버리지 미달 | PR 머지 차단 |
|
|
208
|
+
| 테스트 실패 | PR 머지 차단 |
|
|
209
|
+
| 보안 취약점 (High) | 배포 차단 |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 6. 테스트 리포트
|
|
214
|
+
|
|
215
|
+
### 6.1 리포트 항목
|
|
216
|
+
|
|
217
|
+
| 항목 | 설명 |
|
|
218
|
+
|-----|------|
|
|
219
|
+
| 총 테스트 수 | 실행된 테스트 케이스 수 |
|
|
220
|
+
| 성공/실패 | 통과/실패 테스트 수 |
|
|
221
|
+
| 커버리지 | 라인/브랜치/함수 커버리지 |
|
|
222
|
+
| 실행 시간 | 전체 테스트 실행 시간 |
|
|
223
|
+
| 실패 상세 | 실패한 테스트 목록 및 원인 |
|
|
224
|
+
|
|
225
|
+
### 6.2 리포트 템플릿
|
|
226
|
+
|
|
227
|
+
```markdown
|
|
228
|
+
## 테스트 리포트 - {{날짜}}
|
|
229
|
+
|
|
230
|
+
### 요약
|
|
231
|
+
- 총 테스트: XX개
|
|
232
|
+
- 성공: XX개 (XX%)
|
|
233
|
+
- 실패: XX개
|
|
234
|
+
- 스킵: XX개
|
|
235
|
+
|
|
236
|
+
### 커버리지
|
|
237
|
+
- Lines: XX%
|
|
238
|
+
- Branches: XX%
|
|
239
|
+
- Functions: XX%
|
|
240
|
+
|
|
241
|
+
### 실패 테스트
|
|
242
|
+
1. `test_name` - 실패 원인
|
|
243
|
+
|
|
244
|
+
### 성능 테스트
|
|
245
|
+
- P95 응답시간: XXms
|
|
246
|
+
- 처리량: XX RPS
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 7. 관련 문서
|
|
252
|
+
|
|
253
|
+
- [기능 명세](./functional-spec.md) - 테스트 대상 기능
|
|
254
|
+
- [서비스 명세](./service-spec.md) - API 테스트 기준
|
|
255
|
+
- [에러 코드](./error-codes.md) - 예상 에러 응답
|
|
256
|
+
- [보안 명세](./security-spec.md) - 보안 테스트 기준
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 변경 이력
|
|
261
|
+
|
|
262
|
+
| 버전 | 날짜 | 작성자 | 변경 내용 |
|
|
263
|
+
|------|------|--------|----------|
|
|
264
|
+
| 1.0.0 | {{DATE}} | tsq-qa | 초기 작성 |
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "UI/UX 명세서"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
last_updated: {{DATE}}
|
|
5
|
+
author: tsq-planner
|
|
6
|
+
status: draft
|
|
7
|
+
project: {{PROJECT_NAME}}
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# UI/UX 명세서
|
|
11
|
+
|
|
12
|
+
> 사용자 인터페이스와 사용자 경험을 정의합니다.
|
|
13
|
+
> 와이어프레임, 화면 흐름, 인터랙션 패턴을 문서화합니다.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. 디자인 원칙
|
|
18
|
+
|
|
19
|
+
### 1.1 UX 원칙
|
|
20
|
+
|
|
21
|
+
| 원칙 | 설명 | 적용 예시 |
|
|
22
|
+
|-----|------|----------|
|
|
23
|
+
| 일관성 | 동일한 요소는 동일하게 동작 | 버튼 스타일, 폼 레이아웃 |
|
|
24
|
+
| 피드백 | 사용자 행동에 즉각 반응 | 로딩 표시, 성공/실패 메시지 |
|
|
25
|
+
| 단순성 | 핵심 기능에 집중 | 불필요한 요소 제거 |
|
|
26
|
+
| 접근성 | 모든 사용자가 사용 가능 | 키보드 네비게이션, 스크린리더 |
|
|
27
|
+
|
|
28
|
+
### 1.2 디자인 시스템
|
|
29
|
+
|
|
30
|
+
| 요소 | 정의 | 토큰/값 |
|
|
31
|
+
|-----|------|--------|
|
|
32
|
+
| Primary Color | 주요 액션 색상 | #3B82F6 |
|
|
33
|
+
| Secondary Color | 보조 색상 | #6B7280 |
|
|
34
|
+
| Error Color | 에러 표시 | #EF4444 |
|
|
35
|
+
| Success Color | 성공 표시 | #10B981 |
|
|
36
|
+
| Font Family | 기본 폰트 | Inter, system-ui |
|
|
37
|
+
| Border Radius | 모서리 둥글기 | 8px |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. 화면 구조
|
|
42
|
+
|
|
43
|
+
### 2.1 사이트맵
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
[홈]
|
|
47
|
+
├── [인증]
|
|
48
|
+
│ ├── 로그인
|
|
49
|
+
│ ├── 회원가입
|
|
50
|
+
│ └── 비밀번호 찾기
|
|
51
|
+
├── [대시보드]
|
|
52
|
+
│ ├── 개요
|
|
53
|
+
│ └── 통계
|
|
54
|
+
├── [기능1]
|
|
55
|
+
│ ├── 목록
|
|
56
|
+
│ ├── 상세
|
|
57
|
+
│ └── 등록/수정
|
|
58
|
+
└── [설정]
|
|
59
|
+
├── 프로필
|
|
60
|
+
└── 알림
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2.2 화면 목록
|
|
64
|
+
|
|
65
|
+
| 화면 ID | 화면명 | URL | 인증 필요 | 관련 기능 |
|
|
66
|
+
|--------|-------|-----|:--------:|----------|
|
|
67
|
+
| SCR-001 | 로그인 | /login | N | FS-001 |
|
|
68
|
+
| SCR-002 | 대시보드 | /dashboard | Y | FS-002 |
|
|
69
|
+
| SCR-003 | | | | |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. 화면 상세
|
|
74
|
+
|
|
75
|
+
### SCR-001: 로그인
|
|
76
|
+
|
|
77
|
+
#### 3.1.1 기본 정보
|
|
78
|
+
|
|
79
|
+
| 항목 | 내용 |
|
|
80
|
+
|-----|------|
|
|
81
|
+
| **화면명** | 로그인 |
|
|
82
|
+
| **URL** | /login |
|
|
83
|
+
| **접근 권한** | 비회원 |
|
|
84
|
+
| **관련 기능** | [FS-001](./functional-spec.md#FS-001) |
|
|
85
|
+
| **관련 API** | [POST /api/auth/login](./service-spec.md) |
|
|
86
|
+
|
|
87
|
+
#### 3.1.2 와이어프레임
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
┌─────────────────────────────────────────┐
|
|
91
|
+
│ [로고] │
|
|
92
|
+
│ │
|
|
93
|
+
│ ┌─────────────────────────────────┐ │
|
|
94
|
+
│ │ 이메일 │ │
|
|
95
|
+
│ └─────────────────────────────────┘ │
|
|
96
|
+
│ │
|
|
97
|
+
│ ┌─────────────────────────────────┐ │
|
|
98
|
+
│ │ 비밀번호 [👁] │ │
|
|
99
|
+
│ └─────────────────────────────────┘ │
|
|
100
|
+
│ │
|
|
101
|
+
│ ☐ 로그인 상태 유지 │
|
|
102
|
+
│ │
|
|
103
|
+
│ ┌─────────────────────────────────┐ │
|
|
104
|
+
│ │ 로그인 │ │
|
|
105
|
+
│ └─────────────────────────────────┘ │
|
|
106
|
+
│ │
|
|
107
|
+
│ 비밀번호 찾기 | 회원가입 │
|
|
108
|
+
│ │
|
|
109
|
+
│ ─────────── 또는 ─────────── │
|
|
110
|
+
│ │
|
|
111
|
+
│ [Google 로그인] [Apple 로그인] │
|
|
112
|
+
│ │
|
|
113
|
+
└─────────────────────────────────────────┘
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### 3.1.3 UI 요소
|
|
117
|
+
|
|
118
|
+
| 요소 | 타입 | 필수 | 유효성 검사 | 에러 메시지 |
|
|
119
|
+
|-----|------|:----:|-----------|-----------|
|
|
120
|
+
| 이메일 | Input (email) | Y | 이메일 형식 | "올바른 이메일을 입력하세요" |
|
|
121
|
+
| 비밀번호 | Input (password) | Y | 최소 8자 | "비밀번호를 입력하세요" |
|
|
122
|
+
| 로그인 유지 | Checkbox | N | - | - |
|
|
123
|
+
| 로그인 버튼 | Button (primary) | - | - | - |
|
|
124
|
+
|
|
125
|
+
#### 3.1.4 인터랙션
|
|
126
|
+
|
|
127
|
+
| 트리거 | 액션 | 결과 |
|
|
128
|
+
|-------|------|------|
|
|
129
|
+
| 로그인 버튼 클릭 | API 호출 | 성공: 대시보드 이동 / 실패: 에러 표시 |
|
|
130
|
+
| 비밀번호 보기 클릭 | 토글 | 비밀번호 표시/숨김 |
|
|
131
|
+
| 회원가입 링크 클릭 | 네비게이션 | 회원가입 화면 이동 |
|
|
132
|
+
|
|
133
|
+
#### 3.1.5 상태별 화면
|
|
134
|
+
|
|
135
|
+
| 상태 | 설명 | UI 변화 |
|
|
136
|
+
|-----|------|--------|
|
|
137
|
+
| 기본 | 초기 상태 | 빈 폼 |
|
|
138
|
+
| 로딩 | API 호출 중 | 버튼 비활성화 + 스피너 |
|
|
139
|
+
| 에러 | 인증 실패 | 에러 메시지 표시 (빨간색) |
|
|
140
|
+
| 성공 | 인증 성공 | 대시보드로 리다이렉트 |
|
|
141
|
+
|
|
142
|
+
#### 3.1.6 반응형
|
|
143
|
+
|
|
144
|
+
| 브레이크포인트 | 레이아웃 변경 |
|
|
145
|
+
|--------------|-------------|
|
|
146
|
+
| Desktop (≥1024px) | 중앙 정렬, 최대 너비 400px |
|
|
147
|
+
| Tablet (768-1023px) | 중앙 정렬, 패딩 조정 |
|
|
148
|
+
| Mobile (<768px) | 전체 너비, 패딩 16px |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### SCR-002: [화면명]
|
|
153
|
+
|
|
154
|
+
(위와 동일한 형식으로 작성)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 4. 공통 컴포넌트
|
|
159
|
+
|
|
160
|
+
### 4.1 네비게이션
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
┌─────────────────────────────────────────────────┐
|
|
164
|
+
│ [로고] [메뉴1] [메뉴2] [메뉴3] [프로필▼] │
|
|
165
|
+
└─────────────────────────────────────────────────┘
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 4.2 푸터
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
┌─────────────────────────────────────────────────┐
|
|
172
|
+
│ 이용약관 | 개인정보처리방침 | 고객센터 │
|
|
173
|
+
│ © 2026 {{PROJECT_NAME}}. All rights reserved. │
|
|
174
|
+
└─────────────────────────────────────────────────┘
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 4.3 모달
|
|
178
|
+
|
|
179
|
+
| 타입 | 용도 | 크기 |
|
|
180
|
+
|-----|------|------|
|
|
181
|
+
| Alert | 단순 알림 | Small (300px) |
|
|
182
|
+
| Confirm | 확인 요청 | Small (300px) |
|
|
183
|
+
| Form | 폼 입력 | Medium (500px) |
|
|
184
|
+
| Full | 복잡한 작업 | Large (800px) |
|
|
185
|
+
|
|
186
|
+
### 4.4 토스트/알림
|
|
187
|
+
|
|
188
|
+
| 타입 | 색상 | 지속 시간 | 예시 |
|
|
189
|
+
|-----|------|---------|------|
|
|
190
|
+
| Success | Green | 3초 | "저장되었습니다" |
|
|
191
|
+
| Error | Red | 5초 | "오류가 발생했습니다" |
|
|
192
|
+
| Warning | Yellow | 4초 | "저장하지 않은 변경사항이 있습니다" |
|
|
193
|
+
| Info | Blue | 3초 | "새로운 알림이 있습니다" |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 5. 화면 흐름
|
|
198
|
+
|
|
199
|
+
### 5.1 인증 흐름
|
|
200
|
+
|
|
201
|
+
```mermaid
|
|
202
|
+
graph TD
|
|
203
|
+
A[앱 시작] --> B{로그인 상태?}
|
|
204
|
+
B -->|Yes| C[대시보드]
|
|
205
|
+
B -->|No| D[로그인 화면]
|
|
206
|
+
D --> E{로그인 시도}
|
|
207
|
+
E -->|성공| C
|
|
208
|
+
E -->|실패| F[에러 표시]
|
|
209
|
+
F --> D
|
|
210
|
+
D --> G[회원가입]
|
|
211
|
+
G --> H{가입 완료?}
|
|
212
|
+
H -->|Yes| D
|
|
213
|
+
H -->|No| G
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 5.2 주요 기능 흐름
|
|
217
|
+
|
|
218
|
+
```mermaid
|
|
219
|
+
graph LR
|
|
220
|
+
A[목록] --> B[상세]
|
|
221
|
+
B --> C[수정]
|
|
222
|
+
C --> B
|
|
223
|
+
A --> D[등록]
|
|
224
|
+
D --> A
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 6. 접근성 (Accessibility)
|
|
230
|
+
|
|
231
|
+
### 6.1 WCAG 준수 항목
|
|
232
|
+
|
|
233
|
+
| 기준 | 레벨 | 적용 |
|
|
234
|
+
|-----|:----:|------|
|
|
235
|
+
| 키보드 접근성 | A | 모든 기능 키보드로 사용 가능 |
|
|
236
|
+
| 색상 대비 | AA | 텍스트 4.5:1 이상 |
|
|
237
|
+
| 대체 텍스트 | A | 모든 이미지에 alt 속성 |
|
|
238
|
+
| 포커스 표시 | AA | 포커스 상태 명확히 표시 |
|
|
239
|
+
|
|
240
|
+
### 6.2 스크린리더 지원
|
|
241
|
+
|
|
242
|
+
| 요소 | aria 속성 | 예시 |
|
|
243
|
+
|-----|----------|------|
|
|
244
|
+
| 버튼 | aria-label | `aria-label="로그인"` |
|
|
245
|
+
| 폼 | aria-describedby | 에러 메시지 연결 |
|
|
246
|
+
| 모달 | role="dialog" | 포커스 트랩 |
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 7. 관련 문서
|
|
251
|
+
|
|
252
|
+
- [기능 명세](./functional-spec.md) - 기능 상세
|
|
253
|
+
- [서비스 명세](./service-spec.md) - API 정의
|
|
254
|
+
- [에러 코드](./error-codes.md) - 에러 메시지
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 변경 이력
|
|
259
|
+
|
|
260
|
+
| 버전 | 날짜 | 작성자 | 변경 내용 |
|
|
261
|
+
|------|------|--------|----------|
|
|
262
|
+
| 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |
|