From db7d66a9fc5d815a4c95320d0ace630571857a03 Mon Sep 17 00:00:00 2001 From: hiondal Date: Fri, 5 Sep 2025 12:44:27 +0900 Subject: [PATCH] first --- .claude/commands/design-api.md | 14 + .claude/commands/design-class.md | 22 + .claude/commands/design-data.md | 13 + .claude/commands/design-fix-prototype.md | 15 + .claude/commands/design-front.md | 26 + .claude/commands/design-help.md | 44 + .claude/commands/design-high-level.md | 16 + .claude/commands/design-improve-prototype.md | 15 + .claude/commands/design-improve-userstory.md | 12 + .claude/commands/design-logical.md | 14 + .claude/commands/design-pattern.md | 13 + .claude/commands/design-physical.md | 16 + .claude/commands/design-prototype.md | 13 + .claude/commands/design-seq-inner.md | 14 + .claude/commands/design-seq-outer.md | 14 + .claude/commands/design-test-prototype.md | 12 + .claude/commands/design-uiux.md | 13 + .claude/commands/design-update-uiux.md | 12 + .claude/commands/develop-db-guide.md | 12 + .claude/commands/develop-db-install.md | 20 + .claude/commands/develop-db-remove.md | 20 + .claude/commands/develop-dev-backend.md | 13 + .claude/commands/develop-dev-front.md | 23 + .claude/commands/develop-fix-backend.md | 15 + .claude/commands/develop-help.md | 43 + .claude/commands/develop-make-run-profile.md | 20 + .claude/commands/develop-mq-guide.md | 12 + .claude/commands/develop-mq-install.md | 19 + .claude/commands/develop-mq-remove.md | 18 + .claude/commands/develop-test-backend.md | 23 + .claude/commands/think-help.md | 30 + .claude/commands/think-planning.md | 15 + .claude/commands/think-userstory.md | 30 + .playwright-mcp/current-result-page.png | Bin 0 -> 179225 bytes CLAUDE.md | 494 ++++++++ design-backup/uiux/prototype/01-로그인.html | 485 ++++++++ design-backup/uiux/prototype/02-메인화면.html | 537 +++++++++ .../uiux/prototype/03-요금조회메뉴.html | 690 +++++++++++ .../uiux/prototype/04-요금조회결과.html | 1004 +++++++++++++++++ .../uiux/prototype/05-상품변경메뉴.html | 592 ++++++++++ .../uiux/prototype/06-상품변경화면.html | 797 +++++++++++++ .../uiux/prototype/07-상품변경요청.html | 774 +++++++++++++ .../uiux/prototype/08-처리결과화면.html | 739 ++++++++++++ design-backup/uiux/style-guide.md | 743 ++++++++++++ design-backup/uiux/uiux.md | 578 ++++++++++ design-backup/userstory.md | 297 +++++ sample-data/monthly-bills.json | 358 ++++++ 47 files changed, 8699 insertions(+) create mode 100644 .claude/commands/design-api.md create mode 100644 .claude/commands/design-class.md create mode 100644 .claude/commands/design-data.md create mode 100644 .claude/commands/design-fix-prototype.md create mode 100644 .claude/commands/design-front.md create mode 100644 .claude/commands/design-help.md create mode 100644 .claude/commands/design-high-level.md create mode 100644 .claude/commands/design-improve-prototype.md create mode 100644 .claude/commands/design-improve-userstory.md create mode 100644 .claude/commands/design-logical.md create mode 100644 .claude/commands/design-pattern.md create mode 100644 .claude/commands/design-physical.md create mode 100644 .claude/commands/design-prototype.md create mode 100644 .claude/commands/design-seq-inner.md create mode 100644 .claude/commands/design-seq-outer.md create mode 100644 .claude/commands/design-test-prototype.md create mode 100644 .claude/commands/design-uiux.md create mode 100644 .claude/commands/design-update-uiux.md create mode 100644 .claude/commands/develop-db-guide.md create mode 100644 .claude/commands/develop-db-install.md create mode 100644 .claude/commands/develop-db-remove.md create mode 100644 .claude/commands/develop-dev-backend.md create mode 100644 .claude/commands/develop-dev-front.md create mode 100644 .claude/commands/develop-fix-backend.md create mode 100644 .claude/commands/develop-help.md create mode 100644 .claude/commands/develop-make-run-profile.md create mode 100644 .claude/commands/develop-mq-guide.md create mode 100644 .claude/commands/develop-mq-install.md create mode 100644 .claude/commands/develop-mq-remove.md create mode 100644 .claude/commands/develop-test-backend.md create mode 100644 .claude/commands/think-help.md create mode 100644 .claude/commands/think-planning.md create mode 100644 .claude/commands/think-userstory.md create mode 100644 .playwright-mcp/current-result-page.png create mode 100644 CLAUDE.md create mode 100644 design-backup/uiux/prototype/01-로그인.html create mode 100644 design-backup/uiux/prototype/02-메인화면.html create mode 100644 design-backup/uiux/prototype/03-요금조회메뉴.html create mode 100644 design-backup/uiux/prototype/04-요금조회결과.html create mode 100644 design-backup/uiux/prototype/05-상품변경메뉴.html create mode 100644 design-backup/uiux/prototype/06-상품변경화면.html create mode 100644 design-backup/uiux/prototype/07-상품변경요청.html create mode 100644 design-backup/uiux/prototype/08-처리결과화면.html create mode 100644 design-backup/uiux/style-guide.md create mode 100644 design-backup/uiux/uiux.md create mode 100644 design-backup/userstory.md create mode 100644 sample-data/monthly-bills.json diff --git a/.claude/commands/design-api.md b/.claude/commands/design-api.md new file mode 100644 index 0000000..2e00953 --- /dev/null +++ b/.claude/commands/design-api.md @@ -0,0 +1,14 @@ +# API 설계 + +**Command**: `/design-api` + +## 설명 +API를 설계합니다. 공통설계원칙과 API설계가이드를 준용하여 설계합니다. + +## 프롬프트 +``` +@architecture +API를 설계해 주세요: +- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 + +``` \ No newline at end of file diff --git a/.claude/commands/design-class.md b/.claude/commands/design-class.md new file mode 100644 index 0000000..9c47830 --- /dev/null +++ b/.claude/commands/design-class.md @@ -0,0 +1,22 @@ +# 클래스 설계 + +**Command**: `/design-class` + +## 설명 +클래스를 설계합니다. 공통설계원칙과 클래스설계가이드를 준용하여 설계합니다. 클래스설계 정보가 제공되어야 합니다. + +## 프롬프트 +``` +@architecture +'공통설계원칙'과 '클래스설계가이드'를 준용하여 클래스를 설계해 주세요. +프롬프트에 '[클래스설계 정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[클래스설계 정보]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[클래스설계 정보] +- 패키지 그룹: com.unicorn.tripgen +- 설계 아키텍처 패턴 + - User: Layered + - Trip: Clean + - Location: Layered + - AI: Layered +``` \ No newline at end of file diff --git a/.claude/commands/design-data.md b/.claude/commands/design-data.md new file mode 100644 index 0000000..58a4414 --- /dev/null +++ b/.claude/commands/design-data.md @@ -0,0 +1,13 @@ +# 데이터 설계 + +**Command**: `/design-data` + +## 설명 +데이터 설계를 수행합니다. 공통설계원칙과 데이터설계가이드를 준용하여 설계합니다. + +## 프롬프트 +``` +@architecture +데이터 설계를 해주세요: +- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 +``` \ No newline at end of file diff --git a/.claude/commands/design-fix-prototype.md b/.claude/commands/design-fix-prototype.md new file mode 100644 index 0000000..bdaf95a --- /dev/null +++ b/.claude/commands/design-fix-prototype.md @@ -0,0 +1,15 @@ +# 프로토타입 오류수정 + +**Command**: `/design-fix-prototype` + +## 설명 +프로토타입에서 발생한 오류를 해결합니다. 오류내용이 제공되어야 수행됩니다. + +## 프롬프트 +``` +@fix as @front +'[오류내용]'섹션에 제공된 오류를 해결해 주세요. +프롬프트에 '[오류내용]'섹션이 없으면 수행 중단하고 안내 메시지 표시 +{안내메시지} +'[오류내용]'섹션 하위에 오류 내용을 제공 +``` \ No newline at end of file diff --git a/.claude/commands/design-front.md b/.claude/commands/design-front.md new file mode 100644 index 0000000..4eb1112 --- /dev/null +++ b/.claude/commands/design-front.md @@ -0,0 +1,26 @@ +# 프론트엔드 설계 + +**Command**: `/design-front` + +## 설명 +프론트엔드설계서를 작성합니다. 프론트엔드설계가이드를 준용하여 작성합니다. 백엔드시스템 정보가 제공되어야 합니다. + +## 프롬프트 +``` +@plan as @front +'프론트엔드설계가이드'를 준용하여 **프론트엔드설계서**를 작성해 주세요. +프롬프트에 '[백엔드시스템]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[백엔드시스템]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[백엔드시스템] +- 시스템: tripgen +- 마이크로서비스: user-service, location-service, trip-service, ai-service +- API문서 + - user service: http://localhost:8081/v3/api-docs + - location service: http://localhost:8082/v3/api-docs + - trip service: http://localhost:8083/v3/api-docs + - ai service: http://localhost:8084/v3/api-docs +[요구사항] +- 각 화면에 Back 아이콘 버튼과 화면 타이틀 표시 +- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 +``` \ No newline at end of file diff --git a/.claude/commands/design-help.md b/.claude/commands/design-help.md new file mode 100644 index 0000000..46ccb78 --- /dev/null +++ b/.claude/commands/design-help.md @@ -0,0 +1,44 @@ +# Design Work Type Commands + +**Command**: `/design-help` + +## 설명 +Design 워크타입의 명령어들과 작업 순서를 표시합니다. + +## Design 작업 순서 + +Design 워크타입은 UI/UX 설계부터 물리 아키텍처까지 전체 시스템 설계를 담당합니다. + +### Phase 1: UI/UX 설계 및 프로토타입 +1. **UI/UX 설계**: `/design-uiux` +2. **프로토타입 작성**: `/design-prototype` +3. **프로토타입 검증**: `/design-test-prototype` +4. **프로토타입 오류수정**: `/design-fix-prototype` (필요시) +5. **프로토타입 개선**: `/design-improve-prototype` (필요시) +6. **유저스토리 품질 높이기**: `/design-improve-userstory` +7. **설계서 업데이트**: `/design-update-uiux` + +### Phase 2: 아키텍처 설계 +8. **클라우드 아키텍처 패턴 선정**: `/design-pattern` +9. **논리아키텍처 설계**: `/design-logical` +10. **외부 시퀀스 설계**: `/design-seq-outer` +11. **내부 시퀀스 설계**: `/design-seq-inner` +12. **API 설계**: `/design-api` +13. **클래스 설계**: `/design-class` +14. **데이터 설계**: `/design-data` + +### Phase 3: 물리 설계 +15. **High Level 아키텍처 정의서**: `/design-high-level` +16. **물리 아키텍처 설계**: `/design-physical` +17. **프론트엔드 설계**: `/design-front` + +## 작업 흐름 +``` +UI/UX → 프로토타입 → 아키텍처 → 물리설계 +``` + +## 필수 사전 요구사항 +- **클래스 설계**: `[클래스설계 정보]` 섹션 필요 +- **High Level 아키텍처**: `CLOUD` 정보 필요 +- **물리 아키텍처**: `CLOUD` 정보 필요 +- **프론트엔드 설계**: `[백엔드시스템]` 정보 필요 \ No newline at end of file diff --git a/.claude/commands/design-high-level.md b/.claude/commands/design-high-level.md new file mode 100644 index 0000000..56794c4 --- /dev/null +++ b/.claude/commands/design-high-level.md @@ -0,0 +1,16 @@ +# High Level 아키텍처 정의서 작성 + +**Command**: `/design-high-level` + +## 설명 +High Level 아키텍처 정의서를 작성합니다. HighLevel아키텍처정의가이드를 준용하여 작성합니다. CLOUD 정보가 제공되어야 합니다. + +## 프롬프트 +``` +@architecture +'HighLevel아키텍처정의가이드'를 준용하여 High Level 아키텍처 정의서를 작성해 주세요. +'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. +{안내메시지} +아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. +- CLOUD: Azure +``` \ No newline at end of file diff --git a/.claude/commands/design-improve-prototype.md b/.claude/commands/design-improve-prototype.md new file mode 100644 index 0000000..215951a --- /dev/null +++ b/.claude/commands/design-improve-prototype.md @@ -0,0 +1,15 @@ +# 프로토타입 개선 + +**Command**: `/design-improve-prototype` + +## 설명 +프로토타입을 개선합니다. 개선내용이 제공되어야 수행됩니다. + +## 프롬프트 +``` +@improve as @front +'[개선내용]'섹션에 있는 내용을 개선해 주세요. +프롬프트에 '[개선내용]'항목이 없으면 수행을 중단하고 안내 메시지 표시 +{안내메시지} +'[개선내용]'섹션 하위에 개선할 내용을 제공 +``` \ No newline at end of file diff --git a/.claude/commands/design-improve-userstory.md b/.claude/commands/design-improve-userstory.md new file mode 100644 index 0000000..183817a --- /dev/null +++ b/.claude/commands/design-improve-userstory.md @@ -0,0 +1,12 @@ +# 유저스토리 품질 높이기 + +**Command**: `/design-improve-userstory` + +## 설명 +프로토타입을 웹브라우저에서 분석한 후 수정된 프로토타입에 따라 유저스토리를 업데이트합니다. + +## 프롬프트 +``` +@analyze as @front 프로토타입을 웹브라우저에서 분석한 후, +@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. +``` \ No newline at end of file diff --git a/.claude/commands/design-logical.md b/.claude/commands/design-logical.md new file mode 100644 index 0000000..c0f7e7d --- /dev/null +++ b/.claude/commands/design-logical.md @@ -0,0 +1,14 @@ +# 논리아키텍처 설계 + +**Command**: `/design-logical` + +## 설명 +논리 아키텍처를 설계합니다. 공통설계원칙과 논리아키텍처 설계 가이드를 준용하여 설계합니다. + +## 프롬프트 +``` +@architecture +논리 아키텍처를 설계해 주세요: +- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 + +``` \ No newline at end of file diff --git a/.claude/commands/design-pattern.md b/.claude/commands/design-pattern.md new file mode 100644 index 0000000..229e7c4 --- /dev/null +++ b/.claude/commands/design-pattern.md @@ -0,0 +1,13 @@ +# 클라우드 아키텍처 패턴 선정 + +**Command**: `/design-pattern` + +## 설명 +클라우드 아키텍처 패턴 적용 방안을 작성합니다. 클라우드아키텍처패턴선정가이드를 준용하여 작성합니다. + +## 프롬프트 +``` +@design-pattern +클라우드 아키텍처 패턴 적용 방안을 작성해 주세요: +- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 +``` \ No newline at end of file diff --git a/.claude/commands/design-physical.md b/.claude/commands/design-physical.md new file mode 100644 index 0000000..a69bec7 --- /dev/null +++ b/.claude/commands/design-physical.md @@ -0,0 +1,16 @@ +# 물리 아키텍처 설계 + +**Command**: `/design-physical` + +## 설명 +물리아키텍처를 설계합니다. 물리아키텍처설계가이드를 준용하여 설계합니다. CLOUD 정보가 제공되어야 합니다. + +## 프롬프트 +``` +@architecture +'물리아키텍처설계가이드'를 준용하여 물리아키텍처를 설계해 주세요. +'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. +{안내메시지} +아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. +- CLOUD: Azure +``` \ No newline at end of file diff --git a/.claude/commands/design-prototype.md b/.claude/commands/design-prototype.md new file mode 100644 index 0000000..5558a0b --- /dev/null +++ b/.claude/commands/design-prototype.md @@ -0,0 +1,13 @@ +# 프로토타입 작성 + +**Command**: `/design-prototype` + +## 설명 +프로토타입을 작성합니다. 프로토타입작성가이드를 준용하여 체계적으로 작성합니다. + +## 프롬프트 +``` +@prototype +프로토타입을 작성해 주세요: +- '프로토타입작성가이드'를 준용하여 작성 +``` \ No newline at end of file diff --git a/.claude/commands/design-seq-inner.md b/.claude/commands/design-seq-inner.md new file mode 100644 index 0000000..bf53bb5 --- /dev/null +++ b/.claude/commands/design-seq-inner.md @@ -0,0 +1,14 @@ +# 내부 시퀀스 설계 + +**Command**: `/design-seq-inner` + +## 설명 +내부 시퀀스 설계를 수행합니다. 공통설계원칙과 내부시퀀스설계 가이드를 준용하여 설계합니다. + +## 프롬프트 +``` +@architecture +내부 시퀀스 설계를 해 주세요: +- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 + +``` \ No newline at end of file diff --git a/.claude/commands/design-seq-outer.md b/.claude/commands/design-seq-outer.md new file mode 100644 index 0000000..23b85cd --- /dev/null +++ b/.claude/commands/design-seq-outer.md @@ -0,0 +1,14 @@ +# 외부 시퀀스 설계 + +**Command**: `/design-seq-outer` + +## 설명 +외부 시퀀스 설계를 수행합니다. 공통설계원칙과 외부시퀀스설계가이드를 준용하여 설계합니다. + +## 프롬프트 +``` +@architecture +외부 시퀀스 설계를 해 주세요: +- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 + +``` \ No newline at end of file diff --git a/.claude/commands/design-test-prototype.md b/.claude/commands/design-test-prototype.md new file mode 100644 index 0000000..ec9cb8d --- /dev/null +++ b/.claude/commands/design-test-prototype.md @@ -0,0 +1,12 @@ +# 프로토타입 검증 + +**Command**: `/design-test-prototype` + +## 설명 +프로토타입을 테스트하여 검증합니다. + +## 프롬프트 +``` +@test-front +프로토타입을 테스트 해 주세요. +``` \ No newline at end of file diff --git a/.claude/commands/design-uiux.md b/.claude/commands/design-uiux.md new file mode 100644 index 0000000..5c34697 --- /dev/null +++ b/.claude/commands/design-uiux.md @@ -0,0 +1,13 @@ +# UI/UX 설계 + +**Command**: `/design-uiux` + +## 설명 +UI/UX 설계를 수행합니다. UI/UX설계가이드를 준용하여 체계적으로 설계합니다. + +## 프롬프트 +``` +@uiux +UI/UX 설계를 해주세요: +- 'UI/UX설계가이드'를 준용하여 작성 +``` \ No newline at end of file diff --git a/.claude/commands/design-update-uiux.md b/.claude/commands/design-update-uiux.md new file mode 100644 index 0000000..b523179 --- /dev/null +++ b/.claude/commands/design-update-uiux.md @@ -0,0 +1,12 @@ +# 설계서 다시 업데이트 + +**Command**: `/design-update-uiux` + +## 설명 +현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정합니다. + +## 프롬프트 +``` +@document @front +현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. +``` \ No newline at end of file diff --git a/.claude/commands/develop-db-guide.md b/.claude/commands/develop-db-guide.md new file mode 100644 index 0000000..dc5598a --- /dev/null +++ b/.claude/commands/develop-db-guide.md @@ -0,0 +1,12 @@ +# 데이터베이스 설치계획서 작성 + +**Command**: `/develop-db-guide` + +## 설명 +데이터베이스 설치계획서를 작성합니다. 데이터베이스설치계획서가이드에 따라 작성합니다. + +## 프롬프트 +``` +@backing-service +"데이터베이스설치계획서가이드"에 따라 데이터베이스 설치계획서를 작성해 주십시오. +``` \ No newline at end of file diff --git a/.claude/commands/develop-db-install.md b/.claude/commands/develop-db-install.md new file mode 100644 index 0000000..4635721 --- /dev/null +++ b/.claude/commands/develop-db-install.md @@ -0,0 +1,20 @@ +# 데이터베이스 설치 수행 + +**Command**: `/develop-db-install` + +## 설명 +데이터베이스 설치를 수행합니다. 데이터베이스설치가이드에 따라 설치합니다. 설치정보가 제공되어야 합니다. + +## 프롬프트 +``` +@backing-service +[요구사항] +'데이터베이스설치가이드'에 따라 설치해 주세요. +'[설치정보]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시하세요. +{안내메시지} +'[설치정보]'섹션 하위에 아래 예와 같이 설치에 필요한 정보를 추가해 주세요. +- 설치대상환경: 개발환경 +- AKS Resource Group: rg-digitalgarage-01 +- AKS Name: aks-digitalgarage-01 +- Namespace: tripgen-dev +``` \ No newline at end of file diff --git a/.claude/commands/develop-db-remove.md b/.claude/commands/develop-db-remove.md new file mode 100644 index 0000000..14200c8 --- /dev/null +++ b/.claude/commands/develop-db-remove.md @@ -0,0 +1,20 @@ +# 데이터베이스 설치 제거 + +**Command**: `/develop-db-remove` + +## 설명 +데이터베이스 설치를 제거합니다. 데이터베이스설치결과서와 캐시설치결과서를 기반으로 모든 리소스를 삭제합니다. + +## 프롬프트 +``` +@backing-service +[요구사항] +- "데이터베이스설치결과서"를 보고 관련된 모든 리소스를 삭제 +- "캐시설치결과서"를 보고 관련된 모든 리소스를 삭제 +- 현재 OS에 맞게 수행 +- 서브 에이젼트를 병렬로 수행하여 삭제 +- 결과파일은 생성할 필요 없고 화면에만 결과 표시 +[참고자료] +- 데이터베이스설치결과서 +- 캐시설치결과서 +``` \ No newline at end of file diff --git a/.claude/commands/develop-dev-backend.md b/.claude/commands/develop-dev-backend.md new file mode 100644 index 0000000..887a93f --- /dev/null +++ b/.claude/commands/develop-dev-backend.md @@ -0,0 +1,13 @@ +# 백엔드 개발 + +**Command**: `/develop-dev-backend` + +## 설명 +백엔드를 개발합니다. 백엔드개발가이드에 따라 개발합니다. + +## 프롬프트 +``` +@dev-backend +[요구사항] +- "백엔드개발가이드"에 따라 개발해 주세요. +``` \ No newline at end of file diff --git a/.claude/commands/develop-dev-front.md b/.claude/commands/develop-dev-front.md new file mode 100644 index 0000000..55ef2e6 --- /dev/null +++ b/.claude/commands/develop-dev-front.md @@ -0,0 +1,23 @@ +# 프론트엔드 개발 + +**Command**: `/develop-dev-front` + +## 설명 +프론트엔드를 개발합니다. 프론트엔드개발가이드에 따라 개발합니다. 개발정보가 제공되어야 합니다. + +## 프롬프트 +``` +@dev-front +"프론트엔드개발가이드"에 따라 개발해 주세요. +프롬프트에 '[개발정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +'[개발정보]'섹션 하위에 아래 예와 같이 개발에 필요한 정보를 제시해 주세요. +[개발정보] +- 개발프레임워크: Typescript + React 18 +- UI프레임워크: MUI v5 +- 상태관리: Redux Toolkit +- 라우팅: React Router v6 +- API통신: Axios +- 스타일링: MUI + styled-components +- 빌드도구: Vite +``` \ No newline at end of file diff --git a/.claude/commands/develop-fix-backend.md b/.claude/commands/develop-fix-backend.md new file mode 100644 index 0000000..4fbdea9 --- /dev/null +++ b/.claude/commands/develop-fix-backend.md @@ -0,0 +1,15 @@ +# 백엔드 오류 해결 + +**Command**: `/develop-fix-backend` + +## 설명 +백엔드 개발 중 발생한 오류를 해결합니다. 개발된 각 서비스와 common 모듈을 컴파일하고 에러를 해결합니다. + +## 프롬프트 +``` +@fix as @back +개발된 각 서비스와 common 모듈을 컴파일하고 에러를 해결해 주세요. +- common 모듈 우선 수행 +- 각 서비스별로 서브 에이젠트를 병렬로 수행 +- 컴파일이 모두 성공할때까지 계속 수행 +``` \ No newline at end of file diff --git a/.claude/commands/develop-help.md b/.claude/commands/develop-help.md new file mode 100644 index 0000000..04cae9a --- /dev/null +++ b/.claude/commands/develop-help.md @@ -0,0 +1,43 @@ +# Develop Work Type Commands + +**Command**: `/develop-help` + +## 설명 +Develop 워크타입의 명령어들과 작업 순서를 표시합니다. + +## Develop 작업 순서 + +Develop 워크타입은 백엔드 서비스 설치부터 프론트엔드 개발까지 실제 개발과 배포를 담당합니다. + +### Phase 1: 인프라 설치 계획 +1. **데이터베이스 설치계획서 작성**: `/develop-db-guide` +2. **Message Queue 설치 계획서 작성**: `/develop-mq-guide` (필요시) + +### Phase 2: 인프라 설치 +3. **데이터베이스 설치**: `/develop-db-install` +4. **Message Queue 설치**: `/develop-mq-install` (필요시) + +### Phase 3: 백엔드 개발 +5. **백엔드 개발**: `/develop-dev-backend` +6. **백엔드 오류 해결**: `/develop-fix-backend` +7. **서비스 실행파일 작성**: `/develop-make-run-profile` +8. **백엔드 테스트**: `/develop-test-backend` + +### Phase 4: 프론트엔드 개발 +9. **프론트엔드 개발**: `/develop-dev-front` + +### Phase 5: 인프라 정리 (필요시) +- **데이터베이스 설치 제거**: `/develop-db-remove` +- **Message Queue 설치 제거**: `/develop-mq-remove` + +## 작업 흐름 +``` +인프라 계획 → 인프라 설치 → 백엔드 개발 → 프론트엔드 개발 +``` + +## 필수 사전 요구사항 +- **데이터베이스 설치**: `[설치정보]` 섹션 필요 +- **Message Queue 설치**: `[설치정보]` 섹션 필요 +- **서비스 실행파일 작성**: `[작성정보]` 섹션 (API Keys 필요) +- **백엔드 테스트**: `[테스트정보]` 섹션 (API Keys 필요) +- **프론트엔드 개발**: `[개발정보]` 섹션 (프레임워크 정보 필요) \ No newline at end of file diff --git a/.claude/commands/develop-make-run-profile.md b/.claude/commands/develop-make-run-profile.md new file mode 100644 index 0000000..fb25282 --- /dev/null +++ b/.claude/commands/develop-make-run-profile.md @@ -0,0 +1,20 @@ +# 서비스 실행파일 작성 + +**Command**: `/develop-make-run-profile` + +## 설명 +서비스 실행파일을 작성합니다. 서비스실행파일작성가이드에 따라 테스트합니다. 작성정보가 제공되어야 합니다. + +## 프롬프트 +``` +@test-backend +'서비스실행파일작성가이드'에 따라 테스트를 해 주세요. +프롬프트에 '[작성정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +{안내메시지} +[작성정보] +- API Key + - Claude: sk-ant-ap... + - OpenAI: sk-proj-An4Q... + - Open Weather Map: 1aa5b... + - Kakao API Key: 5cdc24.... +``` \ No newline at end of file diff --git a/.claude/commands/develop-mq-guide.md b/.claude/commands/develop-mq-guide.md new file mode 100644 index 0000000..682017f --- /dev/null +++ b/.claude/commands/develop-mq-guide.md @@ -0,0 +1,12 @@ +# Message Queue 설치 계획서 작성 + +**Command**: `/develop-mq-guide` + +## 설명 +Message Queue 설치계획서를 작성합니다. MQ설치게획서가이드에 따라 작성합니다. + +## 프롬프트 +``` +@backing-service +"MQ설치게획서가이드"에 따라 Message Queue 설치계획서를 작성해 주세요. +``` \ No newline at end of file diff --git a/.claude/commands/develop-mq-install.md b/.claude/commands/develop-mq-install.md new file mode 100644 index 0000000..ee7d696 --- /dev/null +++ b/.claude/commands/develop-mq-install.md @@ -0,0 +1,19 @@ +# Message Queue 설치 수행 + +**Command**: `/develop-mq-install` + +## 설명 +Message Queue 설치를 수행합니다. MQ설치가이드에 따라 설치합니다. 설치정보가 제공되어야 합니다. + +## 프롬프트 +``` +@backing-service +[요구사항] +'MQ설치가이드'에 따라 설치해 주세요. +'[설치정보]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시하세요. +{안내메시지} +'[설치정보]'섹션 하위에 아래 예와 같이 설치에 필요한 정보를 추가해 주세요. +- 설치대상환경: 개발환경 +- Resource Group: rg-digitalgarage-01 +- Namespace: tripgen-dev +``` \ No newline at end of file diff --git a/.claude/commands/develop-mq-remove.md b/.claude/commands/develop-mq-remove.md new file mode 100644 index 0000000..1eaf7fb --- /dev/null +++ b/.claude/commands/develop-mq-remove.md @@ -0,0 +1,18 @@ +# Message Queue 설치 제거 + +**Command**: `/develop-mq-remove` + +## 설명 +Message Queue 설치를 제거합니다. MQ설치결과서를 기반으로 관련된 모든 리소스를 삭제합니다. + +## 프롬프트 +``` +@backing-service +[요구사항] +- "MQ설치결과서"를 보고 관련된 모든 리소스를 삭제 +- 현재 OS에 맞게 수행 +- 서브 에이젼트를 병렬로 수행하여 삭제 +- 결과파일은 생성할 필요 없고 화면에만 결과 표시 +[참고자료] +- MQ설치결과서 +``` \ No newline at end of file diff --git a/.claude/commands/develop-test-backend.md b/.claude/commands/develop-test-backend.md new file mode 100644 index 0000000..91c54f6 --- /dev/null +++ b/.claude/commands/develop-test-backend.md @@ -0,0 +1,23 @@ +# 백엔드 테스트 + +**Command**: `/develop-test-backend` + +## 설명 +백엔드 테스트를 수행합니다. 백엔드테스트가이드에 따라 테스트합니다. 테스트정보가 제공되어야 합니다. + +## 프롬프트 +``` +@test-backend +'백엔드테스트가이드'에 따라 테스트를 해 주세요. +프롬프트에 '[테스트정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. +테스트 대상 서비스를 지정안하면 모든 서비스를 테스트 합니다. +{안내메시지} +'[테스트정보]'섹션 하위에 아래 예와 같이 테스트에 필요한 정보를 제시해 주세요. +테스트 대상 서비스를 콤마로 구분하여 입력할 수 있으며 전체를 테스트 할 때는 '전체'라고 입력하세요. +- 서비스: user-service +- API Key + - Claude: sk-ant-ap... + - OpenAI: sk-proj-An4Q... + - Open Weather Map: 1aa5b... + - Kakao API Key: 5cdc24.... +``` \ No newline at end of file diff --git a/.claude/commands/think-help.md b/.claude/commands/think-help.md new file mode 100644 index 0000000..3f157cc --- /dev/null +++ b/.claude/commands/think-help.md @@ -0,0 +1,30 @@ +# Think Work Type Commands + +**Command**: `/think-help` + +## 설명 +Think 워크타입의 명령어들과 작업 순서를 표시합니다. + +## Think 작업 순서 + +Think 워크타입은 서비스 기획과 요구사항 분석을 담당합니다. + +### 1. 서비스 기획 +**명령어**: `/think-planning` +- AI활용 서비스 기획 가이드를 참고하여 서비스 기획 수행 +- 기본적인 서비스 기획 방향성 제시 + +### 2. 유저스토리 작성 +**명령어**: `/think-userstory` +- 요구사항을 분석하여 유저스토리 작성 +- 피그마 채널 또는 요구사항문서를 기반으로 분석 +- 결과파일: `design/userstory.md` + +## 작업 흐름 +``` +서비스 기획 → 유저스토리 작성 +``` + +## 필수 사전 요구사항 +- **유저스토리 작성**: `[요구사항]` 섹션이 필요합니다 + - 피그마 채널ID 또는 요구사항문서 경로 제공 필요 \ No newline at end of file diff --git a/.claude/commands/think-planning.md b/.claude/commands/think-planning.md new file mode 100644 index 0000000..26e2afb --- /dev/null +++ b/.claude/commands/think-planning.md @@ -0,0 +1,15 @@ +# 서비스 기획 + +**Command**: `/think-planning` + +## 설명 +서비스 기획을 수행합니다. AI활용 서비스 기획 가이드를 참고하여 체계적으로 기획을 진행합니다. + +## 프롬프트 +아래 내용을 터미널에 표시만 하고 수행을 하지는 않습니다. +``` +아래 가이드를 참고하여 서비스 기획을 수행합니다. + +https://github.com/cna-bootcamp/aiguide/blob/main/AI%ED%99%9C%EC%9A%A9%20%EC%84%9C%EB%B9%84%EC%8A%A4%20%EA%B8%B0%ED%9A%8D%20%EA%B0%80%EC%9D%B4%EB%93%9C.md + +``` \ No newline at end of file diff --git a/.claude/commands/think-userstory.md b/.claude/commands/think-userstory.md new file mode 100644 index 0000000..0b84836 --- /dev/null +++ b/.claude/commands/think-userstory.md @@ -0,0 +1,30 @@ +# 유저스토리 작성 + +**Command**: `/think-userstory` + +## 설명 +유저스토리를 작성합니다. 요구사항을 분석하고 유저스토리 작성 방법에 따라 체계적으로 작성합니다. + +## 프롬프트 + +``` +@document +유저스토리를 작성하세요. +프롬프트에 '[요구사항]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시합니다. +{안내메시지} +'[요구사항]' 섹션에 아래 예와 같은 정보를 제공해 주십시오. +[요구사항] +Case 1) 이벤트스토밍을 피그마로 수행한 경우는 피그마 채널ID를 제공 +예) 피그마 채널ID 'abcde'에 접속하여 분석 +Case 2) 다른 방법으로 이벤트스토밍을 한 경우는 요구사항을 정리한 파일 경로를 제공 +예) 요구사항문서 'design/requirement.md'를 읽어 분석 + +프롬프트에 '[요구사항]'섹션이 있으면 아래와 같이 수행합니다. +1. 요구사항 분석 +- 피그마 채널ID가 제공된 경우 figma MCP를 이용하여 해당 채널에 접속하여 분석 +- 요구사항문서 경로가 제공된 경우 해당 문서를 읽어 요구사항을 분석 +2. 유저스토리 작성 +- '유저스토리작성방법'과 '유저스토리예제'를 참고하여 유저스토리를 작성 +- 결과파일은 'design/userstory.md'에 생성 + +``` \ No newline at end of file diff --git a/.playwright-mcp/current-result-page.png b/.playwright-mcp/current-result-page.png new file mode 100644 index 0000000000000000000000000000000000000000..8173e7a7d9959b54ca86b8bdf06d6cc49da776f5 GIT binary patch literal 179225 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�sgS@FxY(s6pNb&1>^>E#2u{40cBrru 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

EOrO-}oP>x{c2+$^9jkQWAbJpKagS`x# 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 claude/{filename}'명령으로 저장 +- 'claude'디렉토리가 없으면 생성하고 다운로드 +- 저장된 파일을 읽어 사용함 +- 작업을 완료한 후 다운로드한 파일은 삭제함 + +--- + +[프롬프트 로딩] +'프롬프트 로딩'이라고 입력하면 CLAUDE.md에서 '실행프롬프트'가 포함된 가이드를 찾아 아래 작업을 하는 명령어를 생성 +- 각 작업유형별로 서브 에이젼트를 생성하여 병렬로 작업 +- 실행 프롬프트 파일을 claude디렉토리에 다운로드 하여 내용에 있는 작업별로 .claude/commands/{작업유형}-{작업}.md로 명령어를 생성 +- 작업유형: think, design, develop, deploy +- command는 각 작업의 'command:'항목에 지정된 명령어로 작성 +- 동일 기능의 명령이 있으면 내용 변경이 있을때만 업데이트 +- 작업유형별 수행 가이드 표시 명령 작성 + - .claude/commands/{작업유형}-help.md + - command: "/{작업유형}-help" + - 아래 예시와 같이 작업 순서를 터미널에 표시하도록 함 + ``` + 기획 작업 순서 + + 1단계: 서비스 기획 + /think-planning + - AI활용 서비스 기획 가이드를 참고하여 서비스를 기획합니다 + + 2단계: 유저스토리 작성 + /think-userstory + - 유저스토리작성방법을 준용하여 작성합니다 + - 마이크로서비스로 나누어 작성합니다 + ``` + +--- + +[가이드 로딩] +- claude 디렉토리가 없으면 생성 +- 가이드 목록을 claude/guide.md에 다운로드 +- 가이드 목록 링크: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/GUIDE.md +- 파일을 읽어 CLAUDE.md 제일 하단에 아래와 같이 가이드 섹션을 추가. 기존에 가이드 섹션이 있으면 먼저 삭제하고 다시 만듦 + [가이드] + ``` + claude/guide.md 파일 내용 + ``` +- 파일을 삭제 + +--- + +[가이드] +``` +# Clauding Guide +최종 수정일시: 2025-08-22 11:50 + +## 서비스기획 가이드 +- 서비스기획프롬프트 + - 설명: 유저스토리 작성 등 서비스 기획을 위한 프롬프트 예시 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/02.think-prompt.md + - 파일명: think-prompt.md + +- 서비스기획가이드 + - 설명: 서비스 기획 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/think/think-guide.md + - 파일명: think-guide.md + +--- + +## 설계 가이드 +- 설계실행프롬프트 + - 설명: 각 설계 단계 실행을 위한 프롬프트 모음 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/03.design-prompt.md + - 파일명: design-prompt.md + +- 공통설계원칙 + - 설명: 모든 설계 시 적용할 공통설계원칙 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/common-principles.md + - 파일명: common-principles.md + +- UI/UX설계가이드 + - 설명: UI/UX 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/uiux-design.md + - 파일명: uiux-design.md + +- 프로토타입작성가이드 + - 설명: 프로토타입 작성 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/uiux-prototype.md + - 파일명: uiux-prototype.md + +- 아키텍처패턴선정 가이드 + - 설명: 클라우드 아키텍처 패턴 선정 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/architecture-patterns.md + - 파일명: architecture-patterns.md + +- 논리아키텍처설계가이드 + - 설명: 논리 아키텍처 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/logical-architecture-design.md + - 파일명: logical-architecture-design.md + +- API설계가이드 + - 설명: API 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/api-design.md + - 파일명: api-design.md + +- 외부시퀀스설계가이드 + - 설명: 외부 시퀀스 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/sequence-outer-design.md + - 파일명: sequence-outer-design.md + +- 내부시퀀스설계 가이드 + - 설명: 내부 시퀀스 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/sequence-inner-design.md + - 파일명: sequence-inner-design.md + +- 클래스설계가이드 + - 설명: 클래스 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/class-design.md + - 파일명: class-design.md + +- 데이터설계가이드 + - 설명: 데이터 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/data-design.md + - 파일명: data-design.md + +- HighLevel아키텍처정의가이드 + - 설명: 상위수준 아키텍처 정의 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/architecture-highlevel.md + - 파일명: architecture-highlevel.md + +- 물리아키텍처설계가이드 + - 설명: 물리 아키텍처 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/physical-architecture-design.md + - 파일명: physical-architecture-design.md + +- 프론트엔드설계가이드 + - 설명: 프론트엔드 설계 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/frontend-design.md + - 파일명: frontend-design.md + +--- + +## 개발 가이드 +- 개발실행프롬프트 + - 설명: 각 개발 단계 실행을 위한 프롬프트 모음 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/prompt/04.develop-prompt.md + - 파일명: develop-prompt.md + +- 데이터베이스설치계획서가이드 + - 설명: 데이터베이스 설치 방법 안내 요청 시 참조 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/database-plan.md + - 파일명: database-plan.md + +- 데이터베이스설치가이드 + - 설명: 데이터베이스 설치 방법 안내 요청 시 참조 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/database-install.md + - 파일명: database-install.md + +- MQ설치게획서가이드 + - 설명: Message Queue 설치 방법 안내 요청 시 참조 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/mq-plan.md + - 파일명: mq-plan.md + +- MQ설치가이드 + - 설명: Message Queue 설치 방법 안내 요청 시 참조 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/mq-install.md + - 파일명: mq-install.md + +- 백엔드개발가이드 + - 설명: 백엔드 개발 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/dev-backend.md + - 파일명: dev-backend.md + +- 서비스실행프로파일작성가이드 + - 설명: 백엔드 서비스 실행 프로파일 작성 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/make-run-profile.md + - 파일명: make-run-profile.md + +- 백엔드테스트가이드 + - 설명: 백엔드 테스트 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/test-backend.md + - 파일명: test-backend.md + +- 프론트엔드개발가이드 + - 설명: 프론트엔드 개발 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/develop/dev-frontend.md + - 파일명: dev-frontend.md + +--- + +## 배포 가이드 +- 백엔드컨테이너이미지작성가이드 + - 설명: 백엔드 컨테이너 이미지 작성 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/build-image-back.md + - 파일명: build-image-back.md +- 프론트엔드컨테이너이미지작성가이드 + - 설명: 프론트엔드 컨테이너 이미지 작성 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/build-image-front.md + - 파일명: build-image-front.md +- 백엔드컨테이너실행방법가이드 + - 설명: 백엔드 컨테이너 실행방법 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/run-container-guide-back.md + - 파일명: run-container-guide-back.md +- 프론트엔드컨테이너실행방법가이드 + - 설명: 프론트엔드 컨테이너 실행방법 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/run-container-guide-front.md + - 파일명: run-container-guide-front.md +- 백엔드배포가이드 + - 설명: 백엔드 서비스를 쿠버네티스 클러스터에 배포하는 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-k8s-back.md + - 파일명: deploy-k8s-back.md +- 프론트엔드배포가이드 + - 설명: 프론트엔드 서비스를 쿠버네티스 클러스터에 배포하는 가이드 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/deploy/deploy-k8s-front.md + - 파일명: deploy-k8s-front.md + +## 참조 문서 +- 프로젝트지침템플릿 + - 설명: 프로젝트 지침인 CLAUDE.md 파일 템플릿 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/instruction-template.md + - 파일명: instruction-template.md + +- 유저스토리작성방법 + - 설명: 유저스토리 형식과 작성법 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/유저스토리작성방법.md + - 파일명: userstory-writing.md + +- 유저스토리예제 + - 설명: 유저스토리 예제 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/samples/sample-%EC%9C%A0%EC%A0%80%EC%8A%A4%ED%86%A0%EB%A6%AC.md + - 파일명: sample-userstory.md + +- 클라우드아키텍처패턴요약표 + - 설명: 클라우드 디자인 패턴 요약표 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/Cloud%20Design%20Patterns(%EA%B0%9C%EC%9A%94).md + - 파일명: cloud-design-patterns.md + +- HighLevel아키텍처정의서템플릿 + - 설명: MSA 7대 컴포넌트별로 상위 수준의 아키텍처를 정의한 문서 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/highlevel-architecture-template.md + - 파일명: highlevel-architecture-template.md + +- 제품별버전가이드 + - 설명: 개발언어, 개발 프레임워크, AI제품 등의 버전 참조를 위한 페이지 링크 제공 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/제품버전참조.md + - 파일명: version-link.md + +- 백킹서비스설치방법 + - 설명: 데이터베이스, Message Queue 등 백킹서비스설치방법 설명 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/백킹서비스설치방법.md + - 파일명: backing-service-method.md + +--- + +## 표준 +- 개발주석표준 + - 설명: 개발 주석 표준 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_comment.md + - 파일명: standard_comment.md + +- 패키지구조표준 + - 설명: 패키지 구조 표준과 설계 아키텍처 패턴(Layered, Clean, Hexagonal)별 예시 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_package_structure.md + - 파일명: standard_package_structure.md + +- 테스트코드표준 + - 설명: 테스트 코드 작성 표준 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/standards/standard_testcode.md + - 파일명: standard_testcode.md + +--- + +## 기술 도구 +- PlantUML문법검사가이드 + - 설명: PlantUML 문법 검사하는 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/plantuml-guide.md + - 파일명: plantuml-guide.md + +- Mermaid문법검사가이드 + - 설명: Mermaid 문법 검사하는 방법 안내 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/mermaid-guide.md + - 파일명: mermaid-guide.md + +- MCP동기화도구 + - 설명: Window에서 Cloude Desktop의 MCP설정을 읽어 Claude Code에 MCP 서버를 동기화하는 툴 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/sync-mcp.md + - 파일명: sync-mcp.md + +- PlantUML문법검사기(Window) + - 설명: Window용 PlantUML 스크립트 문법 검사기 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-plantuml.ps1 + - 파일명: check-plantuml.ps1 + +- Mermaid문법검사기(Window) + - 설명: Window용 PlantUML 스크립트 문법 검사기 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-mermaid.ps1 + - 파일명: check-mermaid.ps1 + +- PlantUML문법검사기(Linux/Mac) + - 설명: Linux/Mac용 PlantUML 스크립트 문법 검사기 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-plantuml.sh + - 파일명: check-plantuml.sh + +- Mermaid문법검사기(Linux/Mac) + - 설명: Linux/Mac용 PlantUML 스크립트 문법 검사기 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-mermaid.sh + - 파일명: check-mermaid.sh + +- IntelliJ서비스실행기 + - 설명: IntelliJ에 등록된 실행프로파일을 이용하여 서비스 실행 + - URL: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/run-intellij-service-profile.py + - 파일명: run-intellij-service-profile.py + +--- + +## 산출물 디렉토리 +- 유저스토리: design/userstory.md +- UI/UX설계서: design/uiux/uiux.md +- 스타일가이드: design/uiux/style-guide.md +- 프로토타입: design/uiux/prototype/*.html +- 아키텍처패턴: design/pattern/architecture-pattern.md +- 논리아키텍처: design/backend/logical/* +- API설계서: design/backend/api/* +- API명세서: design/backend/api/spec/* +- 외부시퀀스설계서: design/backend/sequence/outer/{플로우명}.puml +- 내부시퀀스설계서: design/backend/sequence/inner/{service-name}-{flow-name}.puml +- 클래스설계서: design/backend/class/* +- 백엔드패키지구조도: 클래스설계 결과(design/backend/class/class.md)의 '패키지 구조도' 섹션 +- 데이터설계서: design/backend/database/* +- HighLevel아키텍처정의서: design/high-level-architecture.md +- 물리아키텍처: design/backend/physical/* +- 데이터베이스설치계획서 + - develop/database/plan/db-plan-{service-name}-dev.md + - develop/database/plan/db-plan-{service-name}-prod.md +- 캐시설치계획서: + - develop/mq/mq-plan-dev.md + - develop/mq/mq-plan-prod.md +- MQ설치계획서 + - develop/database/plan/mq-plan-{service-name}-dev.md + - develop/database/plan/mq-plan-{service-name}-prod.md +- 데이터베이스설치결과서 + - develop/database/exec/db-exec-dev.md + - develop/database/exec/db-exec-prod.md +- 캐시설치결과서 + - develop/database/exec/cache-exec-{service-name}-dev.md + - develop/database/exec/cache-exec-{service-name}-prod.md +- MQ설치결과서 + - develop/mq/mq-exec-dev.md + - develop/mq/mq-exec-prod.md +- 백엔드개발결과서: develop/dev/dev-backend.md +- 백엔드테스트결과서: develop/dev/test-backend.md +- 프론트엔드설계서: design/frontend/frontend-design.md + +## 프롬프트 약어 +### 역할 약어 +- "@archi": "--persona-architect" +- "@front": "--persona-front" +- "@back": "--persona-backend" +- "@secu": "--persona-security" +- "@qa": "--persona-qa" +- "@refact": "--persona-refactor" +- "@devops": "--persona-devops" +- "@scribe": "--persona-scriber" + +### 작업 약어 +- "@complex-flag": --seq --c7 --uc --wave-mode auto --wave-strategy systematic --delegate auto + +- "@userstory": /sc:document @scribe @archi --think --wave-strategy systematic +- "@uiux": /sc:design --think @front --uc --wave-mode auto --wave-strategy systematic +- "@prototype": /sc:implement @front --answer-only +- "@design-pattern": /sc:design @archi --think-hard @complex-flag +- "@architecture": /sc:design @archi @back @refact --think-hard @complex-flag +- "@plan": --plan --think +- "@backing-service": /sc:implement @devops @back --think-hard @complex-flag +- "@dev-backend": /sc:implement @back --think-hard @complex-flag +- "@dev-front": /sc:implement @front --think-hard @complex-flag +- "@test-backend": /sc:test @back @qa --think @complex-flag +- "@test-api": /sc:test @back @qa --think 1) 소스 수정 후 컴파일하고 서버 시작 요청. 2) API경로와 DTO를 분석하여 정확하게 요청하여 테스트 +- "@run-back": + - 'IntelliJ서비스실행기'를 'tools' 디렉토리에 다운로드 + - python 또는 python3 명령으로 백그라우드로 실행하고 결과 로그를 분석 + nohup python3 tools/run-intellij-service-profile.py {service-name} > logs/{service-name}.log 2>&1 & echo "Started {service-name} with PID: $!" +- "@test-front": /sc:test @front @qa --play --think @complex-flag +- "@cicd": /sc:implement @devops --think @complex-flag +- "@document": /sc:document --think @scribe @complex-flag +- "@fix": /sc:troubleshoot --think @complex-flag +- "@estimate": /sc:estimate --think-hard @complex-flag +- "@improve": /sc:improve --think @complex-flag +- "@analyze": /sc:analyze --think --seq +- "@explain": /sc:explain --think --seq --answer-only + +### 파일 약어 +- "@error": debug/error.png파일을 의미함 +- "@info": debug/info.png파일을 의미함 + +### 작업 단계 가이드 약어 +- "@think-help": "기획실행프롬프트 내용을 터미널에 출력" +- "@design-help": "설계실행프롬프트 내용을 터미널에 출력" +- "@develop-help": "개발실행프롬프트 내용을 터미널에 출력" +- "@deploy-help": "배포실행프롬프트 내용을 터미널에 출력" +``` diff --git a/design-backup/uiux/prototype/01-로그인.html b/design-backup/uiux/prototype/01-로그인.html new file mode 100644 index 0000000..d8463db --- /dev/null +++ b/design-backup/uiux/prototype/01-로그인.html @@ -0,0 +1,485 @@ + + + + + + 로그인 - 통신요금 관리 서비스 + + + +

+ +
+ +

통신요금 관리

+

간편하고 안전한 요금 관리 서비스

+
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + +
+
+ + + +
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/02-메인화면.html b/design-backup/uiux/prototype/02-메인화면.html new file mode 100644 index 0000000..17ce0fe --- /dev/null +++ b/design-backup/uiux/prototype/02-메인화면.html @@ -0,0 +1,537 @@ + + + + + + 메인 화면 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

통신요금 관리

+
+ +
+ + +
+

안녕하세요!

+ +
+ 010-1234-5678 +
+ 현재 상품 + 5G 프리미엄 플랜 +
+
+
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/03-요금조회메뉴.html b/design-backup/uiux/prototype/03-요금조회메뉴.html new file mode 100644 index 0000000..729a240 --- /dev/null +++ b/design-backup/uiux/prototype/03-요금조회메뉴.html @@ -0,0 +1,690 @@ + + + + + + 요금조회 메뉴 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

요금 조회

+
+ +
+ + +
+ + + + +
+

+ 📅 + 조회 옵션 설정 +

+ + +
+ ⚠️ +
+ +
+
+ + +
+ 💡 +
+ +
+
+ +
+ +
+ +
+ +
+
+ ℹ️ + 최근 6개월 요금 정보를 조회할 수 있습니다 +
+
+ + +
+
+ 📋 + 조회 가능한 정보 +
+
    +
  • 월 요금 상세 내역 (기본료, 통화료, 데이터료 등)
  • +
  • 사용량 정보 (통화시간, 데이터 사용량, SMS 등)
  • +
  • 할인 및 혜택 내역
  • +
  • 단말기 할부금 및 기타 부대비용
  • +
  • 약정 정보 및 예상 해지비용
  • +
+
+
+
+
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/04-요금조회결과.html b/design-backup/uiux/prototype/04-요금조회결과.html new file mode 100644 index 0000000..1662be8 --- /dev/null +++ b/design-backup/uiux/prototype/04-요금조회결과.html @@ -0,0 +1,1004 @@ + + + + + + 요금조회 결과 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

요금조회 결과

+
+
+ + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/05-상품변경메뉴.html b/design-backup/uiux/prototype/05-상품변경메뉴.html new file mode 100644 index 0000000..d75be81 --- /dev/null +++ b/design-backup/uiux/prototype/05-상품변경메뉴.html @@ -0,0 +1,592 @@ + + + + + + 상품 변경 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

상품 변경

+
+
+ + +
+ +
+ + +
+

고객 정보

+
+ 회선번호 + 010-1234-5678 +
+
+ 고객ID + customer123 +
+
+ + +
+
+
📱
+
+
5G 프리미엄 플랜
+
+
+
월 69,000원
+
    +
  • + + 5G 데이터 무제한 +
  • +
  • + + 음성통화 무제한 +
  • +
  • + + 문자 무제한 +
  • +
  • + + 해외 로밍 50% 할인 +
  • +
+
+ + +
+
+ ⚠️ + 상품 변경 시 주의사항 +
+

+ • 상품 변경은 다음 월 1일부터 적용됩니다
+ • 기존 약정 조건에 따라 위약금이 발생할 수 있습니다
+ • 변경 후에는 이전 상품으로 즉시 되돌릴 수 없습니다
+ • 부가서비스는 별도로 재신청이 필요할 수 있습니다 +

+
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/06-상품변경화면.html b/design-backup/uiux/prototype/06-상품변경화면.html new file mode 100644 index 0000000..2cac20d --- /dev/null +++ b/design-backup/uiux/prototype/06-상품변경화면.html @@ -0,0 +1,797 @@ + + + + + + 상품 선택 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

상품 선택

+
+
+ + +
+ +
+ + +
+
현재 이용 중인 상품
+
5G 프리미엄 플랜
+
월 69,000원
+
+ + +
+

변경 가능한 상품

+ + + + + +
+ +
+
+
+
📱
+
+
5G 베이직 플랜
+
월 39,000원
+
+
+
+
+ + 5G 데이터 10GB +
+
+ + 음성통화 300분 +
+
+ + 문자 무제한 +
+
+
+ 현재 상품 대비 + 월 30,000원 절약 +
+
+ + +
+
+
+
📱
+
+
5G 스탠다드 플랜
+
월 59,000원
+
+
+
+
+ + 5G 데이터 50GB +
+
+ + 음성통화 무제한 +
+
+ + 문자 무제한 +
+
+ + 해외 로밍 20% 할인 +
+
+
+ 현재 상품 대비 + 월 10,000원 절약 +
+
+ + +
+
+
+
📱
+
+
5G 언리미티드 플랜
+
월 89,000원
+
+
+
+
+ + 5G 데이터 무제한 +
+
+ + 음성통화 무제한 +
+
+ + 문자 무제한 +
+
+ + 해외 로밍 무료 +
+
+ + OTT 서비스 3개 +
+
+
+ 현재 상품 대비 + 월 20,000원 추가 +
+
+
+
+
+ + +
+ + +
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/07-상품변경요청.html b/design-backup/uiux/prototype/07-상품변경요청.html new file mode 100644 index 0000000..547a449 --- /dev/null +++ b/design-backup/uiux/prototype/07-상품변경요청.html @@ -0,0 +1,774 @@ + + + + + + 상품 변경 요청 - 통신요금 관리 서비스 + + + +
+ +
+
+ +

상품 변경 요청

+
+
+ + +
+ +
+ +
+ +
+ + +
+

변경 내용 확인

+
+
+
현재 상품
+
5G 프리미엄 플랜
+
월 69,000원
+
+
+
+
변경할 상품
+
5G 스탠다드 플랜
+
월 59,000원
+
+
+
+ + +
+
+ ⚠️ + 중요 안내사항 +
+
    +
  • 상품 변경은 다음 월 1일부터 적용됩니다
  • +
  • 현재 약정 기간이 남아있는 경우 위약금이 발생할 수 있습니다
  • +
  • 기존 부가서비스는 자동으로 해지되며, 필요시 재신청해야 합니다
  • +
  • 변경 후 14일 이내에 취소 가능하나, 일부 제약이 있을 수 있습니다
  • +
  • 요금제 변경에 따른 데이터 이월은 불가능합니다
  • +
+
+ + +
+

사전 검증 진행 상황

+
+
+
+
검증을 시작하세요
+
검증 대기중
+ +
+
+
약정 확인
+
+
+
자격 검증
+
+
+
요금 계산
+
+
+
승인 완료
+
+
+
+
+ + +
+ + + +
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/prototype/08-처리결과화면.html b/design-backup/uiux/prototype/08-처리결과화면.html new file mode 100644 index 0000000..eb95ea2 --- /dev/null +++ b/design-backup/uiux/prototype/08-처리결과화면.html @@ -0,0 +1,739 @@ + + + + + + 처리 결과 - 통신요금 관리 서비스 + + + +
+ +
+

처리 결과

+
+ + +
+
+

상품 변경이 완료되었습니다

+

+ 선택하신 상품으로 변경 신청이 성공적으로 처리되었습니다.
+ 변경된 상품은 다음 월 1일부터 적용됩니다. +

+
+ + + + + +
+

변경 내용

+
+ 변경된 상품 + 5G 스탠다드 플랜 +
+
+ 월 요금 + 월 59,000원 +
+
+ 적용일 + 2025년 2월 1일 +
+
+ 처리번호 + CHG-2025010512345 +
+
+ 처리일시 + 2025-01-05 14:23:45 +
+
+ + + +
+ + +
+ +
+ + +
+ + + +
+ + + + \ No newline at end of file diff --git a/design-backup/uiux/style-guide.md b/design-backup/uiux/style-guide.md new file mode 100644 index 0000000..7f8ed0f --- /dev/null +++ b/design-backup/uiux/style-guide.md @@ -0,0 +1,743 @@ +# 통신요금 관리 서비스 - 스타일 가이드 + +- [통신요금 관리 서비스 - 스타일 가이드](#통신요금-관리-서비스---스타일-가이드) + - [브랜드 아이덴티티](#브랜드-아이덴티티) + - [디자인 원칙](#디자인-원칙) + - [컬러 시스템](#컬러-시스템) + - [타이포그래피](#타이포그래피) + - [간격 시스템](#간격-시스템) + - [컴포넌트 스타일](#컴포넌트-스타일) + - [반응형 브레이크포인트](#반응형-브레이크포인트) + - [대상 서비스 특화 컴포넌트](#대상-서비스-특화-컴포넌트) + - [인터랙션 패턴](#인터랙션-패턴) + - [변경 이력](#변경-이력) + +--- + +## 브랜드 아이덴티티 + +### 서비스 컨셉 +- **키워드**: 신뢰성, 편리함, 명확성 +- **브랜드 메시지**: "간편하고 안전한 통신요금 관리" +- **타겟**: 일반 MVNO 고객 (20대~60대) + +### 디자인 컨셉 +- **미니멀리즘**: 불필요한 요소 제거, 핵심 기능 집중 +- **명확성 우선**: 정보 전달의 명확성과 가독성 +- **안정감**: 금융 서비스의 신뢰성과 보안성 강조 +- **접근성**: 모든 사용자가 편리하게 이용할 수 있는 인터페이스 + +--- + +## 디자인 원칙 + +### 1. 명확성 (Clarity) +- 모든 UI 요소는 그 목적이 명확해야 함 +- 전문용어 사용 최소화, 일반적인 표현 우선 +- 중요 정보는 시각적으로 강조 + +### 2. 일관성 (Consistency) +- 동일한 요소는 동일한 스타일 적용 +- 예측 가능한 인터랙션 패턴 +- 통일된 색상과 타이포그래피 사용 + +### 3. 효율성 (Efficiency) +- 최소한의 클릭으로 목표 달성 +- 불필요한 단계 제거 +- 빠른 로딩과 반응성 보장 + +### 4. 안전성 (Safety) +- 중요한 액션에는 확인 단계 제공 +- 오류 방지와 명확한 피드백 +- 개인정보 보호 강조 + +### 5. 포용성 (Inclusivity) +- 접근성 지침 준수 +- 다양한 디바이스와 환경 지원 +- 사용자 능력과 상황 고려 + +--- + +## 컬러 시스템 + +### Primary Colors +```css +/* 메인 브랜드 컬러 - 신뢰감을 주는 블루 */ +--primary-50: #EBF8FF; +--primary-100: #BEE3F8; +--primary-200: #90CDF4; +--primary-300: #63B3ED; +--primary-400: #4299E1; +--primary-500: #3182CE; /* Main Brand Color */ +--primary-600: #2B77CB; +--primary-700: #2C5282; +--primary-800: #2A4365; +--primary-900: #1A365D; +``` + +### Secondary Colors +```css +/* 보조 컬러 - 포인트 및 상태 표시 */ +--secondary-50: #F7FAFC; +--secondary-100: #EDF2F7; +--secondary-200: #E2E8F0; +--secondary-300: #CBD5E0; +--secondary-400: #A0AEC0; +--secondary-500: #718096; +--secondary-600: #4A5568; +--secondary-700: #2D3748; +--secondary-800: #1A202C; +--secondary-900: #171923; +``` + +### Status Colors +```css +/* 성공 - 그린 */ +--success-50: #F0FFF4; +--success-100: #C6F6D5; +--success-500: #38A169; +--success-600: #2F855A; + +/* 경고 - 오렌지 */ +--warning-50: #FFFAF0; +--warning-100: #FEEBC8; +--warning-500: #ED8936; +--warning-600: #DD6B20; + +/* 오류 - 레드 */ +--error-50: #FED7D7; +--error-100: #FED7D7; +--error-500: #E53E3E; +--error-600: #C53030; + +/* 정보 - 블루 */ +--info-50: #EBF8FF; +--info-100: #BEE3F8; +--info-500: #3182CE; +--info-600: #2B77CB; +``` + +### Neutral Colors +```css +/* 텍스트 및 배경 */ +--gray-50: #F9FAFB; /* Background Light */ +--gray-100: #F3F4F6; /* Background */ +--gray-200: #E5E7EB; /* Border Light */ +--gray-300: #D1D5DB; /* Border */ +--gray-400: #9CA3AF; /* Text Muted */ +--gray-500: #6B7280; /* Text Secondary */ +--gray-600: #4B5563; /* Text Primary Light */ +--gray-700: #374151; /* Text Primary */ +--gray-800: #1F2937; /* Text Primary Dark */ +--gray-900: #111827; /* Text Emphasis */ +``` + +### 컬러 사용 가이드 +- **Primary**: 주요 액션 버튼, 링크, 브랜드 요소 +- **Secondary**: 보조 버튼, 아이콘, 경계선 +- **Success**: 성공 메시지, 완료 상태 +- **Warning**: 주의 메시지, 중요 알림 +- **Error**: 오류 메시지, 실패 상태 +- **Gray**: 텍스트, 배경, 구분선 + +--- + +## 타이포그래피 + +### 폰트 패밀리 +```css +/* 기본 폰트 스택 */ +font-family: + 'Noto Sans KR', /* 한글 */ + 'Roboto', /* 영문 */ + -apple-system, + BlinkMacSystemFont, + 'Apple SD Gothic Neo', + 'Malgun Gothic', + sans-serif; +``` + +### 폰트 크기 및 행간 +```css +/* Heading */ +--text-4xl: 2.25rem; /* 36px - Page Title */ +--text-3xl: 1.875rem; /* 30px - Section Title */ +--text-2xl: 1.5rem; /* 24px - Card Title */ +--text-xl: 1.25rem; /* 20px - Sub Title */ +--text-lg: 1.125rem; /* 18px - Large Text */ + +/* Body */ +--text-base: 1rem; /* 16px - Body Text */ +--text-sm: 0.875rem; /* 14px - Small Text */ +--text-xs: 0.75rem; /* 12px - Caption */ + +/* Line Height */ +--leading-tight: 1.25; /* Heading */ +--leading-normal: 1.5; /* Body */ +--leading-relaxed: 1.625; /* Long Text */ +``` + +### 폰트 두께 +```css +--font-light: 300; /* Light text */ +--font-normal: 400; /* Body text */ +--font-medium: 500; /* Emphasis */ +--font-semibold: 600; /* Sub heading */ +--font-bold: 700; /* Heading */ +``` + +### 타이포그래피 클래스 +```css +/* Heading Styles */ +.heading-1 { font-size: 2.25rem; font-weight: 700; line-height: 1.25; } +.heading-2 { font-size: 1.875rem; font-weight: 600; line-height: 1.25; } +.heading-3 { font-size: 1.5rem; font-weight: 600; line-height: 1.25; } +.heading-4 { font-size: 1.25rem; font-weight: 500; line-height: 1.25; } + +/* Body Styles */ +.body-large { font-size: 1.125rem; font-weight: 400; line-height: 1.5; } +.body-normal { font-size: 1rem; font-weight: 400; line-height: 1.5; } +.body-small { font-size: 0.875rem; font-weight: 400; line-height: 1.5; } +.caption { font-size: 0.75rem; font-weight: 400; line-height: 1.25; } + +/* Emphasis */ +.text-emphasis { font-weight: 600; color: var(--gray-900); } +.text-muted { color: var(--gray-500); } +``` + +--- + +## 간격 시스템 + +### 기본 간격 단위 (8px 그리드 시스템) +```css +--space-0: 0; +--space-1: 0.25rem; /* 4px */ +--space-2: 0.5rem; /* 8px */ +--space-3: 0.75rem; /* 12px */ +--space-4: 1rem; /* 16px */ +--space-5: 1.25rem; /* 20px */ +--space-6: 1.5rem; /* 24px */ +--space-8: 2rem; /* 32px */ +--space-10: 2.5rem; /* 40px */ +--space-12: 3rem; /* 48px */ +--space-16: 4rem; /* 64px */ +--space-20: 5rem; /* 80px */ +``` + +### 컴포넌트별 간격 가이드 +- **Component Padding**: 16px (space-4) - 24px (space-6) +- **Content Margin**: 16px (space-4) - 32px (space-8) +- **Section Gap**: 32px (space-8) - 48px (space-12) +- **Page Padding**: 20px (space-5) - 40px (space-10) + +### 레이아웃 간격 +```css +/* Container */ +--container-padding-mobile: var(--space-4); /* 16px */ +--container-padding-tablet: var(--space-6); /* 24px */ +--container-padding-desktop: var(--space-8); /* 32px */ + +/* Grid Gap */ +--grid-gap-small: var(--space-4); /* 16px */ +--grid-gap-medium: var(--space-6); /* 24px */ +--grid-gap-large: var(--space-8); /* 32px */ +``` + +--- + +## 컴포넌트 스타일 + +### 버튼 (Button) +```css +/* Base Button */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--space-3) var(--space-6); + border-radius: 8px; + font-size: var(--text-base); + font-weight: var(--font-medium); + line-height: 1.5; + transition: all 0.2s ease-in-out; + cursor: pointer; + border: none; + min-height: 44px; /* 터치 접근성 */ +} + +/* Primary Button */ +.btn-primary { + background-color: var(--primary-500); + color: white; +} +.btn-primary:hover { + background-color: var(--primary-600); +} +.btn-primary:disabled { + background-color: var(--gray-300); + color: var(--gray-500); + cursor: not-allowed; +} + +/* Secondary Button */ +.btn-secondary { + background-color: white; + color: var(--gray-700); + border: 1px solid var(--gray-300); +} +.btn-secondary:hover { + background-color: var(--gray-50); + border-color: var(--gray-400); +} + +/* Danger Button */ +.btn-danger { + background-color: var(--error-500); + color: white; +} +.btn-danger:hover { + background-color: var(--error-600); +} +``` + +### 카드 (Card) +```css +.card { + background-color: white; + border-radius: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + padding: var(--space-6); + border: 1px solid var(--gray-200); +} + +.card-header { + margin-bottom: var(--space-4); + padding-bottom: var(--space-4); + border-bottom: 1px solid var(--gray-200); +} + +.card-title { + font-size: var(--text-xl); + font-weight: var(--font-semibold); + color: var(--gray-900); + margin: 0; +} + +.card-content { + color: var(--gray-700); +} +``` + +### 폼 요소 (Form) +```css +/* Input */ +.input { + width: 100%; + padding: var(--space-3) var(--space-4); + border: 1px solid var(--gray-300); + border-radius: 8px; + font-size: var(--text-base); + line-height: 1.5; + transition: border-color 0.2s ease-in-out; + min-height: 44px; +} + +.input:focus { + outline: none; + border-color: var(--primary-500); + box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1); +} + +.input.error { + border-color: var(--error-500); +} + +/* Label */ +.label { + display: block; + font-size: var(--text-sm); + font-weight: var(--font-medium); + color: var(--gray-700); + margin-bottom: var(--space-2); +} + +/* Select */ +.select { + appearance: none; + background-image: url("data:image/svg+xml,..."); /* 드롭다운 아이콘 */ + background-repeat: no-repeat; + background-position: right var(--space-3) center; + background-size: 16px; +} +``` + +### 알림 메시지 (Alert) +```css +.alert { + padding: var(--space-4); + border-radius: 8px; + border-left: 4px solid; + margin-bottom: var(--space-4); +} + +.alert-success { + background-color: var(--success-50); + border-color: var(--success-500); + color: var(--success-800); +} + +.alert-warning { + background-color: var(--warning-50); + border-color: var(--warning-500); + color: var(--warning-800); +} + +.alert-error { + background-color: var(--error-50); + border-color: var(--error-500); + color: var(--error-800); +} + +.alert-info { + background-color: var(--info-50); + border-color: var(--info-500); + color: var(--info-800); +} +``` + +--- + +## 반응형 브레이크포인트 + +### 브레이크포인트 정의 +```css +/* Mobile First Approach */ +:root { + --breakpoint-sm: 640px; /* Small devices */ + --breakpoint-md: 768px; /* Medium devices */ + --breakpoint-lg: 1024px; /* Large devices */ + --breakpoint-xl: 1280px; /* Extra large devices */ +} + +/* Media Query Mixins */ +@media (min-width: 640px) { /* sm */ } +@media (min-width: 768px) { /* md */ } +@media (min-width: 1024px) { /* lg */ } +@media (min-width: 1280px) { /* xl */ } +``` + +### 반응형 컨테이너 +```css +.container { + width: 100%; + margin: 0 auto; + padding: 0 var(--space-4); +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + padding: 0 var(--space-6); + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + padding: 0 var(--space-8); + } +} +``` + +### 반응형 그리드 +```css +.grid { + display: grid; + gap: var(--space-4); + grid-template-columns: 1fr; /* Mobile: 1 column */ +} + +@media (min-width: 768px) { + .grid-md-2 { + grid-template-columns: repeat(2, 1fr); /* Tablet: 2 columns */ + } +} + +@media (min-width: 1024px) { + .grid-lg-3 { + grid-template-columns: repeat(3, 1fr); /* Desktop: 3 columns */ + } +} +``` + +--- + +## 대상 서비스 특화 컴포넌트 + +### 요금 정보 카드 (Bill Card) +```css +.bill-card { + background: linear-gradient(135deg, var(--primary-500) 0%, var(--primary-600) 100%); + color: white; + padding: var(--space-6); + border-radius: 16px; + box-shadow: 0 4px 20px rgba(49, 130, 206, 0.2); +} + +.bill-amount { + font-size: var(--text-4xl); + font-weight: var(--font-bold); + margin-bottom: var(--space-2); +} + +.bill-period { + font-size: var(--text-sm); + opacity: 0.8; +} + +.bill-details { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 8px; + padding: var(--space-4); + margin-top: var(--space-4); +} +``` + +### 상품 비교 카드 (Product Card) +```css +.product-card { + border: 2px solid var(--gray-200); + border-radius: 12px; + padding: var(--space-6); + transition: all 0.3s ease; + position: relative; +} + +.product-card.selected { + border-color: var(--primary-500); + box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1); +} + +.product-card.current { + background-color: var(--success-50); + border-color: var(--success-500); +} + +.product-badge { + position: absolute; + top: -8px; + right: var(--space-4); + background-color: var(--primary-500); + color: white; + padding: var(--space-1) var(--space-3); + border-radius: 999px; + font-size: var(--text-xs); + font-weight: var(--font-medium); +} + +.product-price { + font-size: var(--text-2xl); + font-weight: var(--font-bold); + color: var(--primary-600); +} +``` + +### 진행 상태 표시 (Progress) +```css +.progress-container { + background-color: var(--gray-100); + border-radius: 999px; + height: 8px; + overflow: hidden; +} + +.progress-bar { + height: 100%; + background: linear-gradient(90deg, var(--primary-500) 0%, var(--primary-400) 100%); + border-radius: 999px; + transition: width 0.3s ease; +} + +.progress-steps { + display: flex; + justify-content: space-between; + margin-bottom: var(--space-4); +} + +.progress-step { + display: flex; + align-items: center; + font-size: var(--text-sm); + color: var(--gray-500); +} + +.progress-step.active { + color: var(--primary-600); + font-weight: var(--font-medium); +} + +.progress-step.completed { + color: var(--success-600); +} +``` + +### 상태 뱃지 (Status Badge) +```css +.status-badge { + display: inline-flex; + align-items: center; + padding: var(--space-1) var(--space-3); + border-radius: 999px; + font-size: var(--text-xs); + font-weight: var(--font-medium); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.status-badge.processing { + background-color: var(--warning-100); + color: var(--warning-800); +} + +.status-badge.completed { + background-color: var(--success-100); + color: var(--success-800); +} + +.status-badge.failed { + background-color: var(--error-100); + color: var(--error-800); +} + +.status-badge::before { + content: ""; + width: 6px; + height: 6px; + border-radius: 50%; + background-color: currentColor; + margin-right: var(--space-2); +} +``` + +--- + +## 인터랙션 패턴 + +### 애니메이션 타이밍 +```css +:root { + --duration-fast: 0.15s; + --duration-normal: 0.3s; + --duration-slow: 0.5s; + + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); +} +``` + +### 호버 효과 +```css +.interactive:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + transition: all var(--duration-normal) var(--ease-out); +} + +.btn:hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} +``` + +### 로딩 상태 +```css +.loading { + position: relative; + pointer-events: none; + opacity: 0.6; +} + +.loading::after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 20px; + height: 20px; + border: 2px solid var(--gray-300); + border-top: 2px solid var(--primary-500); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: translate(-50%, -50%) rotate(0deg); } + 100% { transform: translate(-50%, -50%) rotate(360deg); } +} +``` + +### 포커스 상태 +```css +.focusable:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.3); + border-radius: 8px; +} + +.focus-visible { + outline: 2px solid var(--primary-500); + outline-offset: 2px; +} +``` + +### 상태 전환 +```css +.fade-enter { + opacity: 0; +} +.fade-enter-active { + opacity: 1; + transition: opacity var(--duration-normal) var(--ease-out); +} + +.slide-enter { + transform: translateX(100%); +} +.slide-enter-active { + transform: translateX(0); + transition: transform var(--duration-normal) var(--ease-out); +} +``` + +--- + +## 변경 이력 + +| 버전 | 날짜 | 변경사항 | 작성자 | +|------|------|----------|--------| +| 1.0 | 2025-01-05 | 초기 스타일 가이드 작성 | 박화면 | + +--- + +## 스타일 가이드 활용 방법 + +### CSS 변수 사용 +모든 스타일 정의에서 CSS 변수를 사용하여 일관성을 유지하고 쉬운 테마 변경을 지원합니다. + +### 컴포넌트 기반 설계 +재사용 가능한 컴포넌트 스타일을 정의하여 개발 효율성과 일관성을 높입니다. + +### 접근성 고려 +모든 컴포넌트는 WCAG 2.1 AA 기준을 준수하여 접근성을 보장합니다. + +### 반응형 우선 +Mobile First 접근 방식으로 모든 디바이스에서 최적의 사용자 경험을 제공합니다. \ No newline at end of file diff --git a/design-backup/uiux/uiux.md b/design-backup/uiux/uiux.md new file mode 100644 index 0000000..12f6f94 --- /dev/null +++ b/design-backup/uiux/uiux.md @@ -0,0 +1,578 @@ +# 통신요금 관리 서비스 - UI/UX 설계서 + +- [통신요금 관리 서비스 - UI/UX 설계서](#통신요금-관리-서비스---uiux-설계서) + - [프로젝트 개요](#프로젝트-개요) + - [정보 아키텍처](#정보-아키텍처) + - [프로토타입 화면 목록](#프로토타입-화면-목록) + - [사용자 플로우](#사용자-플로우) + - [화면별 상세 설계](#화면별-상세-설계) + - [화면간 전환 및 네비게이션](#화면간-전환-및-네비게이션) + - [반응형 설계 전략](#반응형-설계-전략) + - [접근성 보장 방안](#접근성-보장-방안) + - [성능 최적화 방안](#성능-최적화-방안) + - [변경 이력](#변경-이력) + +--- + +## 프로젝트 개요 + +### 서비스 목적 +MVNO 고객의 통신요금 조회 및 상품변경을 지원하는 웹 서비스 + +### 주요 기능 +1. **사용자 인증**: 안전한 로그인/로그아웃 +2. **요금 조회**: 월별 통신요금 조회 +3. **상품 변경**: 요금제 변경 요청 및 처리 + +### 설계 기준 +- **유저스토리 기반**: 총 10개 유저스토리 100% 반영 +- **B2C 웹 서비스**: 일반 고객 대상 +- **보안 우선**: 개인정보 및 금융정보 보호 +- **사용성 중심**: 직관적이고 간단한 UI/UX + +--- + +## 정보 아키텍처 + +### 서비스 구조 +``` +통신요금 관리 서비스 +├── 인증 영역 +│ ├── 로그인 +│ └── 권한 확인 +├── 요금 조회 영역 +│ ├── 조회 메뉴 +│ ├── 조회 신청 +│ └── 조회 결과 +└── 상품 변경 영역 + ├── 변경 메뉴 + ├── 변경 화면 + ├── 변경 요청 + └── 처리 결과 +``` + +### 네비게이션 구조 +``` +메인 화면 +├── 요금 조회 메뉴 → 요금 조회 신청 → 조회 결과 +└── 상품 변경 메뉴 → 상품 변경 화면 → 변경 요청 → 처리 결과 +``` + +--- + +## 프로토타입 화면 목록 + +| 화면 ID | 화면명 | 관련 유저스토리 | 우선순위 | +|---------|--------|-----------------|----------| +| SCR-001 | 로그인 | UFR-AUTH-010 | M | +| SCR-002 | 메인 화면 | UFR-AUTH-020 | M | +| SCR-003 | 요금조회 메뉴 | UFR-BILL-010 | M | +| SCR-004 | 요금조회 결과 | UFR-BILL-020, UFR-BILL-030, UFR-BILL-040 | M | +| SCR-005 | 상품변경 메뉴 | UFR-PROD-010 | M | +| SCR-006 | 상품변경 화면 | UFR-PROD-020 | M | +| SCR-007 | 상품변경 요청 | UFR-PROD-030 | M | +| SCR-008 | 처리결과 화면 | UFR-PROD-040 | M | + +--- + +## 사용자 플로우 + +### 메인 플로우 +```mermaid +flowchart TD + A[로그인] --> B[메인 화면] + B --> C[요금 조회] + B --> D[상품 변경] + + C --> C1[요금조회 메뉴] + C1 --> C2[조회월 선택] + C2 --> C3[요금조회 결과] + C3 --> B + + D --> D1[상품변경 메뉴] + D1 --> D2[상품변경 화면] + D2 --> D3[상품 선택] + D3 --> D4[변경 요청] + D4 --> D5[처리결과] + D5 --> B +``` + +### 오류 처리 플로우 +```mermaid +flowchart TD + E1[로그인 실패] --> E1_1[오류 메시지 표시] --> E1_2[로그인 재시도] + E2[권한 없음] --> E2_1[권한 오류 메시지] --> E2_2[메인 화면] + E3[조회 실패] --> E3_1[조회 오류 메시지] --> E3_2[조회 메뉴] + E4[변경 실패] --> E4_1[변경 오류 메시지] --> E4_2[변경 화면] +``` + +--- + +## 화면별 상세 설계 + +### SCR-001: 로그인 +**개요** +- 목적: 사용자 인증 및 서비스 접근 +- 관련 유저스토리: UFR-AUTH-010 +- 비즈니스 중요도: M/5 + +**주요 기능** +- ID/Password 입력 +- 자동 로그인 옵션 +- 로그인 버튼 +- 오류 메시지 표시 + +**UI 구성요소** +``` +Header +├── 서비스 로고 +└── 서비스 제목 + +Main Content +├── 로그인 폼 +│ ├── ID 입력 필드 (required) +│ ├── Password 입력 필드 (required, type=password) +│ ├── 자동 로그인 체크박스 +│ └── 로그인 버튼 (primary) +└── 오류 메시지 영역 + +Footer +└── 저작권 정보 +``` + +**인터랙션** +- ID/Password 유효성 검사 (실시간) +- 로그인 버튼 활성화/비활성화 +- 5회 실패 시 계정 잠금 안내 +- 성공 시 메인 화면 이동 + +--- + +### SCR-002: 메인 화면 +**개요** +- 목적: 서비스 메뉴 제공 및 권한별 접근 제어 +- 관련 유저스토리: UFR-AUTH-020 +- 비즈니스 중요도: M/3 + +**주요 기능** +- 사용자 정보 표시 (회선번호) +- 서비스 메뉴 제공 +- 권한별 메뉴 표시/숨김 + +**UI 구성요소** +``` +Header +├── 서비스 로고 +├── 사용자 정보 (회선번호) +└── 로그아웃 버튼 + +Main Content +├── 환영 메시지 +└── 서비스 메뉴 그리드 + ├── 요금 조회 카드 (권한 확인) + └── 상품 변경 카드 (권한 확인) + +Footer +└── 저작권 정보 +``` + +**인터랙션** +- 권한 확인 후 메뉴 표시 +- 권한 없는 메뉴는 비활성화 또는 숨김 +- 카드 호버 효과 +- 카드 클릭 시 해당 서비스로 이동 + +--- + +### SCR-003: 요금조회 메뉴 +**개요** +- 목적: 요금 조회 옵션 제공 +- 관련 유저스토리: UFR-BILL-010 +- 비즈니스 중요도: M/5 + +**주요 기능** +- 회선번호 표시 +- 조회월 선택 옵션 +- 조회 신청 기능 + +**UI 구성요소** +``` +Header +├── 뒤로가기 버튼 +└── 페이지 제목 "요금 조회" + +Main Content +├── 고객 정보 섹션 +│ └── 회선번호 표시 +├── 조회 옵션 섹션 +│ ├── 조회월 선택 (드롭다운) +│ │ ├── 기본값: "현재 월" +│ │ └── 이전 6개월 옵션 +│ └── 안내 텍스트 +└── 액션 버튼 그룹 + ├── 조회 버튼 (primary) + └── 취소 버튼 (secondary) +``` + +**인터랙션** +- 조회월 드롭다운 선택 +- 조회 버튼 클릭 시 로딩 상태 +- 오류 시 에러 메시지 표시 + +--- + +### SCR-004: 요금조회 결과 +**개요** +- 목적: 조회된 요금 정보 표시 +- 관련 유저스토리: UFR-BILL-020, UFR-BILL-030, UFR-BILL-040 +- 비즈니스 중요도: M/8, M/13, M/8 + +**주요 기능** +- 요금 정보 상세 표시 +- 사용량 정보 제공 +- 새로운 조회 기능 + +**UI 구성요소** +``` +Header +├── 뒤로가기 버튼 +└── 페이지 제목 "요금 조회 결과" + +Main Content +├── 요금 정보 카드 +│ ├── 청구월 +│ ├── 상품명 (요금제) +│ ├── 총 요금 (강조 표시) +│ ├── 할인 정보 +│ └── 약정 정보 +├── 사용량 정보 카드 +│ ├── 통화 사용량 +│ ├── 데이터 사용량 +│ └── SMS 사용량 +├── 부가 정보 카드 +│ ├── 단말기 할부금 +│ ├── 예상 해지비용 +│ └── 청구/납부 정보 +└── 액션 버튼 그룹 + ├── 다른 월 조회 버튼 + └── 메인으로 버튼 +``` + +**인터랙션** +- 정보 카드 접기/펼치기 +- 다른 월 조회 클릭 시 조회 메뉴로 이동 +- 로딩 중 스켈레톤 UI 표시 + +--- + +### SCR-005: 상품변경 메뉴 +**개요** +- 목적: 상품 변경 진입점 제공 +- 관련 유저스토리: UFR-PROD-010 +- 비즈니스 중요도: M/5 + +**주요 기능** +- 고객 정보 표시 +- 현재 상품 정보 표시 +- 상품 변경 화면으로 이동 + +**UI 구성요소** +``` +Header +├── 뒤로가기 버튼 +└── 페이지 제목 "상품 변경" + +Main Content +├── 고객 정보 카드 +│ ├── 회선번호 +│ └── 고객ID +├── 현재 상품 정보 카드 +│ ├── 상품명 +│ ├── 월 기본료 +│ └── 주요 혜택 +├── 안내 메시지 +│ └── 상품 변경 시 주의사항 +└── 액션 버튼 그룹 + ├── 상품 변경하기 버튼 (primary) + └── 취소 버튼 (secondary) +``` + +**인터랙션** +- 현재 상품 정보 로딩 +- 상품 변경하기 클릭 시 변경 화면으로 이동 +- 로딩 실패 시 에러 메시지 + +--- + +### SCR-006: 상품변경 화면 +**개요** +- 목적: 변경 가능한 상품 목록 제공 +- 관련 유저스토리: UFR-PROD-020 +- 비즈니스 중요도: M/8 + +**주요 기능** +- 변경 가능한 상품 목록 표시 +- 상품 비교 기능 +- 상품 선택 기능 + +**UI 구성요소** +``` +Header +├── 뒤로가기 버튼 +└── 페이지 제목 "상품 선택" + +Main Content +├── 현재 상품 요약 (고정) +├── 상품 목록 섹션 +│ └── 상품 카드들 +│ ├── 상품명 +│ ├── 월 기본료 +│ ├── 주요 혜택 리스트 +│ ├── 현재 상품과 비교 +│ └── 선택 라디오 버튼 +└── 액션 버튼 그룹 (고정) + ├── 선택한 상품으로 변경 (primary, disabled) + └── 취소 버튼 (secondary) +``` + +**인터랙션** +- 상품 선택 시 버튼 활성화 +- 상품 카드 선택 상태 시각화 +- 스크롤 시 헤더와 버튼 고정 +- 상품 로딩 중 스켈레톤 표시 + +--- + +### SCR-007: 상품변경 요청 +**개요** +- 목적: 선택한 상품으로 변경 요청 확인 +- 관련 유저스토리: UFR-PROD-030 +- 비즈니스 중요도: M/13 + +**주요 기능** +- 변경 내용 확인 +- 사전 체크 진행 상황 +- 변경 요청 최종 실행 + +**UI 구성요소** +``` +Header +├── 뒤로가기 버튼 +└── 페이지 제목 "상품 변경 요청" + +Main Content +├── 변경 내용 확인 카드 +│ ├── 현재 상품 +│ ├── 변경 화살표 아이콘 +│ └── 변경할 상품 +├── 주의사항 섹션 +│ ├── 변경 시 주의사항 +│ ├── 약정/할부 안내 +│ └── 요금 변경 안내 +├── 진행 상황 표시 +│ ├── 사전 체크 진행 바 +│ └── 상태 메시지 +└── 액션 버튼 그룹 + ├── 변경 신청 버튼 (primary) + ├── 취소 버튼 (secondary) + └── 이전 단계 버튼 +``` + +**인터랙션** +- 사전 체크 진행 상태 실시간 업데이트 +- 체크 완료 후 변경 신청 버튼 활성화 +- 체크 실패 시 오류 메시지 및 재시도 옵션 + +--- + +### SCR-008: 처리결과 화면 +**개요** +- 목적: 상품 변경 처리 결과 표시 +- 관련 유저스토리: UFR-PROD-040 +- 비즈니스 중요도: M/21 + +**주요 기능** +- 처리 결과 상태 표시 +- 상세 처리 내용 제공 +- 후속 액션 안내 + +**UI 구성요소** +``` +Header +└── 페이지 제목 "처리 결과" + +Main Content +├── 결과 상태 카드 +│ ├── 성공/실패 아이콘 (대형) +│ ├── 결과 메시지 (제목) +│ └── 상태 설명 +├── 처리 내용 카드 (성공 시) +│ ├── 변경된 상품 정보 +│ ├── 적용일 +│ └── 처리 번호 +├── 실패 사유 카드 (실패 시) +│ ├── 실패 원인 +│ ├── 해결 방법 +│ └── 고객센터 안내 +└── 액션 버튼 그룹 + ├── 메인으로 버튼 (primary) + ├── 다시 시도 버튼 (실패 시) + └── 고객센터 연결 (실패 시) +``` + +**인터랙션** +- 결과에 따른 적절한 UI 표시 +- 성공/실패 상태별 차별화된 컬러 스킴 +- 추가 액션 버튼 제공 + +--- + +## 화면간 전환 및 네비게이션 + +### 네비게이션 패턴 +- **계층적 네비게이션**: 뒤로가기 버튼 제공 +- **브레드크럼**: 깊이 2단계 이상 시 경로 표시 +- **메인 복귀**: 모든 화면에서 홈 버튼 제공 + +### 전환 효과 +- **페이지 전환**: 부드러운 슬라이드 애니메이션 (300ms) +- **모달/팝업**: 페이드 인/아웃 효과 (200ms) +- **로딩 상태**: 스켈레톤 UI 또는 스피너 + +### URL 구조 +``` +/ → 로그인 페이지 +/main → 메인 화면 +/bill/menu → 요금조회 메뉴 +/bill/result → 요금조회 결과 +/product/menu → 상품변경 메뉴 +/product/change → 상품변경 화면 +/product/request → 상품변경 요청 +/product/result → 처리결과 +``` + +--- + +## 반응형 설계 전략 + +### 브레이크포인트 +- **Mobile**: ~ 767px +- **Tablet**: 768px ~ 1023px +- **Desktop**: 1024px ~ + +### 레이아웃 전략 +**Mobile First 설계** +- 기본: 단일 컬럼 레이아웃 +- 카드 형태의 콘텐츠 구성 +- 터치 친화적 버튼 크기 (44px 이상) + +**Tablet** +- 2컬럼 레이아웃 (카드 그리드) +- 사이드바 네비게이션 고려 +- 확장된 터치 영역 + +**Desktop** +- 3컬럼 레이아웃 가능 +- 고정 폭 컨테이너 (최대 1200px) +- 호버 상태 적극 활용 + +### 콘텐츠 우선순위 +1. **핵심 정보**: 항상 우선 표시 +2. **액션 버튼**: 고정 위치 (하단) +3. **부가 정보**: 접기/펼치기로 제어 + +--- + +## 접근성 보장 방안 + +### WCAG 2.1 AA 수준 준수 +**인식 가능성 (Perceivable)** +- 명도 대비 4.5:1 이상 유지 +- 대체 텍스트 제공 (모든 이미지) +- 텍스트 크기 조절 가능 (최대 200%) + +**운용 가능성 (Operable)** +- 키보드 접근성 완전 지원 +- 포커스 순서 논리적 구성 +- 자동 재생 콘텐츠 없음 + +**이해 가능성 (Understandable)** +- 명확한 언어 사용 +- 입력 오류 방지 및 수정 지원 +- 일관된 네비게이션 + +**견고성 (Robust)** +- 시맨틱 HTML 사용 +- ARIA 라벨 적절히 활용 +- 스크린 리더 호환성 + +### 구체적 구현 사항 +- **폼 요소**: 라벨과 입력 필드 명확한 연결 +- **버튼**: 명확한 텍스트 또는 aria-label +- **오류 메시지**: 명확한 위치와 해결 방법 안내 +- **로딩 상태**: aria-live를 통한 상태 알림 + +--- + +## 성능 최적화 방안 + +### 로딩 성능 +**초기 로딩** +- Critical CSS 인라인 처리 +- 이미지 지연 로딩 (Lazy Loading) +- 폰트 최적화 (font-display: swap) + +**코드 분할** +- 페이지별 번들 분리 +- 동적 import 활용 +- 트리 쉐이킹 적용 + +### 런타임 성능 +**상태 관리** +- 불필요한 리렌더링 방지 +- 메모이제이션 활용 +- 가상화 (긴 목록) + +**네트워크 최적화** +- API 응답 캐싱 +- 요청 중복 제거 +- 압축 및 minify + +### 사용자 경험 +**로딩 상태** +- 스켈레톤 UI 제공 +- 프로그레스바 표시 +- 오프라인 상태 대응 + +**오류 처리** +- 명확한 오류 메시지 +- 재시도 메커니즘 +- 폴백 UI 제공 + +### 성능 지표 목표 +- **First Contentful Paint**: < 1.5초 +- **Largest Contentful Paint**: < 2.5초 +- **First Input Delay**: < 100ms +- **Cumulative Layout Shift**: < 0.1 + +--- + +## 변경 이력 + +| 버전 | 날짜 | 변경사항 | 작성자 | +|------|------|----------|--------| +| 1.0 | 2025-01-05 | 초기 UI/UX 설계서 작성 | 박화면 | + +--- + +## 검토 사항 + +### 유저스토리 매칭 검토 ✅ +- 총 10개 유저스토리 100% 반영 +- 화면별 관련 유저스토리 명시 +- 불필요한 추가 설계 없음 + +### 설계 원칙 준수 ✅ +- 통신요금 관리 서비스 특화 설계 +- 보안성과 사용성 균형 +- 접근성 및 성능 고려 \ No newline at end of file diff --git a/design-backup/userstory.md b/design-backup/userstory.md new file mode 100644 index 0000000..340e409 --- /dev/null +++ b/design-backup/userstory.md @@ -0,0 +1,297 @@ +# 통신요금 관리 서비스 - 유저스토리 + +- [통신요금 관리 서비스 - 유저스토리](#통신요금-관리-서비스---유저스토리) + - [마이크로서비스 구성](#마이크로서비스-구성) + - [유저스토리](#유저스토리) + +--- + +## 마이크로서비스 구성 +1. **Auth** - 사용자 인증 및 인가 관리 +2. **Bill-Inquiry** - 요금 조회 서비스 +3. **Product-Change** - 상품 변경 서비스 + +--- + +## 유저스토리 + +``` +1. Auth 서비스 +1) 사용자 인증 및 인가 +UFR-AUTH-010: [사용자 로그인] MVNO 고객으로서 | 나는 통신요금을 관리하기 위해 | 안전하게 로그인하고 싶다. +- 시나리오: 고객 로그인 + MVNO 서비스에 접근한 상황에서 | ID와 Password를 입력하여 로그인 요청을 하면 | 인증이 완료되고 메인 화면이 표시된다. + + [입력 요구사항] + - 인증 정보 ID: 고객 식별자 입력 + - Password: 계정 비밀번호 입력 + - 자동 로그인: 선택 옵션 제공 + + [인증 처리] + - 성공: 메인 서비스 화면으로 이동 + - 실패: "ID 또는 비밀번호를 확인해주세요" 메시지 + - 5회 연속 실패: 30분간 계정 잠금 안내 + + [검증 요구사항] + - 계정이 있어야 함 + - 인증 정보의 정확성 검증 + - 세션 보안 처리 + +- M/5 + +--- + +UFR-AUTH-020: [사용자 인가] 인증된 고객으로서 | 나는 서비스별 접근 권한을 확인받기 위해 | 화면에 대한 접근권한이 부여되기를 원한다. +- 시나리오: 서비스 접근 권한 확인 + 로그인 완료 후 특정 서비스 화면에 접근한 상황에서 | 해당 서비스 이용 권한을 확인하면 | 권한이 있는 경우 서비스 화면이 표시된다. + + [접근 권한 확인] + - 요금 조회 서비스 접근권한 확인 + - 상품 변경 서비스 접근권한 확인 + - 권한별 메뉴 표시/숨김 처리 + + [권한 검증] + - 성공: 해당 서비스 화면 제공 + - 실패: "서비스 이용 권한이 없습니다" 메시지 표시 + - 접근 권한이 부여되어 있어야 함 + +- M/3 + +--- + +2. Bill-Inquiry 서비스 +1) 요금 조회 +UFR-BILL-010: [요금조회 메뉴 접근] MVNO 고객으로서 | 나는 내 통신요금을 확인하기 위해 | 요금 조회 메뉴를 요청하고 싶다. +- 시나리오: 요금조회 메뉴 표시 + 인증된 상태에서 | 요금 조회 메뉴를 요청하면 | 요금조회 메뉴가 화면에 표시된다. + + [메뉴 표시 요구사항] + - 요금 조회 메뉴 화면 제공 + - 고객 회선번호 표시 + - 조회월 선택 옵션 제공 + - 요금 조회 신청 버튼 활성화 + + [접근 권한] + - 요금 조회에 대한 접근권한이 부여되어 있어야 함 + - mvno AP server를 통한 화면 제공 + + [오류 처리] + - 메뉴 로딩 실패 시: "요금 조회 메뉴 로딩에 실패하였습니다" 메시지 + +- M/5 + +--- + +UFR-BILL-020: [요금조회 신청] MVNO 고객으로서 | 나는 특정 월의 통신요금을 확인하기 위해 | 조회월을 선택하여 요금 조회를 신청하고 싶다. +- 시나리오 1: 조회월 미선택 (기본 조회) + 요금조회 메뉴에서 | 조회월을 입력하지 않고 조회를 신청하면 | 조회시점 기준 당월 청구요금이 조회된다. + + [기본 조회 처리] + - 입력 데이터: 회선번호 + - 조회 대상: 현재 월 청구요금 + - 결과 확인: 조회시점 기준 당월 청구요금을 확인했다 + +- 시나리오 2: 조회월 선택 조회 + 요금조회 메뉴에서 | 특정 조회월을 선택하고 조회를 신청하면 | 해당 조회월의 청구요금이 조회된다. + + [선택 조회 처리] + - 입력 데이터: 회선번호, 조회월 + - 조회 대상: 선택한 월의 청구요금 + - 결과 확인: 조회월의 청구요금을 확인했다 + + [조회 선택 옵션] + - 조회월을 선택한다: 특정 월 선택하여 조회 + - 조회월을 선택하지 않는다: 당월 기준으로 조회 + + [처리 결과] + - 성공: 요금 조회가 신청되었다 + - 실패: "요금 조회 신청에 실패하였습니다" 메시지 + +- M/8 + +--- + +UFR-BILL-030: [KOS 요금조회 서비스 연동] 시스템으로서 | 나는 정확한 요금 정보를 제공하기 위해 | KOS의 요금 조회 서비스를 호출하고 응답을 처리하고 싶다. +- 시나리오: KOS 요금조회 API 호출 + 요금 조회 요청을 받은 상황에서 | 요금 조회 API를 호출하면 | KOS 요금 조회 서비스의 응답을 받아 처리한다. + + [API 호출 요구사항] + - 입력 데이터: 회선번호, 조회월 (선택) + - 호출 대상: KOS-Order 시스템 + - 호출 규격: KOS 요금조회 서비스가 요구하는 규격에 맞게 호출 + - 응답 처리: KOS 요금 조회 서비스의 응답을 받았다 + + [응답 데이터] + - 요금조회 결과 정보 + - 상품명: 현재 이용 중인 요금제 + - 약정정보: 계약 약정 조건 + - 청구월: 요금 청구 월 + - 요금: 청구 요금 금액 + - 할인정보: 적용된 할인 내역 + - 사용량: 통화, 데이터 사용량 + - 예상해지비용: 중도 해지 시 비용 + - 단말기할부금: 단말기 할부 잔액 + - 청구/납부정보: 요금 청구 및 납부 상태 + + [처리 결과] + - 성공: 요금 조회 API 호출에 성공하였다 + - 실패: 요금 조회 API 호출에 실패하였다 + +- M/13 + +--- + +UFR-BILL-040: [요금조회 결과 전송] 시스템으로서 | 나는 조회된 요금 정보를 고객에게 제공하기 위해 | MVNO AP로 조회 결과를 전송하고 연동 이력을 저장하고 싶다. +- 시나리오: 요금조회 결과 화면 출력 + KOS에서 요금조회 결과를 받은 상황에서 | MVNO AP로 결과를 전송하면 | 요금조회 결과가 화면에 출력되고 전송 이력이 기록된다. + + [결과 전송 처리] + - 전송 대상: mvno AP server + - 전송 데이터: 요금조회 결과 정보 (상품명, 청구월, 요금 등 전체) + - 화면 출력: 요금조회 결과를 화면에 출력한다 + - 이력 기록: 요금 조회 결과를 전송하고, 전송이력을 기록했다 + + [처리 이력 관리] + - 요금 조회 요청 이력: MVNO → MP + - 요청일시, 회선번호, 조회월 + - 요금 조회 처리 이력: MP → KOS + - 조회요청일시, 조회처리일시, 처리결과 + - 요청한 회선번호와 조회월 정보 + +- M/8 + +--- + +3. Product-Change 서비스 +1) 상품 변경 +UFR-PROD-010: [상품변경 메뉴 접근] MVNO 고객으로서 | 나는 내 요금제를 변경하기 위해 | 상품 변경 요청 메뉴를 요청하고 싶다. +- 시나리오: 상품변경 메뉴 표시 + 인증된 상태에서 | 상품 변경 요청 메뉴를 요청하면 | 상품변경 메뉴가 화면에 표시된다. + + [메뉴 표시 요구사항] + - 상품 변경 요청 메뉴 화면 제공 + - 고객 정보 표시 (회선번호, 고객ID) + - 현재 상품 정보 표시 + - 변경 가능한 상품 목록 제공 + + [접근 권한] + - 화면에 대한 접근권한이 부여되어 있어야 함 + - mvno AP server를 통한 화면 제공 + + [오류 처리] + - 메뉴 로딩 실패 시: "상품 변경 요청 메뉴 로딩에 실패하였습니다" 메시지 + +- M/5 + +--- + +UFR-PROD-020: [상품변경 화면 접근] MVNO 고객으로서 | 나는 상품을 선택하고 변경하기 위해 | 상품 변경 화면을 요청하고 싶다. +- 시나리오: 상품변경 화면 표시 + 상품변경 메뉴에서 | 상품 변경 화면을 요청하면 | 상품 선택 및 변경 요청이 가능한 화면이 표시된다. + + [화면 표시 요구사항] + - 고객정보 및 상품정보 조회 및 표시 + - 현재 이용 상품 정보 표시 + - 변경 가능한 상품 목록 제공 + - 상품 선택 및 변경 요청 기능 + + [데이터 조회] + - 고객정보 요청: KOS-Order 시스템에서 고객 정보 조회 + - 상품정보 요청: KOS-Order 시스템에서 상품 정보 조회 + - 조회 결과: 고객정보가 취득되었다, 상품 정보가 취득되었다 + + [처리 결과] + - 성공: 상품 변경 화면이 보였다 + - 실패: "상품 변경 화면 접속에 실패하였습니다" 메시지 + +- M/8 + +--- + +UFR-PROD-030: [상품변경 요청] MVNO 고객으로서 | 나는 더 나은 요금제로 변경하기 위해 | 원하는 상품을 선택하여 변경을 요청하고 싶다. +- 시나리오: 상품 선택 및 변경 요청 + 상품변경 화면에서 | 상품(요금제)을 선택 후 상품 변경 요청을 하면 | 변경 요청이 접수되고 사전 체크가 진행된다. + + [변경 요청 입력] + - 회선번호: 고객 회선 식별자 + - 변경 전 상품코드: 현재 이용 중인 상품 + - 변경 후 상품코드: 변경하려는 상품 + - 생성일시: 요청 일시 + + [상품 변경 사전 체크] + - 사전 체크 조건 + - 현재 판매중인 상품이어야 함 + - 변경 요청한 사업자에서 판매중인 상품이어야 함 + - 변경 요청 회선은 사용 중인 상태여야 함 (정지 상태가 아니어야 함) + - 사전체크 결과에서 정상(변경가능)으로 응답처리 되어야 함 + + [처리 결과] + - 성공: 상품 변경이 진행되었다, 상품 사전 체크에 성공하였다 + - 실패: 상품 사전 체크에 실패하였다 + +- M/13 + +--- + +UFR-PROD-040: [상품변경 처리] 시스템으로서 | 나는 승인된 상품 변경 요청을 완료하기 위해 | KOS 시스템과 연동하여 상품 변경을 처리하고 싶다. +- 시나리오 1: 상품 변경 성공 처리 + 사전 체크가 통과된 상황에서 | KOS에 상품 변경 처리를 요청하면 | 상품 변경이 완료되고 완료 결과가 전송된다. + + [성공 처리] + - 상품 변경 완료: 상품 변경이 완료되었다 + - 처리 결과 전송: 변경 후 상품 코드, 상품 변경 처리 결과(정상), 메시지 + - 화면 출력: 상품 변경 완료 문구를 화면에 출력한다 + - 이력 기록: 상품 변경 처리하고 연동 이력을 기록한다 + +- 시나리오 2: 상품 변경 실패 처리 + 사전 체크는 통과했으나 실제 변경 처리 중 문제가 발생한 상황에서 | 변경 처리가 실패하면 | 실패 사유에 따른 안내 메시지가 표시된다. + + [실패 처리] + - 변경 실패: 상품 변경이 실패했다, 상품 변경 요청을 실패하였다 + - 처리 결과 전송: 변경 후 상품 코드, 상품 변경 처리 결과(실패), 실패 메시지 + - 화면 출력: 상품 변경에 실패하여 실패 사유에 따라 문구를 화면에 출력한다 + - 이력 기록: 상품 변경 실패 처리하고 실패 이력을 기록한다 + + [처리 이력 관리] + - 상품 변경 요청 이력: MVNO → MP + - 회선번호, 변경 전 상품코드, 변경 후 상품코드, 생성일시 + - 상품 변경 처리 이력: MP → KOS + - 회선번호, 변경 전/후 상품코드, 처리 결과, 처리 메시지 + +- M/21 + +--- + +``` + +## 데이터 관계 +``` +고객 (1) : (N) 요금조회 +고객 (1) : (N) 상품변경 +고객정보 - 고객ID, 회선번호, 상품정보 +상품정보 - 상품코드, 상품명, 가격 정보 +요청이력 - 요청일시, 처리일시, 처리결과 +처리이력 - 연동 시스템, 요청/응답 데이터, 처리결과 +``` + +## 주요 기술 고려사항 + +### 외부 시스템 연동 +- **KOS-Order 시스템**: 실제 통신사 백엔드 시스템과의 안정적 연동 필요 +- **MVNO AP Server**: 프론트엔드 시스템과의 실시간 통신 처리 +- **Circuit Breaker**: 외부 시스템 장애 시 서비스 가용성 확보 + +### 보안 및 인증 +- **인증/인가**: 고객 정보 보호를 위한 강력한 인증 체계 +- **데이터 암호화**: 민감한 고객 정보 및 요금 정보 암호화 +- **세션 관리**: 안전한 세션 처리 및 타임아웃 관리 + +### 성능 및 안정성 +- **응답 시간**: KOS 연동 API의 안정적 응답 시간 확보 +- **이력 관리**: 모든 요청/처리 이력의 정확한 기록 및 추적 +- **오류 처리**: 각 단계별 명확한 오류 메시지 및 복구 방안 + +### 데이터 일관성 +- **트랜잭션 처리**: 상품 변경 시 데이터 일관성 보장 +- **이력 동기화**: 요청/처리 이력의 정확한 동기화 +- **상태 관리**: 각 요청의 상태 추적 및 관리 \ No newline at end of file diff --git a/sample-data/monthly-bills.json b/sample-data/monthly-bills.json new file mode 100644 index 0000000..e109204 --- /dev/null +++ b/sample-data/monthly-bills.json @@ -0,0 +1,358 @@ +{ + "2025-01": { + "userId": "user123", + "month": "2025-01", + "basicFee": 55000, + "callFee": 12500, + "dataFee": 8500, + "smsFee": 2500, + "roamingFee": 0, + "discountFee": -5500, + "totalFee": 72500, + "paymentStatus": "PAID", + "dueDate": "2025-01-25", + "paymentDate": "2025-01-22", + "plan": { + "name": "5G 프리미엄", + "basicFee": 55000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 850, + "dataGB": 25.6, + "smsCount": 125 + } + }, + "2025-02": { + "userId": "user123", + "month": "2025-02", + "basicFee": 55000, + "callFee": 18200, + "dataFee": 15000, + "smsFee": 3200, + "roamingFee": 45000, + "discountFee": -8500, + "totalFee": 127900, + "paymentStatus": "PAID", + "dueDate": "2025-02-25", + "paymentDate": "2025-02-26", + "plan": { + "name": "5G 프리미엄", + "basicFee": 55000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 1240, + "dataGB": 42.3, + "smsCount": 160 + }, + "roamingUsage": { + "country": "일본", + "days": 5, + "dataGB": 2.8 + } + }, + "2025-03": { + "userId": "user123", + "month": "2025-03", + "basicFee": 55000, + "callFee": 9800, + "dataFee": 3200, + "smsFee": 1800, + "roamingFee": 0, + "discountFee": -6500, + "totalFee": 63300, + "paymentStatus": "PAID", + "dueDate": "2025-03-25", + "paymentDate": "2025-03-20", + "plan": { + "name": "5G 프리미엄", + "basicFee": 55000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 670, + "dataGB": 18.9, + "smsCount": 90 + } + }, + "2025-04": { + "userId": "user123", + "month": "2025-04", + "basicFee": 55000, + "callFee": 22400, + "dataFee": 25000, + "smsFee": 4500, + "roamingFee": 0, + "discountFee": -12000, + "totalFee": 94900, + "paymentStatus": "PAID", + "dueDate": "2025-04-25", + "paymentDate": "2025-04-24", + "plan": { + "name": "5G 프리미엄", + "basicFee": 55000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 1520, + "dataGB": 67.2, + "smsCount": 225 + }, + "specialUsage": { + "internationalCall": { + "minutes": 45, + "fee": 15000 + } + } + }, + "2025-05": { + "userId": "user123", + "month": "2025-05", + "basicFee": 39000, + "callFee": 8500, + "dataFee": 18500, + "smsFee": 1200, + "roamingFee": 0, + "discountFee": -3900, + "totalFee": 63300, + "paymentStatus": "PAID", + "dueDate": "2025-05-25", + "paymentDate": "2025-05-23", + "plan": { + "name": "5G 스탠다드", + "basicFee": 39000, + "dataLimit": "100GB" + }, + "usage": { + "callMinutes": 580, + "dataGB": 95.6, + "smsCount": 60 + }, + "planChangeInfo": { + "previousPlan": "5G 프리미엄", + "changeDate": "2025-05-01", + "reason": "요금절약" + } + }, + "2025-06": { + "userId": "user123", + "month": "2025-06", + "basicFee": 39000, + "callFee": 15600, + "dataFee": 32000, + "smsFee": 2800, + "roamingFee": 125000, + "discountFee": -7800, + "totalFee": 206600, + "paymentStatus": "OVERDUE", + "dueDate": "2025-06-25", + "paymentDate": null, + "plan": { + "name": "5G 스탠다드", + "basicFee": 39000, + "dataLimit": "100GB" + }, + "usage": { + "callMinutes": 1060, + "dataGB": 156.8, + "smsCount": 140 + }, + "roamingUsage": { + "country": "미국", + "days": 10, + "dataGB": 8.2, + "callMinutes": 320 + }, + "overdueInfo": { + "overdueAmount": 206600, + "lateFee": 10000, + "overdueDays": 15 + } + }, + "2025-07": { + "userId": "user123", + "month": "2025-07", + "basicFee": 39000, + "callFee": 11200, + "dataFee": 45000, + "smsFee": 1500, + "roamingFee": 0, + "discountFee": -9500, + "totalFee": 87200, + "paymentStatus": "PAID", + "dueDate": "2025-07-25", + "paymentDate": "2025-07-10", + "plan": { + "name": "5G 스탠다드", + "basicFee": 39000, + "dataLimit": "100GB" + }, + "usage": { + "callMinutes": 760, + "dataGB": 178.9, + "smsCount": 75 + }, + "extraCharges": { + "dataOverage": { + "overGB": 78.9, + "ratePerGB": 1000, + "fee": 45000 + } + } + }, + "2025-08": { + "userId": "user123", + "month": "2025-08", + "basicFee": 69000, + "callFee": 9800, + "dataFee": 0, + "smsFee": 2200, + "roamingFee": 0, + "discountFee": -15000, + "totalFee": 66000, + "paymentStatus": "PAID", + "dueDate": "2025-08-25", + "paymentDate": "2025-08-20", + "plan": { + "name": "5G 플래티넘", + "basicFee": 69000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 670, + "dataGB": 89.2, + "smsCount": 110 + }, + "planChangeInfo": { + "previousPlan": "5G 스탠다드", + "changeDate": "2025-08-01", + "reason": "데이터 초과 방지" + }, + "promotions": [ + { + "name": "신규가입 할인", + "discountAmount": 10000, + "remainingMonths": 8 + } + ] + }, + "2025-09": { + "userId": "user123", + "month": "2025-09", + "basicFee": 69000, + "callFee": 25600, + "dataFee": 0, + "smsFee": 5200, + "roamingFee": 78000, + "discountFee": -13800, + "totalFee": 164000, + "paymentStatus": "PENDING", + "dueDate": "2025-09-25", + "paymentDate": null, + "plan": { + "name": "5G 플래티넘", + "basicFee": 69000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 1740, + "dataGB": 124.7, + "smsCount": 260 + }, + "roamingUsage": { + "country": "유럽(독일, 프랑스)", + "days": 14, + "dataGB": 15.6, + "callMinutes": 560 + } + }, + "2025-10": { + "userId": "user123", + "month": "2025-10", + "basicFee": 69000, + "callFee": 13400, + "dataFee": 0, + "smsFee": 1800, + "roamingFee": 0, + "discountFee": -8500, + "totalFee": 75700, + "paymentStatus": "PAID", + "dueDate": "2025-10-25", + "paymentDate": "2025-10-22", + "plan": { + "name": "5G 플래티넘", + "basicFee": 69000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 910, + "dataGB": 67.3, + "smsCount": 90 + } + }, + "2025-11": { + "userId": "user123", + "month": "2025-11", + "basicFee": 69000, + "callFee": 18900, + "dataFee": 0, + "smsFee": 3600, + "roamingFee": 0, + "discountFee": -12000, + "totalFee": 79500, + "paymentStatus": "PAID", + "dueDate": "2025-11-25", + "paymentDate": "2025-11-18", + "plan": { + "name": "5G 플래티넘", + "basicFee": 69000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 1285, + "dataGB": 145.8, + "smsCount": 180 + }, + "specialEvents": [ + { + "name": "블랙프라이데이 데이터 보너스", + "bonusDataGB": 50, + "validUntil": "2025-11-30" + } + ] + }, + "2025-12": { + "userId": "user123", + "month": "2025-12", + "basicFee": 69000, + "callFee": 32500, + "dataFee": 0, + "smsFee": 6800, + "roamingFee": 0, + "discountFee": -18000, + "totalFee": 90300, + "paymentStatus": "CURRENT", + "dueDate": "2025-12-25", + "paymentDate": null, + "plan": { + "name": "5G 플래티넘", + "basicFee": 69000, + "dataLimit": "무제한" + }, + "usage": { + "callMinutes": 2210, + "dataGB": 198.4, + "smsCount": 340 + }, + "yearEndSummary": { + "totalPaidAmount": 1021900, + "averageMonthlyBill": 93810, + "totalDataUsageGB": 1312.7, + "totalCallMinutes": 13497, + "totalSmsCount": 1825, + "planChanges": 3, + "roamingCountries": ["일본", "미국", "독일", "프랑스"] + } + } +} \ No newline at end of file