From dea202a3fd6e21a09039902e95c44e05c86974c8 Mon Sep 17 00:00:00 2001
From: sunmingLee <25thbam@gmail.com>
Date: Thu, 23 Oct 2025 17:19:48 +0900
Subject: [PATCH] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?=
=?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EC=A0=95=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../architecture-pattern-backup-20251021.md | 1008 -----
TEMP_BACKUP/pattern/architecture-pattern.md | 685 ----
TEMP_BACKUP/prototype/00-로그인.html | 414 ---
TEMP_BACKUP/prototype/01-회원가입.html | 347 --
TEMP_BACKUP/prototype/02-매장정보등록.html | 770 ----
TEMP_BACKUP/prototype/03-홈화면.html | 470 ---
TEMP_BACKUP/prototype/04-이벤트목적선택.html | 516 ---
.../prototype/05-AI트렌드분석결과.html | 680 ----
.../prototype/06-AI이벤트상품추천.html | 602 ---
TEMP_BACKUP/prototype/07-AI참여방법설계.html | 859 -----
TEMP_BACKUP/prototype/08-AI홍보문구생성.html | 931 -----
TEMP_BACKUP/prototype/09-AI이미지생성.html | 743 ----
.../prototype/10-이벤트기획안승인.html | 719 ----
TEMP_BACKUP/prototype/11-AI영상제작.html | 506 ---
TEMP_BACKUP/prototype/12-SNS콘텐츠생성.html | 758 ----
TEMP_BACKUP/prototype/13-QR포스터생성.html | 805 ----
.../prototype/14-QR포스터생성선택.html | 561 ---
.../prototype/15-QR포스터상세설정.html | 628 ----
TEMP_BACKUP/prototype/16-콘텐츠편집.html | 699 ----
TEMP_BACKUP/prototype/17-콘텐츠최종승인.html | 733 ----
TEMP_BACKUP/prototype/18-배포채널선택.html | 1279 -------
TEMP_BACKUP/prototype/19-배포진행상태.html | 1144 ------
.../prototype/20-오프라인자료다운로드.html | 1026 -----
TEMP_BACKUP/prototype/21-이벤트참여.html | 993 -----
TEMP_BACKUP/prototype/22-참여완료.html | 905 -----
TEMP_BACKUP/prototype/23-당첨자명단관리.html | 1098 ------
TEMP_BACKUP/prototype/24-실시간대시보드.html | 939 -----
TEMP_BACKUP/prototype/25-채널별성과분석.html | 837 -----
TEMP_BACKUP/prototype/26-ROI분석.html | 883 -----
TEMP_BACKUP/prototype/27-분석리포트.html | 910 -----
TEMP_BACKUP/prototype/28-이벤트목록.html | 846 -----
TEMP_BACKUP/prototype/29-마이페이지.html | 727 ----
TEMP_BACKUP/prototype/CHECKLIST.md | 413 --
TEMP_BACKUP/prototype/TEST-REPORT.md | 314 --
TEMP_BACKUP/prototype/backup/01-로그인.html | 246 --
TEMP_BACKUP/prototype/backup/02-홈화면.html | 262 --
TEMP_BACKUP/prototype/backup/03-회원가입.html | 324 --
.../backup/04-1-AI이벤트유형추천.html | 550 ---
.../prototype/backup/04-2-이벤트상세정보.html | 624 ----
.../prototype/backup/04-매장정보등록.html | 843 -----
.../prototype/backup/05-이벤트목적선택.html | 540 ---
.../backup/06-1-AI트렌드분석결과.html | 538 ---
.../prototype/backup/06-2-이벤트상세정보.html | 624 ----
.../prototype/backup/06-AI이벤트유형추천.html | 696 ----
.../prototype/backup/06-AI트렌드분석결과.html | 644 ----
.../prototype/backup/07-AI이벤트상품추천.html | 686 ----
.../prototype/backup/08-AI참여방법설계.html | 510 ---
.../prototype/backup/09-AI홍보문구생성.html | 504 ---
.../prototype/backup/10-AI영상제작.html | 648 ----
.../prototype/backup/10-이벤트기획안승인.html | 619 ---
.../prototype/backup/11-AI이미지생성.html | 390 --
.../prototype/backup/12-SNS콘텐츠생성.html | 483 ---
.../prototype/backup/13-QR포스터생성선택.html | 240 --
.../prototype/backup/15-콘텐츠편집.html | 325 --
.../prototype/backup/16-콘텐츠최종승인.html | 279 --
.../prototype/backup/17-배포채널선택.html | 386 --
.../prototype/backup/18-배포진행상태.html | 364 --
.../backup/19-오프라인자료다운로드.html | 166 -
.../prototype/backup/22-당첨자명단관리.html | 432 ---
.../prototype/backup/23-실시간대시보드.html | 330 --
.../prototype/backup/24-채널별성과분석.html | 522 ---
.../prototype/backup/25-광고수익률분석.html | 393 --
.../prototype/backup/25-마이페이지.html | 480 ---
.../prototype/backup/26-분석리포트.html | 385 --
.../prototype/backup/26-이벤트목록.html | 365 --
TEMP_BACKUP/prototype/backup/css/common.css | 888 -----
TEMP_BACKUP/prototype/backup/js/common.js | 555 ---
.../backup/temp05-이벤트목적선택.html | 498 ---
TEMP_BACKUP/prototype/css/common.css | 478 ---
.../prototype/css/components/buttons.css | 247 --
.../prototype/css/components/cards.css | 292 --
.../prototype/css/components/inputs.css | 339 --
.../prototype/css/components/loaders.css | 321 --
.../prototype/css/components/modals.css | 390 --
.../prototype/css/components/navigation.css | 308 --
TEMP_BACKUP/prototype/css/layout.css | 304 --
TEMP_BACKUP/prototype/css/navigation.css | 45 -
TEMP_BACKUP/prototype/css/reset.css | 210 --
TEMP_BACKUP/prototype/css/variables.css | 273 --
TEMP_BACKUP/prototype/js/common.js | 375 --
TEMP_BACKUP/prototype/js/form.js | 315 --
TEMP_BACKUP/prototype/js/modal.js | 418 ---
TEMP_BACKUP/prototype/js/navigation.js | 296 --
TEMP_BACKUP/prototype/사용자여정맵.md | 303 --
TEMP_BACKUP/prototype/파일명변경계획.md | 64 -
TEMP_BACKUP/uiux.md | 3312 -----------------
TEMP_BACKUP/userstory-table.md | 358 --
TEMP_BACKUP/userstory.md | 1437 -------
claudedocs/prototype-analysis.md | 339 --
debug/final-validation.log | 104 -
.../ai-트렌드분석및추천.puml.error.txt | 32 -
.../ai-트렌드분석및추천.puml.png | Bin 228178 -> 0 bytes
.../analytics-대시보드조회-캐시미스.puml.png | Bin 156619 -> 0 bytes
.../analytics-대시보드조회-캐시히트.puml.png | Bin 46346 -> 0 bytes
.../analytics-배포완료구독.puml.error.txt | Bin 20032 -> 0 bytes
.../analytics-배포완료구독.puml.png | Bin 112997 -> 0 bytes
.../analytics-이벤트생성구독.puml.error.txt | Bin 19056 -> 0 bytes
.../analytics-이벤트생성구독.puml.png | Bin 77359 -> 0 bytes
.../analytics-참여자등록구독.puml.error.txt | Bin 19472 -> 0 bytes
.../analytics-참여자등록구독.puml.png | Bin 81836 -> 0 bytes
.../content-이미지생성.puml.error.txt | 32 -
.../content-이미지생성.puml.png | Bin 188944 -> 0 bytes
.../distribution-다중채널배포.puml.error.txt | 32 -
.../distribution-다중채널배포.puml.png | Bin 206666 -> 0 bytes
.../distribution-배포상태조회.puml.error.txt | Bin 21309 -> 0 bytes
.../distribution-배포상태조회.puml.png | Bin 169659 -> 0 bytes
.../event-AI추천요청.puml.error.txt | Bin 26257 -> 0 bytes
.../puml-validation/event-AI추천요청.puml.png | Bin 44757 -> 0 bytes
.../event-대시보드조회.puml.error.txt | 32 -
.../event-대시보드조회.puml.png | Bin 69824 -> 0 bytes
.../event-목록조회.puml.error.txt | Bin 27321 -> 0 bytes
debug/puml-validation/event-목록조회.puml.png | Bin 68793 -> 0 bytes
debug/puml-validation/event-목적선택.puml.png | Bin 38853 -> 0 bytes
debug/puml-validation/event-상세조회.puml.png | Bin 42876 -> 0 bytes
.../event-이미지결과조회.puml.error.txt | Bin 26009 -> 0 bytes
.../event-이미지결과조회.puml.png | Bin 39587 -> 0 bytes
.../event-이미지생성요청.puml.error.txt | Bin 28472 -> 0 bytes
.../event-이미지생성요청.puml.png | Bin 48092 -> 0 bytes
.../event-최종승인및배포.puml.error.txt | Bin 18053 -> 0 bytes
.../event-최종승인및배포.puml.png | Bin 68112 -> 0 bytes
.../event-추천결과조회.puml.png | Bin 36570 -> 0 bytes
.../event-콘텐츠선택.puml.error.txt | Bin 15608 -> 0 bytes
.../puml-validation/event-콘텐츠선택.puml.png | Bin 45380 -> 0 bytes
.../participation-당첨자추첨.puml.error.txt | Bin 28621 -> 0 bytes
.../participation-당첨자추첨.puml.png | Bin 149196 -> 0 bytes
.../participation-이벤트참여.puml.error.txt | Bin 26861 -> 0 bytes
.../participation-이벤트참여.puml.png | Bin 106653 -> 0 bytes
...articipation-참여자목록조회.puml.error.txt | Bin 24195 -> 0 bytes
.../participation-참여자목록조회.puml.png | Bin 99765 -> 0 bytes
.../user-로그아웃.puml.error.txt | 32 -
debug/puml-validation/user-로그아웃.puml.png | Bin 80496 -> 0 bytes
.../user-로그인.puml.error.txt | 32 -
debug/puml-validation/user-로그인.puml.png | Bin 107595 -> 0 bytes
.../user-프로필수정.puml.error.txt | 32 -
.../puml-validation/user-프로필수정.puml.png | Bin 150468 -> 0 bytes
.../user-회원가입.puml.error.txt | 32 -
debug/puml-validation/user-회원가입.puml.png | Bin 171832 -> 0 bytes
debug/puml-validation/validation-errors.txt | 0
debug/puml-validation/validation-result.txt | 30 -
.../고객참여플로우.puml.error.txt | Bin 24689 -> 0 bytes
debug/puml-validation/고객참여플로우.puml.png | Bin 122148 -> 0 bytes
.../사용자인증플로우.puml.error.txt | Bin 23239 -> 0 bytes
.../puml-validation/사용자인증플로우.puml.png | Bin 164802 -> 0 bytes
.../성과분석플로우.puml.error.txt | Bin 26289 -> 0 bytes
debug/puml-validation/성과분석플로우.puml.png | Bin 182250 -> 0 bytes
.../이벤트생성플로우.puml.error.txt | 32 -
.../puml-validation/이벤트생성플로우.puml.png | Bin 192044 -> 0 bytes
debug/test-complex.png | Bin 14565 -> 0 bytes
debug/test-complex.puml | 23 -
debug/test-no-newline.png | Bin 14523 -> 0 bytes
debug/test-no-newline.puml | 23 -
debug/test-short-stereotype.png | Bin 14560 -> 0 bytes
debug/test-short-stereotype.puml | 24 -
debug/test-simple.png | Bin 14372 -> 0 bytes
debug/test-simple.puml | 24 -
debug/test-stereotype.png | Bin 4034 -> 0 bytes
debug/test-stereotype.puml | 11 -
debug/test-user-회원가입.png | Bin 171832 -> 0 bytes
debug/test-utf8.png | Bin 14077 -> 0 bytes
159 files changed, 53038 deletions(-)
delete mode 100644 TEMP_BACKUP/pattern/architecture-pattern-backup-20251021.md
delete mode 100644 TEMP_BACKUP/pattern/architecture-pattern.md
delete mode 100644 TEMP_BACKUP/prototype/00-로그인.html
delete mode 100644 TEMP_BACKUP/prototype/01-회원가입.html
delete mode 100644 TEMP_BACKUP/prototype/02-매장정보등록.html
delete mode 100644 TEMP_BACKUP/prototype/03-홈화면.html
delete mode 100644 TEMP_BACKUP/prototype/04-이벤트목적선택.html
delete mode 100644 TEMP_BACKUP/prototype/05-AI트렌드분석결과.html
delete mode 100644 TEMP_BACKUP/prototype/06-AI이벤트상품추천.html
delete mode 100644 TEMP_BACKUP/prototype/07-AI참여방법설계.html
delete mode 100644 TEMP_BACKUP/prototype/08-AI홍보문구생성.html
delete mode 100644 TEMP_BACKUP/prototype/09-AI이미지생성.html
delete mode 100644 TEMP_BACKUP/prototype/10-이벤트기획안승인.html
delete mode 100644 TEMP_BACKUP/prototype/11-AI영상제작.html
delete mode 100644 TEMP_BACKUP/prototype/12-SNS콘텐츠생성.html
delete mode 100644 TEMP_BACKUP/prototype/13-QR포스터생성.html
delete mode 100644 TEMP_BACKUP/prototype/14-QR포스터생성선택.html
delete mode 100644 TEMP_BACKUP/prototype/15-QR포스터상세설정.html
delete mode 100644 TEMP_BACKUP/prototype/16-콘텐츠편집.html
delete mode 100644 TEMP_BACKUP/prototype/17-콘텐츠최종승인.html
delete mode 100644 TEMP_BACKUP/prototype/18-배포채널선택.html
delete mode 100644 TEMP_BACKUP/prototype/19-배포진행상태.html
delete mode 100644 TEMP_BACKUP/prototype/20-오프라인자료다운로드.html
delete mode 100644 TEMP_BACKUP/prototype/21-이벤트참여.html
delete mode 100644 TEMP_BACKUP/prototype/22-참여완료.html
delete mode 100644 TEMP_BACKUP/prototype/23-당첨자명단관리.html
delete mode 100644 TEMP_BACKUP/prototype/24-실시간대시보드.html
delete mode 100644 TEMP_BACKUP/prototype/25-채널별성과분석.html
delete mode 100644 TEMP_BACKUP/prototype/26-ROI분석.html
delete mode 100644 TEMP_BACKUP/prototype/27-분석리포트.html
delete mode 100644 TEMP_BACKUP/prototype/28-이벤트목록.html
delete mode 100644 TEMP_BACKUP/prototype/29-마이페이지.html
delete mode 100644 TEMP_BACKUP/prototype/CHECKLIST.md
delete mode 100644 TEMP_BACKUP/prototype/TEST-REPORT.md
delete mode 100644 TEMP_BACKUP/prototype/backup/01-로그인.html
delete mode 100644 TEMP_BACKUP/prototype/backup/02-홈화면.html
delete mode 100644 TEMP_BACKUP/prototype/backup/03-회원가입.html
delete mode 100644 TEMP_BACKUP/prototype/backup/04-1-AI이벤트유형추천.html
delete mode 100644 TEMP_BACKUP/prototype/backup/04-2-이벤트상세정보.html
delete mode 100644 TEMP_BACKUP/prototype/backup/04-매장정보등록.html
delete mode 100644 TEMP_BACKUP/prototype/backup/05-이벤트목적선택.html
delete mode 100644 TEMP_BACKUP/prototype/backup/06-1-AI트렌드분석결과.html
delete mode 100644 TEMP_BACKUP/prototype/backup/06-2-이벤트상세정보.html
delete mode 100644 TEMP_BACKUP/prototype/backup/06-AI이벤트유형추천.html
delete mode 100644 TEMP_BACKUP/prototype/backup/06-AI트렌드분석결과.html
delete mode 100644 TEMP_BACKUP/prototype/backup/07-AI이벤트상품추천.html
delete mode 100644 TEMP_BACKUP/prototype/backup/08-AI참여방법설계.html
delete mode 100644 TEMP_BACKUP/prototype/backup/09-AI홍보문구생성.html
delete mode 100644 TEMP_BACKUP/prototype/backup/10-AI영상제작.html
delete mode 100644 TEMP_BACKUP/prototype/backup/10-이벤트기획안승인.html
delete mode 100644 TEMP_BACKUP/prototype/backup/11-AI이미지생성.html
delete mode 100644 TEMP_BACKUP/prototype/backup/12-SNS콘텐츠생성.html
delete mode 100644 TEMP_BACKUP/prototype/backup/13-QR포스터생성선택.html
delete mode 100644 TEMP_BACKUP/prototype/backup/15-콘텐츠편집.html
delete mode 100644 TEMP_BACKUP/prototype/backup/16-콘텐츠최종승인.html
delete mode 100644 TEMP_BACKUP/prototype/backup/17-배포채널선택.html
delete mode 100644 TEMP_BACKUP/prototype/backup/18-배포진행상태.html
delete mode 100644 TEMP_BACKUP/prototype/backup/19-오프라인자료다운로드.html
delete mode 100644 TEMP_BACKUP/prototype/backup/22-당첨자명단관리.html
delete mode 100644 TEMP_BACKUP/prototype/backup/23-실시간대시보드.html
delete mode 100644 TEMP_BACKUP/prototype/backup/24-채널별성과분석.html
delete mode 100644 TEMP_BACKUP/prototype/backup/25-광고수익률분석.html
delete mode 100644 TEMP_BACKUP/prototype/backup/25-마이페이지.html
delete mode 100644 TEMP_BACKUP/prototype/backup/26-분석리포트.html
delete mode 100644 TEMP_BACKUP/prototype/backup/26-이벤트목록.html
delete mode 100644 TEMP_BACKUP/prototype/backup/css/common.css
delete mode 100644 TEMP_BACKUP/prototype/backup/js/common.js
delete mode 100644 TEMP_BACKUP/prototype/backup/temp05-이벤트목적선택.html
delete mode 100644 TEMP_BACKUP/prototype/css/common.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/buttons.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/cards.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/inputs.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/loaders.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/modals.css
delete mode 100644 TEMP_BACKUP/prototype/css/components/navigation.css
delete mode 100644 TEMP_BACKUP/prototype/css/layout.css
delete mode 100644 TEMP_BACKUP/prototype/css/navigation.css
delete mode 100644 TEMP_BACKUP/prototype/css/reset.css
delete mode 100644 TEMP_BACKUP/prototype/css/variables.css
delete mode 100644 TEMP_BACKUP/prototype/js/common.js
delete mode 100644 TEMP_BACKUP/prototype/js/form.js
delete mode 100644 TEMP_BACKUP/prototype/js/modal.js
delete mode 100644 TEMP_BACKUP/prototype/js/navigation.js
delete mode 100644 TEMP_BACKUP/prototype/사용자여정맵.md
delete mode 100644 TEMP_BACKUP/prototype/파일명변경계획.md
delete mode 100644 TEMP_BACKUP/uiux.md
delete mode 100644 TEMP_BACKUP/userstory-table.md
delete mode 100644 TEMP_BACKUP/userstory.md
delete mode 100644 claudedocs/prototype-analysis.md
delete mode 100644 debug/final-validation.log
delete mode 100644 debug/puml-validation/ai-트렌드분석및추천.puml.error.txt
delete mode 100644 debug/puml-validation/ai-트렌드분석및추천.puml.png
delete mode 100644 debug/puml-validation/analytics-대시보드조회-캐시미스.puml.png
delete mode 100644 debug/puml-validation/analytics-대시보드조회-캐시히트.puml.png
delete mode 100644 debug/puml-validation/analytics-배포완료구독.puml.error.txt
delete mode 100644 debug/puml-validation/analytics-배포완료구독.puml.png
delete mode 100644 debug/puml-validation/analytics-이벤트생성구독.puml.error.txt
delete mode 100644 debug/puml-validation/analytics-이벤트생성구독.puml.png
delete mode 100644 debug/puml-validation/analytics-참여자등록구독.puml.error.txt
delete mode 100644 debug/puml-validation/analytics-참여자등록구독.puml.png
delete mode 100644 debug/puml-validation/content-이미지생성.puml.error.txt
delete mode 100644 debug/puml-validation/content-이미지생성.puml.png
delete mode 100644 debug/puml-validation/distribution-다중채널배포.puml.error.txt
delete mode 100644 debug/puml-validation/distribution-다중채널배포.puml.png
delete mode 100644 debug/puml-validation/distribution-배포상태조회.puml.error.txt
delete mode 100644 debug/puml-validation/distribution-배포상태조회.puml.png
delete mode 100644 debug/puml-validation/event-AI추천요청.puml.error.txt
delete mode 100644 debug/puml-validation/event-AI추천요청.puml.png
delete mode 100644 debug/puml-validation/event-대시보드조회.puml.error.txt
delete mode 100644 debug/puml-validation/event-대시보드조회.puml.png
delete mode 100644 debug/puml-validation/event-목록조회.puml.error.txt
delete mode 100644 debug/puml-validation/event-목록조회.puml.png
delete mode 100644 debug/puml-validation/event-목적선택.puml.png
delete mode 100644 debug/puml-validation/event-상세조회.puml.png
delete mode 100644 debug/puml-validation/event-이미지결과조회.puml.error.txt
delete mode 100644 debug/puml-validation/event-이미지결과조회.puml.png
delete mode 100644 debug/puml-validation/event-이미지생성요청.puml.error.txt
delete mode 100644 debug/puml-validation/event-이미지생성요청.puml.png
delete mode 100644 debug/puml-validation/event-최종승인및배포.puml.error.txt
delete mode 100644 debug/puml-validation/event-최종승인및배포.puml.png
delete mode 100644 debug/puml-validation/event-추천결과조회.puml.png
delete mode 100644 debug/puml-validation/event-콘텐츠선택.puml.error.txt
delete mode 100644 debug/puml-validation/event-콘텐츠선택.puml.png
delete mode 100644 debug/puml-validation/participation-당첨자추첨.puml.error.txt
delete mode 100644 debug/puml-validation/participation-당첨자추첨.puml.png
delete mode 100644 debug/puml-validation/participation-이벤트참여.puml.error.txt
delete mode 100644 debug/puml-validation/participation-이벤트참여.puml.png
delete mode 100644 debug/puml-validation/participation-참여자목록조회.puml.error.txt
delete mode 100644 debug/puml-validation/participation-참여자목록조회.puml.png
delete mode 100644 debug/puml-validation/user-로그아웃.puml.error.txt
delete mode 100644 debug/puml-validation/user-로그아웃.puml.png
delete mode 100644 debug/puml-validation/user-로그인.puml.error.txt
delete mode 100644 debug/puml-validation/user-로그인.puml.png
delete mode 100644 debug/puml-validation/user-프로필수정.puml.error.txt
delete mode 100644 debug/puml-validation/user-프로필수정.puml.png
delete mode 100644 debug/puml-validation/user-회원가입.puml.error.txt
delete mode 100644 debug/puml-validation/user-회원가입.puml.png
delete mode 100644 debug/puml-validation/validation-errors.txt
delete mode 100644 debug/puml-validation/validation-result.txt
delete mode 100644 debug/puml-validation/고객참여플로우.puml.error.txt
delete mode 100644 debug/puml-validation/고객참여플로우.puml.png
delete mode 100644 debug/puml-validation/사용자인증플로우.puml.error.txt
delete mode 100644 debug/puml-validation/사용자인증플로우.puml.png
delete mode 100644 debug/puml-validation/성과분석플로우.puml.error.txt
delete mode 100644 debug/puml-validation/성과분석플로우.puml.png
delete mode 100644 debug/puml-validation/이벤트생성플로우.puml.error.txt
delete mode 100644 debug/puml-validation/이벤트생성플로우.puml.png
delete mode 100644 debug/test-complex.png
delete mode 100644 debug/test-complex.puml
delete mode 100644 debug/test-no-newline.png
delete mode 100644 debug/test-no-newline.puml
delete mode 100644 debug/test-short-stereotype.png
delete mode 100644 debug/test-short-stereotype.puml
delete mode 100644 debug/test-simple.png
delete mode 100644 debug/test-simple.puml
delete mode 100644 debug/test-stereotype.png
delete mode 100644 debug/test-stereotype.puml
delete mode 100644 debug/test-user-회원가입.png
delete mode 100644 debug/test-utf8.png
diff --git a/TEMP_BACKUP/pattern/architecture-pattern-backup-20251021.md b/TEMP_BACKUP/pattern/architecture-pattern-backup-20251021.md
deleted file mode 100644
index 36e0593..0000000
--- a/TEMP_BACKUP/pattern/architecture-pattern-backup-20251021.md
+++ /dev/null
@@ -1,1008 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 클라우드 아키텍처 패턴 선정서
-
-**작성일**: 2025-10-21
-**작성자**: System Architect (박영자)
-**버전**: 1.0
-
----
-
-## 1. 요구사항 분석
-
-### 1.1 마이크로서비스별 기능 및 비기능 요구사항
-
-#### 1.1.1 User 서비스
-**기능 요구사항**:
-- 회원가입/로그인 (JWT 인증)
-- 매장 정보 관리 및 사업자번호 검증
-- KT 인증 시스템 연동
-
-**비기능 요구사항**:
-- 응답시간: 1초 이내
-- 가용성: 99.9%
-- 보안: 개인정보 암호화 (AES-256), HTTPS/TLS
-- 확장성: 1,000 동시 사용자
-
-**기술적 도전과제**:
-- 외부 사업자번호 검증 API 의존성
-- 인증 토큰 관리 및 세션 유지
-- 개인정보 보호 규정 준수
-
----
-
-#### 1.1.2 Event Planning 서비스
-**기능 요구사항**:
-- AI 기반 업종/지역 트렌드 분석
-- AI 이벤트상품 추천 (Claude API)
-- AI 참여 방법 설계
-- AI 홍보 문구 생성 (GPT-4 API)
-
-**비기능 요구사항**:
-- **응답시간: 10초 이내 (전체 기획 과정)** ⚡
-- AI API 병렬 호출 필수
-- 추첨형/선착순형 이벤트 자동 프로세스 분기
-- 확장성: 100개 동시 이벤트 기획
-
-**기술적 도전과제**:
-- **Claude + GPT-4 API 병렬 호출 및 응답 시간 관리**
-- AI 프롬프트 최적화로 10초 목표 달성
-- 트렌드 데이터베이스 실시간 조회 성능
-- 응답 캐싱 전략
-
----
-
-#### 1.1.3 Content Generation 서비스
-**기능 요구사항**:
-- AI 이미지 생성 (Stable Diffusion, 3종)
-- AI 영상 제작 (15초)
-- SNS 콘텐츠 자동 생성 (플랫폼별 최적화)
-- QR 포스터 생성
-
-**비기능 요구사항**:
-- **응답시간: 5-8분 이내 (병렬 처리 시)** ⚡
-- 이미지 생성: 2-3분 (Stable Diffusion 특성)
-- 영상 제작: 3-5분 (AI 영상 엔진 특성)
-- GPU 가속 활용
-- 확장성: 50개 동시 콘텐츠 생성
-
-**기술적 도전과제**:
-- **이미지 3종 + 영상 1개 병렬 생성**
-- 진행 상황 실시간 피드백
-- 백그라운드 비동기 처리 필수
-- 품질과 속도 균형 유지
-
----
-
-#### 1.1.4 Distribution 서비스
-**기능 요구사항**:
-- 다중 채널 배포 (우리동네TV, 링고비즈, 지니TV, Instagram, Naver Blog, Kakao Channel)
-- 네이버 클로바 TTS 연동 (연결음 생성)
-- 배포 실패 시 자동 재시도 (3회)
-
-**비기능 요구사항**:
-- **응답시간: 1분 이내 (전체 배포 과정)** ⚡
-- 채널별 병렬 배포 필수
-- 배포 상태 실시간 업데이트
-- 확장성: 100개 동시 배포
-
-**기술적 도전과제**:
-- **6개 외부 API 병렬 호출 및 통합**
-- API 장애 대응 (Circuit Breaker, Retry)
-- 네이버 클로바 TTS 품질 보장
-- 배포 실패 복구 전략
-
----
-
-#### 1.1.5 Participation 서비스
-**기능 요구사항**:
-- 이벤트 참여 신청 및 중복 방지
-- 추첨형 자동 추첨 (매장 방문 고객 가산점)
-- 선착순형 쿠폰 소진 시 자동 종료
-- 당첨 알림 발송 (SMS/카카오 알림톡)
-
-**비기능 요구사항**:
-- 응답시간: 1초 이내
-- 1인 1회 참여 보장 (멱등성)
-- 공정한 추첨 알고리즘
-- 확장성: 10,000 동시 참여
-
-**기술적 도전과제**:
-- 중복 참여 방지 (전화번호 기준)
-- 추첨형/선착순형 프로세스 분기
-- 대량 SMS/알림톡 발송
-- 매장 방문 고객 가산점 처리
-
----
-
-#### 1.1.6 Analytics 서비스
-**기능 요구사항**:
-- 실시간 대시보드 (참여자 수, 노출 수, 매출 증가율)
-- 5분 간격 데이터 수집 및 업데이트
-- 채널별 성과 분석 (Instagram, Naver Blog, Kakao Channel API)
-- ROI 자동 계산
-- 분석 리포트 PDF 생성
-
-**비기능 요구사항**:
-- **데이터 수집 주기: 5분 간격** ⏱
-- 실시간 데이터 시각화
-- 확장성: 100개 이벤트 동시 분석
-
-**기술적 도전과제**:
-- **다중 데이터 소스 통합 (KT API, POS, SNS API)**
-- CQRS 패턴으로 읽기/쓰기 분리
-- 5분 간격 스케줄러 기반 수집
-- 대시보드 실시간 업데이트
-
----
-
-#### 1.1.7 AI Learning 서비스
-**기능 요구사항**:
-- 이벤트 결과 분석 및 개선안 생성
-- 성공 패턴 학습 및 재활용
-- 다음 이벤트 아이디어 제안 (시즌별)
-
-**비기능 요구사항**:
-- 빅데이터 분석 시스템 연동
-- AI 머신러닝 엔진 API 호출
-- 학습 데이터 누적 및 모델 개선
-- 확장성: 누적 데이터 기반 지속적 학습
-
-**기술적 도전과제**:
-- 성공/실패 패턴 자동 학습
-- 업종별/지역별 데이터 축적
-- 추천 정확도 향상 알고리즘
-- Event Sourcing으로 학습 데이터 추적
-
----
-
-### 1.2 통합 분석 및 핵심 도전과제
-
-#### 성능 목표 요약
-| 서비스 | 목표 응답시간 | 핵심 최적화 전략 |
-|--------|--------------|------------------|
-| Event Planning | **10초 이내** | AI API 병렬 호출, 응답 캐싱 |
-| Content Generation | **5-8분 이내** | 이미지+영상 병렬 생성, 비동기 처리 |
-| Distribution | **1분 이내** | 6개 채널 병렬 배포 |
-| Analytics | **5분 주기** | CQRS 읽기/쓰기 분리, 스케줄러 수집 |
-
-#### 확장성 요구사항
-- **동시 이벤트 처리**: 최소 100개
-- **AI API 동시 호출**: 최소 50개
-- **배포 API 동시 호출**: 최소 100개
-
-#### 외부 시스템 의존성
-- **KT 채널**: 우리동네TV, 링고비즈, 지니TV
-- **AI API**: Claude, GPT-4, Stable Diffusion
-- **SNS**: Instagram, Naver Blog, Kakao Channel
-- **기타**: 네이버 클로바 TTS, 사업자번호 검증, POS 시스템
-
----
-
-## 2. 클라우드 아키텍처 패턴 선정
-
-### 2.1 패턴 평가 매트릭스
-
-#### 핵심 패턴 Top 10 정량 평가
-
-| 패턴 | 기능 적합성 (35%) | 성능 효과 (25%) | 운영 복잡도 (20%) | 확장성 (15%) | 비용 효율성 (5%) | **총점** | **우선순위** |
-|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| **API Gateway** | 10 × 0.35 = 3.5 | 9 × 0.25 = 2.25 | 9 × 0.20 = 1.8 | 9 × 0.15 = 1.35 | 8 × 0.05 = 0.4 | **9.30** | 🥇 1위 |
-| **Async Request-Reply** | 10 × 0.35 = 3.5 | 9 × 0.25 = 2.25 | 7 × 0.20 = 1.4 | 8 × 0.15 = 1.2 | 7 × 0.05 = 0.35 | **8.70** | 🥈 2위 |
-| **Circuit Breaker** | 9 × 0.35 = 3.15 | 7 × 0.25 = 1.75 | 8 × 0.20 = 1.6 | 8 × 0.15 = 1.2 | 8 × 0.05 = 0.4 | **8.10** | 🥉 3위 |
-| **CQRS** | 9 × 0.35 = 3.15 | 9 × 0.25 = 2.25 | 5 × 0.20 = 1.0 | 8 × 0.15 = 1.2 | 6 × 0.05 = 0.3 | **7.90** | 4위 |
-| **Cache-Aside** | 8 × 0.35 = 2.8 | 9 × 0.25 = 2.25 | 9 × 0.20 = 1.8 | 7 × 0.15 = 1.05 | 9 × 0.05 = 0.45 | **8.35** | 5위 |
-| **Event Sourcing** | 9 × 0.35 = 3.15 | 7 × 0.25 = 1.75 | 4 × 0.20 = 0.8 | 9 × 0.15 = 1.35 | 5 × 0.05 = 0.25 | **7.30** | 6위 |
-| **Queue-Based Load Leveling** | 8 × 0.35 = 2.8 | 8 × 0.25 = 2.0 | 7 × 0.20 = 1.4 | 9 × 0.15 = 1.35 | 7 × 0.05 = 0.35 | **7.90** | 7위 |
-| **Retry** | 7 × 0.35 = 2.45 | 6 × 0.25 = 1.5 | 9 × 0.20 = 1.8 | 6 × 0.15 = 0.9 | 9 × 0.05 = 0.45 | **7.10** | 8위 |
-| **Publisher-Subscriber** | 8 × 0.35 = 2.8 | 7 × 0.25 = 1.75 | 6 × 0.20 = 1.2 | 8 × 0.15 = 1.2 | 7 × 0.05 = 0.35 | **7.30** | 9위 |
-| **Choreography** | 7 × 0.35 = 2.45 | 6 × 0.25 = 1.5 | 5 × 0.20 = 1.0 | 8 × 0.15 = 1.2 | 6 × 0.05 = 0.3 | **6.45** | 10위 |
-
----
-
-### 2.2 선정 패턴 및 적용 전략
-
-#### 🥇 **1. API Gateway** (총점: 9.30) - Phase 1 MVP
-
-**선정 이유**:
-- 단일 진입점으로 7개 마이크로서비스 라우팅
-- 인증/인가 중앙 처리 (JWT 토큰 검증)
-- Rate Limiting으로 100개 동시 이벤트 관리
-- 횡단 관심사 분리 (로깅, 모니터링)
-
-**적용 서비스**: 전체 서비스
-
-**예상 효과**:
-- 클라이언트 요청 단순화 (1개 엔드포인트)
-- 인증 처리 시간 50% 단축
-- 서비스 간 결합도 감소
-
----
-
-#### 🥈 **2. Async Request-Reply** (총점: 8.70) - Phase 1 MVP
-
-**선정 이유**:
-- **Content Generation 서비스의 5-8분 처리 시간 대응**
-- 이미지/영상 생성 백그라운드 처리
-- 진행 상황 실시간 피드백 (WebSocket/폴링)
-- 클라이언트 블로킹 방지
-
-**적용 서비스**: Content Generation, AI Learning
-
-**예상 효과**:
-- 사용자 대기 시간 체감 80% 감소
-- 시스템 응답성 향상
-- 동시 콘텐츠 생성 50개 처리 가능
-
-**구현 예시**:
-```javascript
-// 클라이언트: 콘텐츠 생성 요청
-const response = await axios.post('/api/content/generate', {
- eventId: 'evt-001',
- imageCount: 3
-});
-const jobId = response.data.jobId; // Job ID 발급
-
-// 상태 폴링 (5초 간격)
-const checkStatus = setInterval(async () => {
- const status = await axios.get(`/api/content/status/${jobId}`);
- if (status.data.completed) {
- clearInterval(checkStatus);
- // 콘텐츠 다운로드
- }
-}, 5000);
-```
-
----
-
-#### 🥉 **3. Circuit Breaker** (총점: 8.10) - Phase 1 MVP
-
-**선정 이유**:
-- **6개 외부 API 장애 대응 (KT 채널, AI API, SNS)**
-- Distribution 서비스의 배포 실패 방지
-- API 장애 시 빠른 실패 및 폴백
-- 연쇄 장애 전파 차단
-
-**적용 서비스**: Distribution, Event Planning, Content Generation
-
-**예상 효과**:
-- API 장애 시 응답 시간 95% 단축
-- 시스템 가용성 99.9% 보장
-- 배포 성공률 98% 이상 유지
-
-**구현 예시** (Node.js with opossum):
-```javascript
-const CircuitBreaker = require('opossum');
-
-// 우리동네TV API 호출
-const callWooridongneTV = async (data) => {
- return axios.post('https://api.wooridongne.kt.com/deploy', data);
-};
-
-const breaker = new CircuitBreaker(callWooridongneTV, {
- timeout: 15000, // 15초 타임아웃
- errorThresholdPercentage: 50, // 50% 실패 시 OPEN
- resetTimeout: 30000 // 30초 후 재시도
-});
-
-breaker.fallback(() => ({ success: false, message: '우리동네TV 배포 실패' }));
-
-// 배포 요청
-const result = await breaker.fire(deployData);
-```
-
----
-
-#### **4. Cache-Aside** (총점: 8.35) - Phase 1 MVP
-
-**선정 이유**:
-- Event Planning 서비스의 10초 응답 목표 달성
-- 트렌드 데이터베이스 조회 성능 향상
-- AI API 응답 캐싱 (동일 조건 재사용)
-- Redis 활용 고속 캐싱
-
-**적용 서비스**: Event Planning, Analytics
-
-**예상 효과**:
-- 트렌드 분석 응답 시간 70% 단축 (3초 → 0.9초)
-- AI API 호출 횟수 40% 감소
-- 비용 절감 (AI API 사용량 감소)
-
-**구현 예시**:
-```javascript
-// 트렌드 데이터 조회 (캐시 우선)
-const getTrendData = async (industry, region) => {
- const cacheKey = `trend:${industry}:${region}`;
-
- // 1. 캐시 조회
- let data = await redis.get(cacheKey);
-
- if (data) {
- return JSON.parse(data); // 캐시 히트
- }
-
- // 2. DB 조회
- data = await db.query('SELECT * FROM trends WHERE industry = ? AND region = ?', [industry, region]);
-
- // 3. 캐시 저장 (TTL: 1시간)
- await redis.setex(cacheKey, 3600, JSON.stringify(data));
-
- return data;
-};
-```
-
----
-
-#### **5. CQRS** (총점: 7.90) - Phase 2 확장
-
-**선정 이유**:
-- **Analytics 서비스의 읽기/쓰기 분리**
-- 실시간 대시보드 조회 성능 최적화
-- 5분 간격 데이터 수집과 실시간 조회 분리
-- 읽기 전용 DB로 복잡한 집계 쿼리 처리
-
-**적용 서비스**: Analytics
-
-**예상 효과**:
-- 대시보드 조회 속도 80% 향상
-- 쓰기 작업 영향 없이 읽기 확장 가능
-- 복잡한 ROI 계산 성능 개선
-
-**아키텍처**:
-```mermaid
-graph LR
- Client[클라이언트] --> ReadAPI[읽기 API]
- Client --> WriteAPI[쓰기 API]
-
- WriteAPI --> CommandDB[(Command DB 쓰기 전용)]
- CommandDB --> EventBus[이벤트 버스]
- EventBus --> ReadDB[(Query DB 읽기 전용)]
- ReadAPI --> ReadDB
-```
-
----
-
-#### **6. Event Sourcing** (총점: 7.30) - Phase 3 고도화
-
-**선정 이유**:
-- AI Learning 서비스의 학습 데이터 추적
-- 이벤트 전체 이력 저장 및 재생
-- 감사 추적 (Audit Trail) 요구사항 충족
-- 성공/실패 패턴 분석 정확도 향상
-
-**적용 서비스**: AI Learning, Participation
-
-**예상 효과**:
-- AI 학습 정확도 30% 향상
-- 데이터 멱등성 100% 보장
-- 과거 데이터 재분석 가능
-
----
-
-#### **7. Queue-Based Load Leveling** (총점: 7.90) - Phase 2 확장
-
-**선정 이유**:
-- Distribution 서비스의 배포 요청 급증 대응
-- 100개 동시 배포 요청 큐잉 처리
-- 백엔드 서비스 부하 평준화
-- 배포 실패 재시도 관리
-
-**적용 서비스**: Distribution, Content Generation
-
-**예상 효과**:
-- 피크 타임 안정성 99.9% 유지
-- 배포 성공률 98% 이상
-- 시스템 과부하 방지
-
----
-
-#### **8. Retry** (총점: 7.10) - Phase 1 MVP
-
-**선정 이유**:
-- Distribution 서비스의 배포 실패 자동 재시도 (3회)
-- 외부 API 일시적 오류 복구
-- Circuit Breaker와 조합 사용
-
-**적용 서비스**: Distribution, Event Planning
-
-**예상 효과**:
-- 배포 성공률 15% 향상
-- 일시적 네트워크 오류 자동 복구
-
----
-
-#### **9. Publisher-Subscriber** (총점: 7.30) - Phase 2 확장
-
-**선정 이유**:
-- 이벤트 완료 시 다중 서비스 알림 (Analytics, AI Learning)
-- 서비스 간 결합도 감소
-- 비동기 이벤트 처리
-
-**적용 서비스**: 전체 서비스 (이벤트 기반 통신)
-
-**예상 효과**:
-- 서비스 간 결합도 70% 감소
-- 새로운 서비스 추가 용이성
-
----
-
-#### **10. Choreography** (총점: 6.45) - Phase 3 고도화
-
-**선정 이유**:
-- Saga 패턴 대안으로 중앙 조정자 없는 워크플로
-- Event Planning → Content Generation → Distribution 자율 조정
-- 확장성 및 유연성 향상
-
-**적용 서비스**: 이벤트 생성 워크플로
-
-**예상 효과**:
-- 워크플로 확장성 향상
-- 중앙 병목 현상 제거
-
----
-
-## 3. 서비스별 패턴 적용 설계
-
-### 3.1 전체 아키텍처 구조
-
-```mermaid
-graph TB
- subgraph "클라이언트"
- Web[웹 애플리케이션]
- Mobile[모바일 앱]
- end
-
- subgraph "API Gateway Layer"
- Gateway[API Gateway 인증/인가/라우팅/Rate Limiting]
- end
-
- subgraph "마이크로서비스"
- User[User 서비스 회원/매장 관리]
- Planning[Event Planning 서비스 AI 이벤트 기획 Cache-Aside]
- Content[Content Generation 서비스 AI 콘텐츠 생성 Async Request-Reply]
- Dist[Distribution 서비스 다중 채널 배포 Circuit Breaker + Retry]
- Participation[Participation 서비스 참여/추첨 관리]
- Analytics[Analytics 서비스 효과 측정 CQRS]
- AILearn[AI Learning 서비스 학습/개선 Event Sourcing]
- end
-
- subgraph "데이터 계층"
- UserDB[(User DB PostgreSQL)]
- PlanningDB[(Planning DB MongoDB)]
- ContentDB[(Content DB MongoDB)]
- DistDB[(Distribution DB PostgreSQL)]
- PartDB[(Participation DB PostgreSQL)]
-
- subgraph "CQRS - Analytics"
- WriteDB[(Command DB 쓰기)]
- ReadDB[(Query DB 읽기)]
- end
-
- EventStore[(Event Store AI Learning)]
-
- Cache[(Redis Cache Cache-Aside)]
- end
-
- subgraph "메시지 큐"
- Queue[RabbitMQ/Kafka Queue-Based Load Leveling Pub-Sub]
- end
-
- subgraph "외부 시스템"
- KTAPI[KT 채널 API 우리동네TV/링고비즈/지니TV]
- AIAPI[AI API Claude/GPT-4/Stable Diffusion]
- SNS[SNS API Instagram/Naver/Kakao]
- Clova[네이버 클로바 TTS]
- POS[POS 시스템]
- end
-
- Web --> Gateway
- Mobile --> Gateway
-
- Gateway --> User
- Gateway --> Planning
- Gateway --> Content
- Gateway --> Dist
- Gateway --> Participation
- Gateway --> Analytics
- Gateway --> AILearn
-
- User --> UserDB
- Planning --> PlanningDB
- Planning --> Cache
- Content --> ContentDB
- Content --> Queue
- Dist --> DistDB
- Dist --> Queue
- Participation --> PartDB
- Analytics --> WriteDB
- Analytics --> ReadDB
- WriteDB --> Queue
- Queue --> ReadDB
- AILearn --> EventStore
-
- Planning -->|Circuit Breaker| AIAPI
- Content -->|Circuit Breaker| AIAPI
- Dist -->|Circuit Breaker + Retry| KTAPI
- Dist -->|Circuit Breaker + Retry| SNS
- Dist -->|Circuit Breaker| Clova
- Analytics --> KTAPI
- Analytics --> SNS
- Analytics --> POS
-
- Queue -->|Pub-Sub| Analytics
- Queue -->|Pub-Sub| AILearn
-```
-
----
-
-### 3.2 Event Planning 서비스 - 10초 응답 최적화
-
-**패턴 적용**:
-- **Cache-Aside**: 트렌드 데이터 캐싱
-- **Circuit Breaker**: Claude + GPT-4 API 장애 대응
-- **병렬 처리**: AI API 동시 호출
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Planning as Event Planning
- participant Cache as Redis Cache
- participant DB as Planning DB
- participant Claude as Claude API
- participant GPT4 as GPT-4 API
-
- Client->>Gateway: 이벤트 기획 시작
- Gateway->>Planning: 기획 요청
-
- Note over Planning,Cache: Phase 1: 트렌드 분석 (3초 목표)
- Planning->>Cache: 트렌드 데이터 조회
- alt 캐시 히트
- Cache-->>Planning: 캐시 데이터 반환
- else 캐시 미스
- Planning->>DB: DB 조회
- DB-->>Planning: 트렌드 데이터
- Planning->>Cache: 캐시 저장 (TTL: 1시간)
- end
-
- Note over Planning,GPT4: Phase 2: AI 병렬 호출 (7초 목표)
- par Claude: 이벤트상품 + 참여방법
- Planning->>Claude: 이벤트상품 추천 요청 + 참여방법 설계 요청
- Claude-->>Planning: 추천 결과 (5초)
- and GPT-4: 홍보문구
- Planning->>GPT4: 홍보문구 생성 요청
- GPT4-->>Planning: 홍보문구 (4초)
- end
-
- Planning->>DB: 기획안 저장
- Planning-->>Gateway: 완성된 기획안 (총 10초 이내)
- Gateway-->>Client: 기획안 제공
-```
-
-**예상 성과**:
-- **총 응답시간: 10초 이내** (목표 달성)
-- 트렌드 분석: 3초 → 0.9초 (캐시 히트 시)
-- AI API 병렬 호출: 9초 → 5초
-
----
-
-### 3.3 Content Generation 서비스 - 비동기 처리
-
-**패턴 적용**:
-- **Async Request-Reply**: 5-8분 장시간 처리
-- **Queue-Based Load Leveling**: 동시 50개 콘텐츠 생성
-- **Circuit Breaker**: Stable Diffusion API 장애 대응
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Content as Content Generation
- participant Queue as RabbitMQ
- participant Worker as Background Worker
- participant SD as Stable Diffusion
- participant VideoAI as AI Video Engine
- participant DB as Content DB
-
- Client->>Gateway: 콘텐츠 생성 요청
- Gateway->>Content: 생성 요청
- Content->>DB: Job 생성 (상태: PENDING)
- Content->>Queue: 작업 큐잉
- Content-->>Gateway: Job ID 발급
- Gateway-->>Client: Job ID 반환
-
- Note over Client: 클라이언트는 다른 작업 가능
-
- Queue->>Worker: 작업 할당
-
- par 이미지 3종 생성 (2-3분)
- Worker->>SD: 이미지 생성 요청 (3건 병렬)
- SD-->>Worker: 이미지 3종
- and 영상 1개 생성 (3-5분)
- Worker->>VideoAI: 영상 제작 요청
- VideoAI-->>Worker: 15초 영상
- end
-
- Worker->>DB: 콘텐츠 저장 + 상태 업데이트 (COMPLETED)
-
- loop 상태 확인 (5초 간격)
- Client->>Gateway: Job 상태 조회
- Gateway->>Content: 상태 조회
- Content->>DB: 상태 확인
- DB-->>Content: 상태 + 진행률
- Content-->>Gateway: 진행 상황 (예: 60% 완료)
- Gateway-->>Client: 진행률 표시
- end
-
- Client->>Gateway: 최종 상태 조회
- Gateway->>Content: 상태 조회
- Content-->>Gateway: COMPLETED + 콘텐츠 URL
- Gateway-->>Client: 콘텐츠 다운로드
-```
-
-**예상 성과**:
-- **총 처리시간: 5-8분** (목표 달성)
-- 사용자 대기 체감 시간: 8분 → 0초 (비동기)
-- 동시 처리 능력: 50개 콘텐츠
-
----
-
-### 3.4 Distribution 서비스 - 안정적 배포
-
-**패턴 적용**:
-- **Circuit Breaker**: 6개 외부 API 장애 대응
-- **Retry**: 배포 실패 자동 재시도 (3회)
-- **Queue-Based Load Leveling**: 100개 동시 배포
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Dist as Distribution
- participant Queue as RabbitMQ
- participant CB1 as Circuit Breaker (우리동네TV)
- participant CB2 as Circuit Breaker (지니TV)
- participant CB3 as Circuit Breaker (Instagram)
- participant KTAPI as KT API
- participant SNS as SNS API
-
- Client->>Gateway: 배포 요청 (6개 채널)
- Gateway->>Dist: 배포 시작
- Dist->>Queue: 배포 작업 큐잉
-
- par 병렬 배포 (1분 목표)
- Queue->>CB1: 우리동네TV 배포
- CB1->>KTAPI: API 호출
- alt API 성공
- KTAPI-->>CB1: 배포 완료
- else API 실패
- KTAPI--xCB1: 오류
- CB1->>CB1: Retry (최대 3회)
- alt Retry 성공
- CB1->>KTAPI: 재시도
- KTAPI-->>CB1: 배포 완료
- else Retry 실패
- CB1-->>Queue: 배포 실패 (OPEN 상태)
- end
- end
- CB1-->>Dist: 결과 반환
- and
- Queue->>CB2: 지니TV 배포
- CB2->>KTAPI: API 호출
- KTAPI-->>CB2: 배포 완료
- CB2-->>Dist: 결과 반환
- and
- Queue->>CB3: Instagram 배포
- CB3->>SNS: API 호출
- SNS-->>CB3: 포스팅 완료
- CB3-->>Dist: 결과 반환
- end
-
- Dist-->>Gateway: 배포 결과 (성공 5/6)
- Gateway-->>Client: 배포 완료 + 실패 채널 안내
-```
-
-**예상 성과**:
-- **총 배포시간: 1분 이내** (목표 달성)
-- 배포 성공률: 95% → 98% (Retry)
-- API 장애 시 응답: 30초 → 3초 (Circuit Breaker)
-
----
-
-### 3.5 Analytics 서비스 - CQRS 읽기/쓰기 분리
-
-**패턴 적용**:
-- **CQRS**: 읽기/쓰기 분리
-- **Publisher-Subscriber**: 5분 간격 데이터 수집
-
-**아키텍처**:
-```mermaid
-graph TB
- subgraph "쓰기 모델"
- Collector[데이터 수집기 5분 스케줄러]
- WriteAPI[쓰기 API]
- CommandDB[(Command DB 원본 데이터)]
- end
-
- subgraph "이벤트 버스"
- EventBus[RabbitMQ Pub-Sub]
- end
-
- subgraph "읽기 모델"
- ReadAPI[읽기 API 대시보드]
- QueryDB[(Query DB 집계 데이터)]
- Aggregator[집계 프로세서]
- end
-
- subgraph "외부 데이터 소스"
- KTAPI[KT API]
- SNS[SNS API]
- POS[POS]
- end
-
- Collector -->|5분마다| KTAPI
- Collector -->|5분마다| SNS
- Collector -->|5분마다| POS
- Collector --> WriteAPI
- WriteAPI --> CommandDB
- CommandDB --> EventBus
- EventBus --> Aggregator
- Aggregator -->|ROI 계산 채널별 집계| QueryDB
- ReadAPI --> QueryDB
-
- Client[클라이언트 대시보드] -->|실시간 조회| ReadAPI
-```
-
-**예상 성과**:
-- 대시보드 조회 속도: 5초 → 1초 (80% 향상)
-- ROI 계산 응답: 10초 → 2초
-- 동시 조회 처리: 100개 대시보드
-
----
-
-## 4. Phase별 구현 로드맵
-
-### Phase 1: MVP (Minimum Viable Product) - 3개월
-
-**목표**: 핵심 비즈니스 기능 제공 및 빠른 출시
-
-**적용 패턴**:
-1. **API Gateway** - 단일 진입점 및 인증/인가
-2. **Async Request-Reply** - 콘텐츠 생성 비동기 처리
-3. **Circuit Breaker** - 외부 API 장애 대응
-4. **Cache-Aside** - 트렌드 데이터 캐싱
-5. **Retry** - 배포 실패 자동 재시도
-
-**구현 우선순위**:
-1. **Week 1-4**: User 서비스 + API Gateway
- - 회원가입/로그인 (JWT 인증)
- - 매장 정보 관리
- - 사업자번호 검증 연동
-
-2. **Week 5-8**: Event Planning 서비스
- - AI API 연동 (Claude, GPT-4)
- - Cache-Aside 패턴 적용 (Redis)
- - Circuit Breaker 적용
-
-3. **Week 9-10**: Content Generation 서비스
- - Async Request-Reply 패턴 구현
- - Stable Diffusion 연동
- - 진행 상황 폴링 API
-
-4. **Week 11-12**: Distribution + Participation 서비스
- - 6개 채널 병렬 배포 (Circuit Breaker + Retry)
- - 추첨/선착순 분기 로직
-
-**성공 지표**:
-- Event Planning: 10초 이내 응답 ✅
-- Content Generation: 8분 이내 완료 ✅
-- Distribution: 1분 이내 배포 ✅
-- 동시 이벤트 처리: 50개
-
----
-
-### Phase 2: 확장 (Scale-up) - 3개월
-
-**목표**: 성능 최적화 및 사용자 증가 대응
-
-**추가 패턴**:
-6. **CQRS** - Analytics 읽기/쓰기 분리
-7. **Queue-Based Load Leveling** - 피크 타임 부하 평준화
-8. **Publisher-Subscriber** - 서비스 간 이벤트 기반 통신
-
-**구현 계획**:
-1. **Week 1-4**: Analytics 서비스 CQRS 적용
- - Command DB / Query DB 분리
- - 5분 간격 데이터 수집 스케줄러
- - 실시간 대시보드 최적화
-
-2. **Week 5-8**: 메시지 큐 도입 (RabbitMQ/Kafka)
- - Queue-Based Load Leveling 적용
- - Publisher-Subscriber 패턴 구현
- - 서비스 간 결합도 감소
-
-3. **Week 9-12**: 성능 모니터링 및 최적화
- - Auto Scaling 설정
- - 로드 밸런싱 최적화
- - 캐시 전략 개선
-
-**성공 지표**:
-- 동시 이벤트 처리: 100개 ✅
-- 대시보드 조회 속도: 1초 이내 ✅
-- 시스템 가용성: 99.9% ✅
-
----
-
-### Phase 3: 고도화 (Advanced) - 6개월
-
-**목표**: AI 학습 고도화 및 글로벌 확장
-
-**추가 패턴**:
-9. **Event Sourcing** - AI Learning 학습 데이터 추적
-10. **Choreography** - 워크플로 자율 조정
-
-**구현 계획**:
-1. **Week 1-8**: AI Learning 서비스 고도화
- - Event Sourcing 패턴 적용
- - 성공/실패 패턴 학습 고도화
- - 추천 정확도 30% 향상
-
-2. **Week 9-16**: Choreography 패턴 적용
- - Event Planning → Content → Distribution 자율 조정
- - 중앙 조정자 제거
- - 워크플로 확장성 향상
-
-3. **Week 17-24**: 글로벌 확장 대비
- - Geodes 패턴 (다중 지역 배포)
- - Federated Identity (글로벌 인증)
-
-**성공 지표**:
-- AI 추천 정확도: 30% 향상 ✅
-- 워크플로 확장성: 무제한 ✅
-- 글로벌 지연 시간: 100ms 이내 ✅
-
----
-
-## 5. 예상 성과 지표
-
-### 5.1 성능 개선
-
-| 지표 | 현재 (패턴 미적용) | Phase 1 MVP | Phase 2 확장 | Phase 3 고도화 |
-|------|-------------------|-------------|-------------|---------------|
-| **Event Planning 응답시간** | 25초 | **10초** ✅ | 8초 | 6초 |
-| **Content Generation 완료시간** | 12분 | **8분** ✅ | 6분 | 5분 |
-| **Distribution 배포시간** | 3분 | **1분** ✅ | 40초 | 30초 |
-| **Analytics 대시보드 조회** | 5초 | 3초 | **1초** ✅ | 0.5초 |
-| **동시 이벤트 처리** | 20개 | 50개 | **100개** ✅ | 300개 |
-| **시스템 가용성** | 95% | 99% | **99.9%** ✅ | 99.99% |
-
----
-
-### 5.2 비용 절감 효과
-
-| 항목 | 절감율 | 연간 절감액 (추정) |
-|------|--------|-------------------|
-| **AI API 호출 비용** (Cache-Aside) | 40% | ₩24,000,000 |
-| **외부 API 재시도 비용** (Circuit Breaker) | 30% | ₩9,000,000 |
-| **서버 리소스 비용** (CQRS, 캐싱) | 25% | ₩15,000,000 |
-| **운영 인력 비용** (자동화) | 20% | ₩12,000,000 |
-| **총 절감액** | - | **₩60,000,000** |
-
----
-
-### 5.3 개발 생산성 향상
-
-| 지표 | 개선율 |
-|------|--------|
-| **서비스 간 결합도 감소** (Pub-Sub) | 70% |
-| **장애 복구 시간** (Circuit Breaker) | 80% |
-| **새 기능 개발 속도** (패턴 재사용) | 50% |
-| **코드 재사용률** (Gateway, Sidecar) | 60% |
-
----
-
-## 6. 구현 시 고려사항
-
-### 6.1 API Gateway
-- **기술 스택**: Kong, AWS API Gateway, Azure API Management
-- **Rate Limiting**: 사용자당 1분 100 요청
-- **JWT 토큰**: 만료 시간 1시간, Refresh Token 7일
-- **로깅**: 모든 요청/응답 로그 저장 (CloudWatch, ELK)
-
-### 6.2 Async Request-Reply
-- **Job ID 관리**: UUID v4 사용
-- **상태 폴링**: 5초 간격, 최대 10분 타임아웃
-- **WebSocket 대안**: 실시간 진행 상황 푸시 (선택사항)
-
-### 6.3 Circuit Breaker
-- **타임아웃 설정**: 외부 API별 차등 (15초 ~ 60초)
-- **실패 임계값**: 50% 실패 시 OPEN
-- **재시도 간격**: 30초 후 HALF-OPEN
-- **폴백 전략**: 캐시 데이터 반환 또는 기본값 제공
-
-### 6.4 Cache-Aside
-- **캐시 TTL**: 트렌드 데이터 1시간, AI 응답 30분
-- **캐시 무효화**: 데이터 업데이트 시 자동 삭제
-- **Redis Cluster**: 고가용성 보장
-
-### 6.5 CQRS
-- **DB 선택**: Command (PostgreSQL), Query (MongoDB)
-- **동기화 지연**: 최대 5초
-- **이벤트 버스**: RabbitMQ 또는 Kafka
-
----
-
-## 7. 리스크 관리
-
-### 7.1 기술적 리스크
-
-| 리스크 | 확률 | 영향도 | 완화 전략 |
-|--------|------|--------|-----------|
-| AI API 응답 지연 (>10초) | 중간 | 높음 | Cache-Aside, 프롬프트 최적화, 병렬 호출 |
-| 외부 API 장애 | 높음 | 높음 | Circuit Breaker, Retry, 폴백 전략 |
-| Redis 장애 | 낮음 | 중간 | Redis Cluster, DB 폴백 |
-| 메시지 큐 장애 | 낮음 | 높음 | Dead Letter Queue, 재처리 로직 |
-
-### 7.2 운영 리스크
-
-| 리스크 | 확률 | 영향도 | 완화 전략 |
-|--------|------|--------|-----------|
-| 피크 타임 트래픽 폭주 | 높음 | 높음 | Auto Scaling, Queue-Based Load Leveling |
-| 데이터 불일치 (CQRS) | 중간 | 중간 | 이벤트 재생, 수동 동기화 도구 |
-| 배포 실패율 증가 | 중간 | 중간 | Retry 3회, 수동 배포 옵션 |
-
----
-
-## 8. 결론
-
-### 8.1 핵심 패턴 요약
-
-본 서비스는 **10개의 클라우드 아키텍처 패턴**을 3단계로 적용하여 성능, 확장성, 안정성을 보장합니다:
-
-1. **API Gateway**: 단일 진입점 및 횡단 관심사 분리
-2. **Async Request-Reply**: 장시간 처리 작업 비동기화
-3. **Circuit Breaker**: 외부 API 장애 대응
-4. **Cache-Aside**: 응답 시간 단축
-5. **CQRS**: 읽기/쓰기 분리로 조회 성능 최적화
-6. **Event Sourcing**: AI 학습 데이터 추적
-7. **Queue-Based Load Leveling**: 부하 평준화
-8. **Retry**: 일시적 오류 자동 복구
-9. **Publisher-Subscriber**: 서비스 간 결합도 감소
-10. **Choreography**: 워크플로 자율 조정
-
-### 8.2 예상 효과
-
-- **Event Planning**: 25초 → **10초** (60% 단축) ✅
-- **Content Generation**: 12분 → **8분** (33% 단축) ✅
-- **Distribution**: 3분 → **1분** (67% 단축) ✅
-- **시스템 가용성**: 95% → **99.9%** ✅
-- **동시 이벤트 처리**: 20개 → **100개** (5배 향상) ✅
-- **연간 비용 절감**: **₩60,000,000** 💰
-
-### 8.3 다음 단계
-
-1. **Phase 1 MVP 착수** (3개월)
- - API Gateway + Async Request-Reply + Circuit Breaker 우선 구현
- - 핵심 비즈니스 기능 검증
-
-2. **성능 모니터링**
- - Prometheus + Grafana 대시보드 구축
- - 각 패턴별 성과 지표 측정
-
-3. **지속적 개선**
- - Phase 2, 3 로드맵에 따라 점진적 고도화
- - AI 학습 정확도 향상 및 글로벌 확장
-
----
-
-**문서 승인**:
-- [ ] System Architect (박영자)
-- [ ] Backend Developer (최수연)
-- [ ] DevOps Engineer (송근정)
-- [ ] PO (갑빠)
-
-**참조 문서**:
-- design/userstory.md
-- claude/cloud-design-patterns.md
-- claude/architecture-patterns.md
diff --git a/TEMP_BACKUP/pattern/architecture-pattern.md b/TEMP_BACKUP/pattern/architecture-pattern.md
deleted file mode 100644
index 6b8d3c5..0000000
--- a/TEMP_BACKUP/pattern/architecture-pattern.md
+++ /dev/null
@@ -1,685 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 클라우드 아키텍처 패턴 선정서
-
-**작성일**: 2025-10-21
-**작성자**: System Architect (박영자)
-**버전**: 2.0 (3개 핵심 패턴 적용)
-
----
-
-## 1. 요구사항 분석
-
-### 1.1 마이크로서비스별 기능 및 비기능 요구사항
-
-#### 1.1.1 User 서비스
-**기능 요구사항**:
-- 회원가입/로그인 (JWT 인증)
-- 매장 정보 관리 및 사업자번호 검증
-- KT 인증 시스템 연동
-
-**비기능 요구사항**:
-- 응답시간: 1초 이내
-- 가용성: 99.9%
-- 보안: 개인정보 암호화 (AES-256), HTTPS/TLS
-- 확장성: 1,000 동시 사용자
-
-**기술적 도전과제**:
-- 외부 사업자번호 검증 API 의존성
-- 인증 토큰 관리 및 세션 유지
-- 개인정보 보호 규정 준수
-
----
-
-#### 1.1.2 Event Planning 서비스
-**기능 요구사항**:
-- AI 기반 업종/지역 트렌드 분석
-- AI 이벤트상품 추천 (Claude API)
-- AI 참여 방법 설계
-- AI 홍보 문구 생성 (GPT-4 API)
-
-**비기능 요구사항**:
-- **응답시간: 10초 이내 (전체 기획 과정)** ⚡
-- AI API 병렬 호출 필수
-- 추첨형/선착순형 이벤트 자동 프로세스 분기
-- 확장성: 100개 동시 이벤트 기획
-
-**기술적 도전과제**:
-- **Claude + GPT-4 API 병렬 호출 및 응답 시간 관리**
-- AI 프롬프트 최적화로 10초 목표 달성
-- 트렌드 데이터베이스 실시간 조회 성능
-- 응답 캐싱 전략
-
----
-
-#### 1.1.3 Content Generation 서비스
-**기능 요구사항**:
-- AI 이미지 생성 (Stable Diffusion, 3종)
-- AI 영상 제작 (15초)
-- SNS 콘텐츠 자동 생성 (플랫폼별 최적화)
-- QR 포스터 생성
-
-**비기능 요구사항**:
-- **응답시간: 5-8분 이내 (병렬 처리 시)** ⚡
-- 이미지 생성: 2-3분 (Stable Diffusion 특성)
-- 영상 제작: 3-5분 (AI 영상 엔진 특성)
-- GPU 가속 활용
-- 확장성: 50개 동시 콘텐츠 생성
-
-**기술적 도전과제**:
-- **이미지 3종 + 영상 1개 병렬 생성**
-- 진행 상황 실시간 피드백
-- 백그라운드 비동기 처리 필수
-- 품질과 속도 균형 유지
-
----
-
-#### 1.1.4 Distribution 서비스
-**기능 요구사항**:
-- 다중 채널 배포 (우리동네TV, 링고비즈, 지니TV, Instagram, Naver Blog, Kakao Channel)
-- 네이버 클로바 TTS 연동 (연결음 생성)
-- 배포 실패 시 자동 재시도 (3회)
-
-**비기능 요구사항**:
-- **응답시간: 1분 이내 (전체 배포 과정)** ⚡
-- 채널별 병렬 배포 필수
-- 배포 상태 실시간 업데이트
-- 확장성: 100개 동시 배포
-
-**기술적 도전과제**:
-- **6개 외부 API 병렬 호출 및 통합**
-- API 장애 대응 (Circuit Breaker, Retry)
-- 네이버 클로바 TTS 품질 보장
-- 배포 실패 복구 전략
-
----
-
-#### 1.1.5 Participation 서비스
-**기능 요구사항**:
-- 이벤트 참여 신청 및 중복 방지
-- 추첨형 자동 추첨 (매장 방문 고객 가산점)
-- 선착순형 쿠폰 소진 시 자동 종료
-- 당첨 알림 발송 (SMS/카카오 알림톡)
-
-**비기능 요구사항**:
-- 응답시간: 1초 이내
-- 1인 1회 참여 보장 (멱등성)
-- 공정한 추첨 알고리즘
-- 확장성: 10,000 동시 참여
-
-**기술적 도전과제**:
-- 중복 참여 방지 (전화번호 기준)
-- 추첨형/선착순형 프로세스 분기
-- 대량 SMS/알림톡 발송
-- 매장 방문 고객 가산점 처리
-
----
-
-#### 1.1.6 Analytics 서비스
-**기능 요구사항**:
-- 실시간 대시보드 (참여자 수, 노출 수, 매출 증가율)
-- 5분 간격 데이터 수집 및 업데이트
-- 채널별 성과 분석 (Instagram, Naver Blog, Kakao Channel API)
-- ROI 자동 계산
-- 분석 리포트 PDF 생성
-
-**비기능 요구사항**:
-- **데이터 수집 주기: 5분 간격** ⏱
-- 실시간 데이터 시각화
-- 확장성: 100개 이벤트 동시 분석
-
-**기술적 도전과제**:
-- **다중 데이터 소스 통합 (KT API, POS, SNS API)**
-- 5분 간격 스케줄러 기반 수집
-- 대시보드 실시간 업데이트
-
----
-
-#### 1.1.7 AI Learning 서비스
-**기능 요구사항**:
-- 이벤트 결과 분석 및 개선안 생성
-- 성공 패턴 학습 및 재활용
-- 다음 이벤트 아이디어 제안 (시즌별)
-
-**비기능 요구사항**:
-- 빅데이터 분석 시스템 연동
-- AI 머신러닝 엔진 API 호출
-- 학습 데이터 누적 및 모델 개선
-- 확장성: 누적 데이터 기반 지속적 학습
-
-**기술적 도전과제**:
-- 성공/실패 패턴 자동 학습
-- 업종별/지역별 데이터 축적
-- 추천 정확도 향상 알고리즘
-
----
-
-### 1.2 통합 분석 및 핵심 도전과제
-
-#### 성능 목표 요약
-| 서비스 | 목표 응답시간 | 핵심 최적화 전략 |
-|--------|--------------|------------------|
-| Event Planning | **10초 이내** | AI API 병렬 호출 |
-| Content Generation | **5-8분 이내** | 이미지+영상 병렬 생성, 비동기 처리 |
-| Distribution | **1분 이내** | 6개 채널 병렬 배포 |
-| Analytics | **5분 주기** | 스케줄러 수집 |
-
-#### 확장성 요구사항
-- **동시 이벤트 처리**: 최소 100개
-- **AI API 동시 호출**: 최소 50개
-- **배포 API 동시 호출**: 최소 100개
-
-#### 외부 시스템 의존성
-- **KT 채널**: 우리동네TV, 링고비즈, 지니TV
-- **AI API**: Claude, GPT-4, Stable Diffusion
-- **SNS**: Instagram, Naver Blog, Kakao Channel
-- **기타**: 네이버 클로바 TTS, 사업자번호 검증, POS 시스템
-
----
-
-## 2. 클라우드 아키텍처 패턴 선정
-
-### 2.1 패턴 평가 매트릭스
-
-#### 핵심 패턴 정량 평가
-
-| 패턴 | 기능 적합성 (35%) | 성능 효과 (25%) | 운영 복잡도 (20%) | 확장성 (15%) | 비용 효율성 (5%) | **총점** | **우선순위** |
-|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| **API Gateway** | 10 × 0.35 = 3.5 | 9 × 0.25 = 2.25 | 9 × 0.20 = 1.8 | 9 × 0.15 = 1.35 | 8 × 0.05 = 0.4 | **9.30** | 🥇 1위 |
-| **Async Request-Reply** | 10 × 0.35 = 3.5 | 9 × 0.25 = 2.25 | 7 × 0.20 = 1.4 | 8 × 0.15 = 1.2 | 7 × 0.05 = 0.35 | **8.70** | 🥈 2위 |
-| **Circuit Breaker** | 9 × 0.35 = 3.15 | 7 × 0.25 = 1.75 | 8 × 0.20 = 1.6 | 8 × 0.15 = 1.2 | 8 × 0.05 = 0.4 | **8.10** | 🥉 3위 |
-
----
-
-### 2.2 선정 패턴 및 적용 전략
-
-#### 🥇 **1. API Gateway** (총점: 9.30)
-
-**선정 이유**:
-- 단일 진입점으로 7개 마이크로서비스 라우팅
-- 인증/인가 중앙 처리 (JWT 토큰 검증)
-- Rate Limiting으로 100개 동시 이벤트 관리
-- 횡단 관심사 분리 (로깅, 모니터링)
-
-**적용 서비스**: 전체 서비스
-
-**예상 효과**:
-- 클라이언트 요청 단순화 (1개 엔드포인트)
-- 인증 처리 시간 50% 단축
-- 서비스 간 결합도 감소
-
-**구현 기술**:
-- **기술 스택**: Kong, AWS API Gateway, Spring Cloud Gateway
-- **Rate Limiting**: 사용자당 1분 100 요청
-- **JWT 토큰**: 만료 시간 1시간, Refresh Token 7일
-- **로깅**: 모든 요청/응답 로그 저장 (CloudWatch, ELK)
-
----
-
-#### 🥈 **2. Async Request-Reply** (총점: 8.70)
-
-**선정 이유**:
-- **Content Generation 서비스의 5-8분 처리 시간 대응**
-- 이미지/영상 생성 백그라운드 처리
-- 진행 상황 실시간 피드백 (폴링)
-- 클라이언트 블로킹 방지
-
-**적용 서비스**: Content Generation
-
-**예상 효과**:
-- 사용자 대기 시간 체감 80% 감소
-- 시스템 응답성 향상
-- 동시 콘텐츠 생성 50개 처리 가능
-
-**구현 기술**:
-- **Job ID 관리**: UUID v4 사용
-- **상태 폴링**: 5초 간격, 최대 10분 타임아웃
-- **상태 관리**: Redis 또는 DB 기반 Job 상태 추적
-
-**구현 예시**:
-```javascript
-// 클라이언트: 콘텐츠 생성 요청
-const response = await axios.post('/api/content/generate', {
- eventId: 'evt-001',
- imageCount: 3
-});
-const jobId = response.data.jobId; // Job ID 발급
-
-// 상태 폴링 (5초 간격)
-const checkStatus = setInterval(async () => {
- const status = await axios.get(`/api/content/status/${jobId}`);
- if (status.data.completed) {
- clearInterval(checkStatus);
- // 콘텐츠 다운로드
- }
-}, 5000);
-```
-
----
-
-#### 🥉 **3. Circuit Breaker** (총점: 8.10)
-
-**선정 이유**:
-- **6개 외부 API 장애 대응 (KT 채널, AI API, SNS)**
-- Distribution 서비스의 배포 실패 방지
-- API 장애 시 빠른 실패 및 폴백
-- 연쇄 장애 전파 차단
-
-**적용 서비스**: Distribution, Event Planning, Content Generation
-
-**예상 효과**:
-- API 장애 시 응답 시간 95% 단축
-- 시스템 가용성 99.9% 보장
-- 배포 성공률 98% 이상 유지
-
-**구현 기술**:
-- **타임아웃 설정**: 외부 API별 차등 (15초 ~ 60초)
-- **실패 임계값**: 50% 실패 시 OPEN
-- **재시도 간격**: 30초 후 HALF-OPEN
-- **폴백 전략**: 기본값 제공 또는 실패 메시지
-
-**구현 예시** (Node.js with opossum):
-```javascript
-const CircuitBreaker = require('opossum');
-
-// 우리동네TV API 호출
-const callWooridongneTV = async (data) => {
- return axios.post('https://api.wooridongne.kt.com/deploy', data);
-};
-
-const breaker = new CircuitBreaker(callWooridongneTV, {
- timeout: 15000, // 15초 타임아웃
- errorThresholdPercentage: 50, // 50% 실패 시 OPEN
- resetTimeout: 30000 // 30초 후 재시도
-});
-
-breaker.fallback(() => ({
- success: false,
- message: '우리동네TV 배포 실패'
-}));
-
-// 배포 요청
-const result = await breaker.fire(deployData);
-```
-
-**Spring Boot 예시** (Resilience4j):
-```java
-@Service
-public class DistributionService {
-
- @CircuitBreaker(name = "wooridongneTV", fallbackMethod = "fallbackDeploy")
- public DeployResult deployToWooridongneTV(DeployData data) {
- return wooridongneAPI.deploy(data);
- }
-
- private DeployResult fallbackDeploy(DeployData data, Exception e) {
- return DeployResult.builder()
- .success(false)
- .message("우리동네TV 배포 실패: " + e.getMessage())
- .build();
- }
-}
-```
-
----
-
-## 3. 서비스별 패턴 적용 설계
-
-### 3.1 전체 아키텍처 구조
-
-```mermaid
-graph TB
- subgraph "클라이언트"
- Web[웹 애플리케이션]
- Mobile[모바일 앱]
- end
-
- subgraph "API Gateway Layer"
- Gateway[API Gateway 인증/인가/라우팅/Rate Limiting]
- end
-
- subgraph "마이크로서비스"
- User[User 서비스 회원/매장 관리]
- Planning[Event Planning 서비스 AI 이벤트 기획]
- Content[Content Generation 서비스 AI 콘텐츠 생성 Async Request-Reply]
- Dist[Distribution 서비스 다중 채널 배포 Circuit Breaker]
- Participation[Participation 서비스 참여/추첨 관리]
- Analytics[Analytics 서비스 효과 측정]
- AILearn[AI Learning 서비스 학습/개선]
- end
-
- subgraph "데이터 계층"
- UserDB[(User DB PostgreSQL)]
- PlanningDB[(Planning DB MongoDB)]
- ContentDB[(Content DB MongoDB)]
- DistDB[(Distribution DB PostgreSQL)]
- PartDB[(Participation DB PostgreSQL)]
- AnalyticsDB[(Analytics DB MongoDB)]
- AILearnDB[(AI Learning DB MongoDB)]
- JobStore[(Job Store Redis)]
- end
-
- subgraph "외부 시스템"
- KTAPI[KT 채널 API 우리동네TV/링고비즈/지니TV]
- AIAPI[AI API Claude/GPT-4/Stable Diffusion]
- SNS[SNS API Instagram/Naver/Kakao]
- Clova[네이버 클로바 TTS]
- POS[POS 시스템]
- end
-
- Web --> Gateway
- Mobile --> Gateway
-
- Gateway --> User
- Gateway --> Planning
- Gateway --> Content
- Gateway --> Dist
- Gateway --> Participation
- Gateway --> Analytics
- Gateway --> AILearn
-
- User --> UserDB
- Planning --> PlanningDB
- Content --> ContentDB
- Content --> JobStore
- Dist --> DistDB
- Participation --> PartDB
- Analytics --> AnalyticsDB
- AILearn --> AILearnDB
-
- Planning -->|Circuit Breaker| AIAPI
- Content -->|Circuit Breaker| AIAPI
- Dist -->|Circuit Breaker| KTAPI
- Dist -->|Circuit Breaker| SNS
- Dist -->|Circuit Breaker| Clova
- Analytics --> KTAPI
- Analytics --> SNS
- Analytics --> POS
-```
-
----
-
-### 3.2 Event Planning 서비스 - 10초 응답 최적화
-
-**패턴 적용**:
-- **Circuit Breaker**: Claude + GPT-4 API 장애 대응
-- **병렬 처리**: AI API 동시 호출
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Planning as Event Planning
- participant DB as Planning DB
- participant Claude as Claude API
- participant GPT4 as GPT-4 API
-
- Client->>Gateway: 이벤트 기획 시작
- Gateway->>Planning: 기획 요청
-
- Note over Planning,DB: Phase 1: 트렌드 분석 (3초 목표)
- Planning->>DB: 트렌드 데이터 조회
- DB-->>Planning: 트렌드 데이터
-
- Note over Planning,GPT4: Phase 2: AI 병렬 호출 (7초 목표)
- par Claude: 이벤트상품 + 참여방법
- Planning->>Claude: 이벤트상품 추천 요청 + 참여방법 설계 요청
- Claude-->>Planning: 추천 결과 (5초)
- and GPT-4: 홍보문구
- Planning->>GPT4: 홍보문구 생성 요청
- GPT4-->>Planning: 홍보문구 (4초)
- end
-
- Planning->>DB: 기획안 저장
- Planning-->>Gateway: 완성된 기획안 (총 10초 이내)
- Gateway-->>Client: 기획안 제공
-```
-
-**예상 성과**:
-- **총 응답시간: 10초 이내** (목표 달성)
-- AI API 병렬 호출: 9초 → 5초
-
----
-
-### 3.3 Content Generation 서비스 - 비동기 처리
-
-**패턴 적용**:
-- **Async Request-Reply**: 5-8분 장시간 처리
-- **Circuit Breaker**: Stable Diffusion API 장애 대응
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Content as Content Generation
- participant JobStore as Job Store (Redis)
- participant Worker as Background Worker
- participant SD as Stable Diffusion
- participant VideoAI as AI Video Engine
- participant DB as Content DB
-
- Client->>Gateway: 콘텐츠 생성 요청
- Gateway->>Content: 생성 요청
- Content->>JobStore: Job 생성 (상태: PENDING)
- Content-->>Gateway: Job ID 발급
- Gateway-->>Client: Job ID 반환
-
- Note over Client: 클라이언트는 다른 작업 가능
-
- Content->>Worker: 비동기 작업 시작
-
- par 이미지 3종 생성 (2-3분)
- Worker->>SD: 이미지 생성 요청 (3건 병렬)
- SD-->>Worker: 이미지 3종
- and 영상 1개 생성 (3-5분)
- Worker->>VideoAI: 영상 제작 요청
- VideoAI-->>Worker: 15초 영상
- end
-
- Worker->>DB: 콘텐츠 저장
- Worker->>JobStore: 상태 업데이트 (COMPLETED)
-
- loop 상태 확인 (5초 간격)
- Client->>Gateway: Job 상태 조회
- Gateway->>Content: 상태 조회
- Content->>JobStore: 상태 확인
- JobStore-->>Content: 상태 + 진행률
- Content-->>Gateway: 진행 상황 (예: 60% 완료)
- Gateway-->>Client: 진행률 표시
- end
-
- Client->>Gateway: 최종 상태 조회
- Gateway->>Content: 상태 조회
- Content-->>Gateway: COMPLETED + 콘텐츠 URL
- Gateway-->>Client: 콘텐츠 다운로드
-```
-
-**예상 성과**:
-- **총 처리시간: 5-8분** (목표 달성)
-- 사용자 대기 체감 시간: 8분 → 0초 (비동기)
-- 동시 처리 능력: 50개 콘텐츠
-
----
-
-### 3.4 Distribution 서비스 - 안정적 배포
-
-**패턴 적용**:
-- **Circuit Breaker**: 6개 외부 API 장애 대응
-- **병렬 배포**: 6개 채널 동시 배포
-
-**아키텍처**:
-```mermaid
-sequenceDiagram
- participant Client
- participant Gateway
- participant Dist as Distribution
- participant CB1 as Circuit Breaker (우리동네TV)
- participant CB2 as Circuit Breaker (지니TV)
- participant CB3 as Circuit Breaker (Instagram)
- participant KTAPI as KT API
- participant SNS as SNS API
-
- Client->>Gateway: 배포 요청 (6개 채널)
- Gateway->>Dist: 배포 시작
-
- par 병렬 배포 (1분 목표)
- Dist->>CB1: 우리동네TV 배포
- CB1->>KTAPI: API 호출
- alt API 성공
- KTAPI-->>CB1: 배포 완료
- else API 실패
- KTAPI--xCB1: 오류
- CB1-->>Dist: Fallback (배포 실패)
- end
- CB1-->>Dist: 결과 반환
- and
- Dist->>CB2: 지니TV 배포
- CB2->>KTAPI: API 호출
- KTAPI-->>CB2: 배포 완료
- CB2-->>Dist: 결과 반환
- and
- Dist->>CB3: Instagram 배포
- CB3->>SNS: API 호출
- SNS-->>CB3: 포스팅 완료
- CB3-->>Dist: 결과 반환
- end
-
- Dist-->>Gateway: 배포 결과 (성공 5/6)
- Gateway-->>Client: 배포 완료 + 실패 채널 안내
-```
-
-**예상 성과**:
-- **총 배포시간: 1분 이내** (목표 달성)
-- API 장애 시 응답: 30초 → 3초 (Circuit Breaker)
-- 배포 안정성: 95% → 98%
-
----
-
-## 4. 구현 로드맵
-
-### Phase 1: MVP (Minimum Viable Product) - 3개월
-
-**목표**: 핵심 비즈니스 기능 제공 및 빠른 출시
-
-**적용 패턴**:
-1. **API Gateway** - 단일 진입점 및 인증/인가
-2. **Async Request-Reply** - 콘텐츠 생성 비동기 처리
-3. **Circuit Breaker** - 외부 API 장애 대응
-
-**구현 우선순위**:
-1. **Week 1-4**: User 서비스 + API Gateway
- - 회원가입/로그인 (JWT 인증)
- - 매장 정보 관리
- - 사업자번호 검증 연동
- - API Gateway 구축 (Kong 또는 Spring Cloud Gateway)
-
-2. **Week 5-8**: Event Planning 서비스
- - AI API 연동 (Claude, GPT-4)
- - Circuit Breaker 적용
- - AI API 병렬 호출 구현
-
-3. **Week 9-10**: Content Generation 서비스
- - Async Request-Reply 패턴 구현
- - Stable Diffusion 연동
- - 진행 상황 폴링 API
- - Redis 기반 Job Store 구축
-
-4. **Week 11-12**: Distribution + Participation 서비스
- - 6개 채널 병렬 배포 (Circuit Breaker)
- - 추첨/선착순 분기 로직
-
-**성공 지표**:
-- Event Planning: 10초 이내 응답 ✅
-- Content Generation: 8분 이내 완료 ✅
-- Distribution: 1분 이내 배포 ✅
-- 동시 이벤트 처리: 50개
-
----
-
-## 5. 예상 성과 지표
-
-### 5.1 성능 개선
-
-| 지표 | 현재 (패턴 미적용) | Phase 1 MVP |
-|------|-------------------|-------------|
-| **Event Planning 응답시간** | 25초 | **10초** ✅ |
-| **Content Generation 완료시간** | 12분 | **8분** ✅ |
-| **Distribution 배포시간** | 3분 | **1분** ✅ |
-| **동시 이벤트 처리** | 20개 | 50개 |
-| **시스템 가용성** | 95% | 99% |
-
----
-
-### 5.2 패턴별 기대 효과
-
-| 패턴 | 적용 효과 | 개선율 |
-|------|----------|--------|
-| **API Gateway** | 클라이언트 통합 엔드포인트, 인증 중앙화 | 인증 처리 50% 단축 |
-| **Async Request-Reply** | 사용자 대기 시간 체감 감소 | 80% 체감 시간 감소 |
-| **Circuit Breaker** | API 장애 시 빠른 실패, 연쇄 장애 방지 | 응답 시간 95% 단축 |
-
----
-
-## 6. 리스크 관리
-
-### 6.1 기술적 리스크
-
-| 리스크 | 확률 | 영향도 | 완화 전략 |
-|--------|------|--------|-----------|
-| AI API 응답 지연 (>10초) | 중간 | 높음 | 병렬 호출, 프롬프트 최적화 |
-| 외부 API 장애 | 높음 | 높음 | Circuit Breaker, 폴백 전략 |
-| Job Store (Redis) 장애 | 낮음 | 중간 | Redis Cluster, DB 폴백 |
-
-### 6.2 운영 리스크
-
-| 리스크 | 확률 | 영향도 | 완화 전략 |
-|--------|------|--------|-----------|
-| 피크 타임 트래픽 폭주 | 높음 | 높음 | Auto Scaling, Rate Limiting |
-| 배포 실패율 증가 | 중간 | 중간 | Circuit Breaker 폴백 전략 |
-
----
-
-## 7. 결론
-
-### 7.1 핵심 패턴 요약
-
-본 서비스는 **3개의 클라우드 아키텍처 패턴**을 적용하여 성능, 확장성, 안정성을 보장합니다:
-
-1. **API Gateway**: 단일 진입점 및 횡단 관심사 분리
-2. **Async Request-Reply**: 장시간 처리 작업 비동기화
-3. **Circuit Breaker**: 외부 API 장애 대응
-
-### 7.2 예상 효과
-
-- **Event Planning**: 25초 → **10초** (60% 단축) ✅
-- **Content Generation**: 12분 → **8분** (33% 단축) ✅
-- **Distribution**: 3분 → **1분** (67% 단축) ✅
-- **시스템 가용성**: 95% → **99%** ✅
-- **동시 이벤트 처리**: 20개 → **50개** (2.5배 향상) ✅
-
-### 7.3 다음 단계
-
-1. **Phase 1 MVP 착수** (3개월)
- - API Gateway + Async Request-Reply + Circuit Breaker 우선 구현
- - 핵심 비즈니스 기능 검증
-
-2. **성능 모니터링**
- - Prometheus + Grafana 대시보드 구축
- - 각 패턴별 성과 지표 측정
-
-3. **지속적 개선**
- - 추가 패턴 도입 검토 (Cache-Aside, CQRS 등)
- - AI 학습 정확도 향상
-
----
-
-**문서 승인**:
-- [ ] System Architect (박영자)
-- [ ] Backend Developer (최수연)
-- [ ] DevOps Engineer (송근정)
-- [ ] PO (갑빠)
-
-**참조 문서**:
-- design/userstory.md
-- claude/cloud-design-patterns.md
-- design/pattern/architecture-pattern-backup-20251021.md (백업)
diff --git a/TEMP_BACKUP/prototype/00-로그인.html b/TEMP_BACKUP/prototype/00-로그인.html
deleted file mode 100644
index 784d35e..0000000
--- a/TEMP_BACKUP/prototype/00-로그인.html
+++ /dev/null
@@ -1,414 +0,0 @@
-
-
-
-
-
-
- 로그인 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
AI로 간편하게, 성공으로 확실하게
-
소상공인을 위한 스마트 이벤트 마케팅 솔루션
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/01-회원가입.html b/TEMP_BACKUP/prototype/01-회원가입.html
deleted file mode 100644
index 04455e4..0000000
--- a/TEMP_BACKUP/prototype/01-회원가입.html
+++ /dev/null
@@ -1,347 +0,0 @@
-
-
-
-
-
-
- 회원가입 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🎉
-
KT 이벤트 마케팅
-
환영합니다
-
-
-
-
-
-
- 이미 계정이 있으신가요? 로그인
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/02-매장정보등록.html b/TEMP_BACKUP/prototype/02-매장정보등록.html
deleted file mode 100644
index a6492c6..0000000
--- a/TEMP_BACKUP/prototype/02-매장정보등록.html
+++ /dev/null
@@ -1,770 +0,0 @@
-
-
-
-
-
-
- 매장정보 등록 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/03-홈화면.html b/TEMP_BACKUP/prototype/03-홈화면.html
deleted file mode 100644
index 6264c16..0000000
--- a/TEMP_BACKUP/prototype/03-홈화면.html
+++ /dev/null
@@ -1,470 +0,0 @@
-
-
-
-
-
-
- 홈 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 이벤트를 생성하시면 AI가 맞춤형 인사이트를 제공해드립니다.
-
-
-
-
-
-
-
-
-
🎯
-
첫 이벤트를 만들어보세요!
-
- AI가 업종과 목적에 맞는
- 최적의 이벤트를 추천해드립니다
-
-
- AI 이벤트 만들기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 홈
-
-
-
-
-
- 이벤트
-
-
-
-
-
-
- 만들기
-
-
-
-
-
- 분석
-
-
-
-
-
- MY
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/04-이벤트목적선택.html b/TEMP_BACKUP/prototype/04-이벤트목적선택.html
deleted file mode 100644
index 820c2a7..0000000
--- a/TEMP_BACKUP/prototype/04-이벤트목적선택.html
+++ /dev/null
@@ -1,516 +0,0 @@
-
-
-
-
-
-
- 이벤트 목적 선택 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🎯
-
이벤트 목적을 선택하세요
-
- 목적에 맞는 최적의 이벤트를
- AI가 추천해드립니다
-
-
-
-
-
-
-
- 선택하신 목적에 맞는 최신 트렌드와 성공 사례를 분석하여 맞춤형 이벤트를 제안해드립니다.
-
-
-
-
-
-
-
-
-
-
- 새로운 고객을 끌어들이고 매장 인지도를 높이고 싶어요
-
-
AI 추천
-
- 예: 첫 방문 할인, 친구 추천 이벤트
-
-
-
-
-
-
-
-
-
- 기존 고객의 재방문을 늘리고 충성도를 높이고 싶어요
-
-
- 예: 스탬프 적립, 재방문 쿠폰
-
-
-
-
-
-
-
-
-
- 객단가를 올리고 매출을 늘리고 싶어요
-
-
- 예: 세트 할인, 한정 특가 이벤트
-
-
-
-
-
-
-
-
-
- 매장을 더 많은 사람에게 알리고 SNS에서 화제가 되고 싶어요
-
-
- 예: SNS 인증샷, 바이럴 이벤트
-
-
-
-
-
-
-
-
-
- 고객과 더 많이 소통하고 커뮤니티를 만들고 싶어요
-
-
- 예: 리뷰 이벤트, 고객 투표
-
-
-
-
-
-
-
-
-
- 계절이나 기념일에 맞는 특별한 이벤트를 하고 싶어요
-
-
- 예: 크리스마스, 창립기념일 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 홈
-
-
-
-
-
- 이벤트
-
-
-
-
-
-
- 만들기
-
-
-
-
-
- 분석
-
-
-
-
-
- MY
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/05-AI트렌드분석결과.html b/TEMP_BACKUP/prototype/05-AI트렌드분석결과.html
deleted file mode 100644
index 199ef29..0000000
--- a/TEMP_BACKUP/prototype/05-AI트렌드분석결과.html
+++ /dev/null
@@ -1,680 +0,0 @@
-
-
-
-
-
-
- AI 트렌드 분석 결과 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🤖
-
AI가 트렌드를 분석하고 있어요
-
- 최신 데이터를 기반으로
- 업종별 성공 사례를 분석 중입니다
-
-
-
-
-
-
-
-
-
-
-
- 📊
- 핵심 인사이트
-
-
-
-
-
-
42%
-
업계 평균 대비 +18%p 높은 수치
-
-
-
-
-
7일
-
참여율이 가장 높은 이벤트 기간
-
-
-
-
-
3.2배
-
평균 투자 대비 수익률
-
-
-
-
-
- 🔥
- 인기 이벤트 유형 TOP 3
-
-
-
-
-
-
-
-
-
-
- 현재 트렌드를 분석한 결과, "친구 초대 이벤트"가 가장 효과적입니다. SNS 공유를 통한 바이럴 효과가 뛰어나며, 신규 고객 유치율이 평균 3.2배 높습니다.
-
-
- #신규고객유치
- #바이럴효과
- #SNS마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 홈
-
-
-
-
-
- 이벤트
-
-
-
-
-
-
- 만들기
-
-
-
-
-
- 분석
-
-
-
-
-
- MY
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/06-AI이벤트상품추천.html b/TEMP_BACKUP/prototype/06-AI이벤트상품추천.html
deleted file mode 100644
index ba9b84a..0000000
--- a/TEMP_BACKUP/prototype/06-AI이벤트상품추천.html
+++ /dev/null
@@ -1,602 +0,0 @@
-
-
-
-
-
-
- AI 이벤트 상품 추천 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🎁
-
어떤 혜택을 제공하시겠어요?
-
- AI가 분석한 결과를 바탕으로
- 가장 효과적인 이벤트 상품을 추천해드립니다
-
-
-
-
-
- ✨
- AI 추천 혜택
-
-
트렌드 분석을 바탕으로 가장 효과적인 혜택을 선별했어요
-
-
-
-
- 🤖 AI 추천
-
-
- 친구를 초대한 고객과 초대받은 친구 모두에게 혜택을 제공하는 방식입니다. SNS 공유를 통한 바이럴 효과가 뛰어나며, 신규 고객 유치에 가장 효과적입니다.
-
-
-
-
✓ 주요 장점
-
- 바이럴 효과로 빠른 확산 가능
- 신규 고객 유치율 평균 3.2배
- 고객 획득 비용 40% 절감
-
-
-
-
-
-
-
-
- 즉시 사용 가능한 할인 쿠폰을 제공합니다. 구매 전환율이 높으며, 객단가 상승 효과도 기대할 수 있습니다.
-
-
-
-
✓ 주요 장점
-
- 즉시 구매 전환 유도
- 객단가 평균 28% 상승
- 설정 및 관리 간편
-
-
-
-
-
-
-
-
- 인기 상품이나 신메뉴를 무료로 체험할 수 있는 기회를 제공합니다. 고객 만족도가 높고 재방문율 증가에 효과적입니다.
-
-
-
-
✓ 주요 장점
-
- 고객 만족도 매우 높음
- 재방문율 평균 42% 증가
- 긍정적 브랜드 이미지 형성
-
-
-
-
-
-
-
-
- ✏️
- 직접 입력하기
-
-
- 원하는 혜택을 직접 입력할 수도 있어요
-
-
-
-
-
-
-
-
-
-
-
-
-
- 홈
-
-
-
-
-
- 이벤트
-
-
-
-
-
-
- 만들기
-
-
-
-
-
- 분석
-
-
-
-
-
- MY
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/07-AI참여방법설계.html b/TEMP_BACKUP/prototype/07-AI참여방법설계.html
deleted file mode 100644
index 759331e..0000000
--- a/TEMP_BACKUP/prototype/07-AI참여방법설계.html
+++ /dev/null
@@ -1,859 +0,0 @@
-
-
-
-
-
- AI 참여 방법 설계 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
-
- SNS 공유하기 는 바이럴 효과가 뛰어나 신규 고객 유치에 가장 효과적입니다.
- 평균 2.3배의 참여자 증가 효과가 있으며, 설정도 간단합니다.
-
-
-
-
-
-
-
-
🤖 AI 추천
-
-
- 고객이 이벤트를 SNS에 공유하면 참여 완료. 인스타그램, 페이스북 등 주요 SNS 플랫폼 지원
-
-
-
-
주요 장점
-
- 자연스러운 바이럴 효과로 신규 고객 유입
- 추가 비용 없이 홍보 효과 극대화
- 간편한 참여로 높은 전환율
-
-
-
-
-
-
-
-
- 매장 내 QR 코드를 스캔하여 참여. 포스터, 테이블 스티커 등 다양한 형태로 활용 가능
-
-
-
-
주요 장점
-
- 오프라인 매장 방문 고객 타겟팅
- 즉각적인 참여와 혜택 제공
- 누구나 쉽게 참여 가능
-
-
-
-
-
-
-
-
- 간단한 정보 입력 후 쿠폰 다운로드. 모바일 쿠폰으로 즉시 사용 가능
-
-
-
-
주요 장점
-
- 즉시 혜택으로 높은 전환율
- 고객 정보 수집 용이
- 재방문 유도 효과
-
-
-
-
-
-
-
-
- 매장 방문 시 스탬프나 인증 사진 업로드로 참여. 실제 방문 고객 확보에 효과적
-
-
-
-
주요 장점
-
- 확실한 매장 방문 고객 확보
- 직접적인 매출 증대 효과
- 단골 고객 형성에 유리
-
-
-
-
-
-
-
-
- 간단한 설문 작성 후 참여 완료. 고객 니즈 파악과 맞춤형 마케팅에 활용
-
-
-
-
주요 장점
-
- 고객 선호도 및 니즈 파악
- 데이터 기반 의사결정 가능
- 타겟 마케팅 최적화
-
-
-
-
-
-
-
-
- 친구를 초대하고 함께 혜택 받기. 추천인과 피추천인 모두 혜택 제공
-
-
-
-
주요 장점
-
- 검증된 신규 고객 확보
- 강력한 추천 효과
- Win-Win 혜택 구조
-
-
-
-
-
-
-
-
- 💭 직접 입력하기
-
-
-
- 원하는 참여 방법을 직접 입력할 수 있어요 (최대 100자)
-
-
-
-
-
- 홍보 문구 생성하기
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/08-AI홍보문구생성.html b/TEMP_BACKUP/prototype/08-AI홍보문구생성.html
deleted file mode 100644
index b3c8447..0000000
--- a/TEMP_BACKUP/prototype/08-AI홍보문구생성.html
+++ /dev/null
@@ -1,931 +0,0 @@
-
-
-
-
-
- AI 홍보 문구 생성 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
AI가 홍보 문구를 생성하고 있어요
-
이벤트 정보를 분석하고 있어요...
-
-
-
-
-
-
-
-
-
- 버전 1 은 감성적인 톤으로 고객의 공감을 이끌어내기에 가장 적합합니다.
- SNS 공유 시 참여율이 평균 35% 높게 나타났어요.
-
-
-
-
-
-
-
-
-
-
- 이벤트 기획안 확인하기
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/09-AI이미지생성.html b/TEMP_BACKUP/prototype/09-AI이미지생성.html
deleted file mode 100644
index 8bd7b6e..0000000
--- a/TEMP_BACKUP/prototype/09-AI이미지생성.html
+++ /dev/null
@@ -1,743 +0,0 @@
-
-
-
-
-
- AI 이미지 생성 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ✨ 원하는 이미지 설명
-
-
-
- 생성하고 싶은 이미지를 자세히 설명해 주세요 (최대 500자)
-
-
-
- 🎨 이미지 스타일
-
-
-
- 🌟 모던
-
-
- ☀️ 따뜻한
-
-
- 🎨 생동감
-
-
- ✨ 미니멀
-
-
-
-
- 🎨 이미지 생성하기
-
-
-
-
-
-
-
- AI가 이미지를 생성하고 있어요...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 다음 단계로
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/10-이벤트기획안승인.html b/TEMP_BACKUP/prototype/10-이벤트기획안승인.html
deleted file mode 100644
index 601c029..0000000
--- a/TEMP_BACKUP/prototype/10-이벤트기획안승인.html
+++ /dev/null
@@ -1,719 +0,0 @@
-
-
-
-
-
- 이벤트 기획안 승인 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🎉
-
완벽한 이벤트 기획안이 완성되었어요!
-
- AI가 분석한 데이터를 바탕으로 최적의 이벤트를 설계했습니다.
- 아래 내용을 확인하고 승인하시면 다음 단계로 진행됩니다.
-
-
-
-
-
-
-
-
-
📱 이벤트 미리보기
-
-
- 🎉 친구 초대하고 함께 받는 특별한 혜택!
-
-
- 맛있는 순간을 소중한 사람과 함께하세요. 친구를 초대하면 둘 다 특별한 선물을 드려요.
- 지금 바로 참여하고 행복을 나누세요!
-
-
- #친구초대이벤트
- #함께할인
- #소상공인응원
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
선택한 경품
-
- 추천형
- 친구 초대 특전
-
-
-
-
-
-
-
-
-
-
-
선택한 방법
-
- 바이럴형
- SNS 공유하기
-
-
-
-
-
-
-
-
-
-
-
헤드라인
-
- 🎉 친구 초대하고 함께 받는 특별한 혜택!
-
-
-
-
CTA
-
- 지금 친구 초대하고 혜택 받기
-
-
-
-
-
-
-
-
-
- 📝 임시저장
-
-
- ✅ 승인하고 다음으로
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/11-AI영상제작.html b/TEMP_BACKUP/prototype/11-AI영상제작.html
deleted file mode 100644
index ab54082..0000000
--- a/TEMP_BACKUP/prototype/11-AI영상제작.html
+++ /dev/null
@@ -1,506 +0,0 @@
-
-
-
-
-
- AI 영상 제작 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
- 💡 선택사항
-
-
- 영상 제작은 선택사항입니다. 영상이 필요하지 않으시면 "건너뛰기"를 선택하세요.
-
-
-
-
-
-
-
-
- 인스타그램 릴스, 유튜브 쇼츠에 최적화된 세로형 15초 영상을 제작합니다.
- 빠르고 강렬한 메시지 전달에 효과적입니다.
-
-
-
-
-
-
- 이벤트의 모든 내용을 담은 30초 가로형 영상을 제작합니다.
- 페이스북, 유튜브 등 다양한 플랫폼에 활용할 수 있습니다.
-
-
-
-
-
-
- 15초 숏폼과 30초 프로모션 영상을 모두 제작합니다.
- 모든 플랫폼에 최적화된 홍보가 가능합니다.
-
-
-
-
-
-
- 영상 제작 건너뛰기
-
-
-
- 선택 완료
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/12-SNS콘텐츠생성.html b/TEMP_BACKUP/prototype/12-SNS콘텐츠생성.html
deleted file mode 100644
index 03d989c..0000000
--- a/TEMP_BACKUP/prototype/12-SNS콘텐츠생성.html
+++ /dev/null
@@ -1,758 +0,0 @@
-
-
-
-
-
- SNS 콘텐츠 생성 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
- 인스타그램 과 페이스북 에서 가장 높은 참여율이 예상됩니다.
- 두 플랫폼을 선택하시면 최대 효과를 얻으실 수 있어요.
-
-
-
-
-
- ✨ 모든 플랫폼 콘텐츠 한번에 생성하기
-
-
-
-
-
-
-
-
-
- 다음 단계로
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/13-QR포스터생성.html b/TEMP_BACKUP/prototype/13-QR포스터생성.html
deleted file mode 100644
index 6c7a6d9..0000000
--- a/TEMP_BACKUP/prototype/13-QR포스터생성.html
+++ /dev/null
@@ -1,805 +0,0 @@
-
-
-
-
-
- QR 포스터 생성 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
🎨
-
AI가 QR 포스터를 생성하고 있습니다...
-
-
-
-
-
-
-
-
- ✨ QR 포스터 완성
-
-
- 이벤트 참여를 위한 QR 코드와 홍보 포스터가 생성되었습니다.
- 원하시는 템플릿을 선택하고 커스터마이징하세요.
-
-
-
-
-
-
포스터 템플릿 선택
-
-
-
-
- 깔끔하고 현대적인 디자인으로 모든 연령층에게 어필할 수 있는 템플릿입니다.
-
-
-
-
-
-
-
- 화려한 색상과 역동적인 디자인으로 시선을 사로잡는 템플릿입니다.
-
-
-
-
-
-
-
- 단순하고 세련된 디자인으로 전문적인 느낌을 전달하는 템플릿입니다.
-
-
-
-
-
-
-
- 고급스러운 디자인으로 특별한 이벤트를 더욱 돋보이게 하는 템플릿입니다.
-
-
-
-
-
-
-
-
-
포스터 커스터마이징
-
-
-
포스터 크기
-
- A4
- A3
- B4
-
-
-
-
- 포스터 제목 (선택사항)
-
-
-
-
- 부제목 (선택사항)
-
-
-
-
-
-
- 선택 완료
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/14-QR포스터생성선택.html b/TEMP_BACKUP/prototype/14-QR포스터생성선택.html
deleted file mode 100644
index 82e2b12..0000000
--- a/TEMP_BACKUP/prototype/14-QR포스터생성선택.html
+++ /dev/null
@@ -1,561 +0,0 @@
-
-
-
-
-
- QR 포스터 템플릿 선택 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🤖 AI 추천
-
-
-
-
클래식 템플릿
-
- 깔끔하고 전통적인 레이아웃. 모든 업종에 잘 어울리는 기본 템플릿입니다.
-
-
- 심플
- 범용
- 가독성 높음
-
-
-
-
-
-
-
-
-
-
모던 템플릿
-
- 그라데이션 배경과 세련된 타이포그래피로 젊은 층에게 어필합니다.
-
-
- 트렌디
- 그라데이션
- 젊은 층
-
-
-
-
-
-
-
-
-
-
미니멀 템플릿
-
- 여백을 활용한 미니멀한 디자인. 고급스러운 브랜드 이미지에 적합합니다.
-
-
- 미니멀
- 고급
- 여백 활용
-
-
-
-
-
-
-
-
-
-
생동감 템플릿
-
- 화사한 컬러와 역동적인 레이아웃으로 시선을 사로잡습니다.
-
-
- 생동감
- 눈에 띄는
- 이벤트용
-
-
-
-
-
-
-
- 상세 설정하기
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/15-QR포스터상세설정.html b/TEMP_BACKUP/prototype/15-QR포스터상세설정.html
deleted file mode 100644
index 308c2bc..0000000
--- a/TEMP_BACKUP/prototype/15-QR포스터상세설정.html
+++ /dev/null
@@ -1,628 +0,0 @@
-
-
-
-
-
- QR 포스터 상세 설정 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/16-콘텐츠편집.html b/TEMP_BACKUP/prototype/16-콘텐츠편집.html
deleted file mode 100644
index be0d131..0000000
--- a/TEMP_BACKUP/prototype/16-콘텐츠편집.html
+++ /dev/null
@@ -1,699 +0,0 @@
-
-
-
-
-
- 콘텐츠 편집 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
- ✏️ 편집 가이드
-
-
- AI가 생성한 콘텐츠를 자유롭게 수정할 수 있습니다.
- 각 섹션의 "재생성" 버튼을 클릭하면 새로운 콘텐츠를 생성할 수 있습니다.
-
-
-
-
-
-
-
메인 홍보 문구
-
🎉 신규 고객 환영 이벤트 🎉
-
-지금 가입하시면 특별한 혜택이 기다립니다!
-✨ 첫 구매 20% 할인
-✨ 무료 배송 쿠폰 증정
-✨ 추가 적립금 5,000원
-
-📅 기간: 2024년 1월 15일 ~ 1월 31일
-🎁 선착순 100명 한정 특별 선물 증정
-
- 0 / 500자
-
-
-
-
-
-
-
-
- 각 이미지를 클릭하면 새로운 이미지로 교체할 수 있습니다.
-
-
-
-
-
-
-
-
포스터 제목
-
신규 고객 환영 이벤트
-
포스터 부제목
-
QR 코드를 스캔하고 특별 혜택을 받으세요
-
-
-
-
-
- 💾 임시 저장
-
-
- 편집 완료하고 승인 요청
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/17-콘텐츠최종승인.html b/TEMP_BACKUP/prototype/17-콘텐츠최종승인.html
deleted file mode 100644
index b14ee7d..0000000
--- a/TEMP_BACKUP/prototype/17-콘텐츠최종승인.html
+++ /dev/null
@@ -1,733 +0,0 @@
-
-
-
-
-
- 콘텐츠 최종 승인 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
-
-
🎉
-
완벽한 이벤트 콘텐츠가 준비되었어요!
-
- AI가 생성한 고품질 콘텐츠로 이벤트를 홍보할 준비가 완료되었습니다.
- 아래 내용을 최종 확인하고 승인하시면 바로 배포 단계로 이동합니다.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
📷
-
-
인스타그램
-
🎉 친구 초대하고 함께 받는 특별한 혜택!
-
-
생성완료
-
-
-
👥
-
-
페이스북
-
🎉 친구 초대 이벤트 진행 중!
-
-
생성완료
-
-
-
-
-
-
-
-
-
-
-
🎉 친구 초대 이벤트
-
📱
-
QR 코드를 스캔하고 참여하세요!
-
-
-
-
-
-
-
-
- 📝 임시저장
-
-
- ✅ 승인하고 배포하기
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/18-배포채널선택.html b/TEMP_BACKUP/prototype/18-배포채널선택.html
deleted file mode 100644
index 2371b46..0000000
--- a/TEMP_BACKUP/prototype/18-배포채널선택.html
+++ /dev/null
@@ -1,1279 +0,0 @@
-
-
-
-
-
- 배포 채널 선택 - KT AI 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
즉시 배포
-
지금 바로 선택한 채널에 배포
-
-
-
-
-
-
-
예약 배포
-
원하는 날짜와 시간에 배포
-
-
-
-
-
-
-
-
-
-
- 임시저장
-
-
- 다음 (배포 시작)
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/19-배포진행상태.html b/TEMP_BACKUP/prototype/19-배포진행상태.html
deleted file mode 100644
index 3dee0d7..0000000
--- a/TEMP_BACKUP/prototype/19-배포진행상태.html
+++ /dev/null
@@ -1,1144 +0,0 @@
-
-
-
-
-
- 배포 진행 상태 - KT AI 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
전체 진행률
-
-
- 0%
- 예상 소요: 1분 남음
-
-
-
-
-
-
-
-
-
-
-
- 취소
-
-
- 새로고침
-
-
-
-
-
-
-
✅
-
배포 완료!
-
모든 채널에 성공적으로 배포되었습니다
-
-
-
-
-
-
-
-
- 다음 (완료 화면)
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/20-오프라인자료다운로드.html b/TEMP_BACKUP/prototype/20-오프라인자료다운로드.html
deleted file mode 100644
index c5fd5e0..0000000
--- a/TEMP_BACKUP/prototype/20-오프라인자료다운로드.html
+++ /dev/null
@@ -1,1026 +0,0 @@
-
-
-
-
-
- 오프라인 자료 다운로드 - KT AI 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
✅
-
배포 완료!
-
오프라인 홍보 자료를 다운로드하세요
-
-
-
-
-
📦
-
전체 다운로드
-
모든 오프라인 자료를 ZIP 파일로 한번에 다운로드
-
- 전체 다운로드 (ZIP)
-
-
-
-
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
- 미리보기
-
-
- 다운로드
-
-
-
-
-
-
-
-
-
-
- 아직 다운로드한 파일이 없습니다
-
-
-
-
-
-
-
-
- 홈으로
-
-
- 분석 보기
-
-
-
-
-
-
-
-
- 📄
-
-
- 실제 서비스에서는 PDF/이미지 미리보기가 표시됩니다
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/21-이벤트참여.html b/TEMP_BACKUP/prototype/21-이벤트참여.html
deleted file mode 100644
index a66562a..0000000
--- a/TEMP_BACKUP/prototype/21-이벤트참여.html
+++ /dev/null
@@ -1,993 +0,0 @@
-
-
-
-
-
- 이벤트 참여 - KT AI 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
참여 방법
-
- 매장 방문하기
- QR 코드 스캔하기
- 아래 정보 입력하기
-
-
-
-
-
-
-
-
-
💡
-
- 매장 방문 고객은 당첨 확률 UP! 🎁
-
-
-
-
-
- 참여하기
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/22-참여완료.html b/TEMP_BACKUP/prototype/22-참여완료.html
deleted file mode 100644
index 48dee83..0000000
--- a/TEMP_BACKUP/prototype/22-참여완료.html
+++ /dev/null
@@ -1,905 +0,0 @@
-
-
-
-
-
- 참여 완료 - KT AI 이벤트
-
-
-
-
-
-
-
-
-
-
-
-
-
-
응모번호
-
A-12345678
-
- 📋 복사하기
-
-
-
-
-
-
-
-
📱
-
-
당첨자 통보 방법
-
SMS / 알림톡
-
-
-
-
-
-
-
- 💡 안내사항
-
-
- 당첨 시 입력하신 전화번호로 SMS/알림톡이 발송됩니다.
- 응모번호는 당첨 확인 시 필요하니 꼭 기억해주세요!
-
-
-
-
-
-
매장 정보
-
-
-
-
-
📍
-
- 경기도 수원시 팔달구 xxx-xxx
-
-
-
-
-
-
- 매장 위치 보기
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/23-당첨자명단관리.html b/TEMP_BACKUP/prototype/23-당첨자명단관리.html
deleted file mode 100644
index 550f303..0000000
--- a/TEMP_BACKUP/prototype/23-당첨자명단관리.html
+++ /dev/null
@@ -1,1098 +0,0 @@
-
-
-
-
-
- 당첨자 명단 관리 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 🔍
-
- ✕
-
-
-
-
-
- 전체 0
-
-
- 미지급 0
-
-
- 지급완료 0
-
-
-
-
-
-
-
-
-
-
-
🎁
-
당첨자가 없습니다
-
- 추첨이 완료되면 당첨자 명단이 표시됩니다.
-
-
-
-
-
-
-
-
- 📊
- 엑셀 다운로드
-
-
- 📱
- 당첨 알림 발송
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/24-실시간대시보드.html b/TEMP_BACKUP/prototype/24-실시간대시보드.html
deleted file mode 100644
index 93ef7ed..0000000
--- a/TEMP_BACKUP/prototype/24-실시간대시보드.html
+++ /dev/null
@@ -1,939 +0,0 @@
-
-
-
-
-
- 실시간 대시보드 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
- 오늘
- 최근 7일
- 최근 30일
- 전체
-
-
-
-
-
-
- 👥
- 총 참여자
-
-
0
-
+0%
-
-
-
-
- 🎁
- 당첨자
-
-
0
-
+0%
-
-
-
-
- 📊
- 전환율
-
-
0%
-
+0%
-
-
-
-
- 📈
- 조회수
-
-
0
-
+0%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/25-채널별성과분석.html b/TEMP_BACKUP/prototype/25-채널별성과분석.html
deleted file mode 100644
index 91c6291..0000000
--- a/TEMP_BACKUP/prototype/25-채널별성과분석.html
+++ /dev/null
@@ -1,837 +0,0 @@
-
-
-
-
-
- 채널별 성과 분석 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
- 오늘
- 최근 7일
- 최근 30일
- 전체
-
-
-
-
-
-
-
-
-
-
-
-
-
채널 비교
-
-
-
- 채널
- 참여자
- 전환율
- 순위
-
-
-
-
-
-
-
-
-
-
-
-
-
- 📊
- 분석 리포트 다운로드
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/26-ROI분석.html b/TEMP_BACKUP/prototype/26-ROI분석.html
deleted file mode 100644
index 183e0c4..0000000
--- a/TEMP_BACKUP/prototype/26-ROI분석.html
+++ /dev/null
@@ -1,883 +0,0 @@
-
-
-
-
-
- ROI 분석 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
-
투자 대비 수익률 (ROI)
-
0%
-
- 이벤트 비용 대비 0배 의 수익을 창출했습니다.
- 지난 달 대비 +0% 향상되었습니다.
-
-
-
-
-
-
-
- 💰
- 총 수익
-
-
0원
-
예상 매출 증가분
-
-
-
-
- 💸
- 총 비용
-
-
0원
-
이벤트 운영 비용
-
-
-
-
- 📈
- 순이익
-
-
0원
-
수익 - 비용
-
-
-
-
- 🎯
- 손익분기
-
-
달성
-
참여자 기준
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 📊
- ROI 리포트 다운로드
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/27-분석리포트.html b/TEMP_BACKUP/prototype/27-분석리포트.html
deleted file mode 100644
index 4877710..0000000
--- a/TEMP_BACKUP/prototype/27-분석리포트.html
+++ /dev/null
@@ -1,910 +0,0 @@
-
-
-
-
-
- 분석 리포트 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
📊 요약
-
- 본 이벤트는 신규 회원 유치를 목적으로 총 30일간 진행되었으며,
- 다양한 채널을 통해 1,247명 의 참여자를 확보했습니다.
- 투자 대비 354.2% 의 ROI를 달성하여 목표치를 크게 상회했으며,
- 특히 Instagram 채널에서 가장 우수한 성과를 기록했습니다.
-
-
-
- ✅
- 목표 대비 124% 달성 (목표: 1,000명, 실제: 1,247명)
-
-
- 💰
- ROI 354.2% 달성 (투자 330만원, 수익 1,500만원)
-
-
- 📈
- 평균 전환율 12.5% (업계 평균 8.3% 대비 우수)
-
-
-
-
-
-
-
-
-
-
📱 채널별 성과
-
-
- 총 4개 채널을 통해 이벤트를 진행했으며, Instagram이 가장 높은 참여율을 기록했습니다.
-
-
-
-
- 채널
- 참여자
- 전환율
- 비율
-
-
-
-
-
-
-
-
-
-
-
-
💰 ROI 분석
-
-
- 총 투자 비용 330만원 대비 1,500만원의 수익을 창출하여 354.2%의 ROI를 달성했습니다.
-
-
-
-
- 항목
- 금액
- 비율
-
-
-
-
- 총 수익
- 15,000,000원
- 100%
-
-
- 총 비용
- 3,300,000원
- 22%
-
-
- 순이익
- 11,700,000원
- 78%
-
-
-
-
-
-
-
-
-
💡 개선 제안
-
-
-
📱
-
-
Instagram 채널 집중 투자
-
- Instagram이 가장 높은 참여율(36.5%)을 기록했습니다.
- 향후 이벤트에서 이 채널에 더 많은 리소스를 배분하면 더 나은 성과를 기대할 수 있습니다.
-
-
-
-
-
-
🎯
-
-
KakaoTalk 채널 개선 필요
-
- KakaoTalk 채널의 전환율이 상대적으로 낮습니다(12.8%).
- 콘텐츠 개선 및 타겟팅 전략 재검토가 필요합니다.
-
-
-
-
-
-
💰
-
-
경품 비용 최적화
-
- 경품 비용이 전체 비용의 45.5%를 차지합니다.
- 경품 구성을 다양화하고 가성비를 높여 ROI를 더 개선할 수 있습니다.
-
-
-
-
-
-
-
-
-
📝 결론
-
-
- 본 이벤트는 모든 핵심 지표에서 목표를 초과 달성하며 성공적으로 종료되었습니다.
- 특히 Instagram 채널의 우수한 성과와 높은 ROI는 향후 마케팅 전략 수립에
- 중요한 참고 자료가 될 것입니다.
-
-
- 다만, 채널별 성과 편차가 크게 나타났으므로, 차기 이벤트에서는
- 저성과 채널에 대한 개선 전략을 수립하고 고성과 채널에 대한 투자를
- 확대할 것을 권장합니다.
-
-
-
-
-
-
-
-
-
- 💾
- 저장
-
-
- 📥
- PDF 다운로드
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/28-이벤트목록.html b/TEMP_BACKUP/prototype/28-이벤트목록.html
deleted file mode 100644
index ae2c745..0000000
--- a/TEMP_BACKUP/prototype/28-이벤트목록.html
+++ /dev/null
@@ -1,846 +0,0 @@
-
-
-
-
-
- 이벤트 목록 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
- 🔍
-
-
-
-
-
-
- 전체 0
-
-
- 진행중 0
-
-
- 예정 0
-
-
- 종료 0
-
-
-
-
-
-
-
-
-
-
-
📋
-
진행 중인 이벤트가 없습니다
-
- AI를 활용해 쉽고 빠르게
- 새로운 이벤트를 만들어보세요!
-
-
- ➕
- 이벤트 만들기
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/29-마이페이지.html b/TEMP_BACKUP/prototype/29-마이페이지.html
deleted file mode 100644
index 7244726..0000000
--- a/TEMP_BACKUP/prototype/29-마이페이지.html
+++ /dev/null
@@ -1,727 +0,0 @@
-
-
-
-
-
- 마이페이지 - KT AI 이벤트 플랫폼
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- KT AI 이벤트 플랫폼 v1.0.0
- © 2025 KT Corporation. All rights reserved.
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/CHECKLIST.md b/TEMP_BACKUP/prototype/CHECKLIST.md
deleted file mode 100644
index 76c5213..0000000
--- a/TEMP_BACKUP/prototype/CHECKLIST.md
+++ /dev/null
@@ -1,413 +0,0 @@
-# 프로토타입 작성원칙 체크리스트
-
-작성일: 2025-01-20
-버전: 1.0
-검토자: UI/UX Designer (박민지 "픽셀")
-
----
-
-## 1. 디자인 원칙 준수
-
-### 1.1 Mobile First ✅
-- [x] 모든 화면이 320px 이상에서 정상 작동
-- [x] 모바일 기본 스타일 우선 작성
-- [x] Tablet(768px+), Desktop(1024px+) 반응형 지원
-- [x] Touch 타겟 최소 44x44px 보장
-
-### 1.2 브랜드 아이덴티티 ✅
-- [x] KT Red (#E31E24) Primary Color 사용
-- [x] AI Blue (#0066FF) Secondary Color 사용
-- [x] Pretendard 폰트 적용
-- [x] Material Icons 사용
-
-### 1.3 일관성 ✅
-- [x] 공통 컴포넌트 재사용 (common.css, common.js)
-- [x] 동일한 패턴 유지 (header, card, button)
-- [x] 통일된 네비게이션 (Bottom Nav)
-
----
-
-## 2. 색상 시스템
-
-### 2.1 색상 변수 사용 ✅
-- [x] CSS Variables 정의 및 사용
-- [x] Primary: --color-primary-main (#E31E24)
-- [x] Secondary: --color-secondary-main (#0066FF)
-- [x] Semantic Colors 적용 (success, warning, error, info)
-
-### 2.2 색상 대비 (WCAG 2.1 AA) ✅
-- [x] 텍스트 대비율 4.5:1 이상
-- [x] Black on White: 14.2:1
-- [x] Gray-700 on White: 8.5:1
-- [x] Primary Red on White: 7.2:1
-- [x] AI Blue on White: 7.8:1
-
-### 2.3 Semantic Colors ✅
-- [x] Success: #00C853 (완료, 승인)
-- [x] Warning: #FFA000 (경고, 대기)
-- [x] Error: #D32F2F (오류, 삭제)
-- [x] Info: #0288D1 (안내, 정보)
-
----
-
-## 3. 타이포그래피
-
-### 3.1 폰트 적용 ✅
-- [x] Pretendard 폰트 CDN 로드
-- [x] Fallback 폰트 지정
-
-### 3.2 Type Scale ✅
-- [x] Display: 28px (메인 타이틀)
-- [x] H1: 24px (화면 제목)
-- [x] H2: 20px (섹션 제목)
-- [x] H3: 18px (카드 제목)
-- [x] Body-L: 16px (입력 필드, 중요 본문)
-- [x] Body-M: 14px (일반 본문)
-- [x] Body-S: 12px (캡션, 보조 정보)
-
-### 3.3 Font Weights ✅
-- [x] Regular (400): 일반 본문
-- [x] Medium (500): 강조 본문
-- [x] SemiBold (600): 버튼, 중요 정보
-- [x] Bold (700): 제목, 헤딩
-
----
-
-## 4. 간격 시스템
-
-### 4.1 4px Grid System ✅
-- [x] 모든 간격이 4의 배수
-- [x] XS (4px), S (8px), M (16px), L (24px), XL (32px), 2XL (48px)
-
-### 4.2 컴포넌트별 간격 ✅
-- [x] Card 내부 패딩: 24px (L)
-- [x] Card 간 간격: 16px (M)
-- [x] Section 간 간격: 32px (XL)
-- [x] Screen 마진: 20px (Mobile)
-
----
-
-## 5. 컴포넌트 스타일
-
-### 5.1 Button ✅
-- [x] Primary Button: 배경 #E31E24, 텍스트 White
-- [x] Secondary Button: 테두리 #E31E24, 텍스트 Red
-- [x] Text Button: 텍스트만 표시
-- [x] 크기: Large (48px), Medium (44px), Small (36px)
-- [x] 둥근 모서리: 8px
-- [x] Disabled 상태 스타일
-
-### 5.2 Card ✅
-- [x] 배경: White
-- [x] 테두리: 1px solid #E0E0E0
-- [x] 둥근 모서리: 12px
-- [x] 그림자: 0 2px 8px rgba(0,0,0,0.08)
-- [x] 내부 패딩: 24px
-
-### 5.3 Input Field ✅
-- [x] 높이: 48px
-- [x] 둥근 모서리: 8px
-- [x] Focus 상태: 테두리 2px #0066FF
-- [x] Error 상태: 테두리 2px #D32F2F
-- [x] Placeholder: #9E9E9E
-
-### 5.4 Bottom Navigation ✅
-- [x] 높이: 60px
-- [x] 4개 아이템 (홈, 이벤트, 분석, MY)
-- [x] Active 상태: #E31E24
-- [x] Inactive 상태: #9E9E9E
-- [x] 그림자: 0 -2px 8px rgba(0,0,0,0.08)
-
-### 5.5 Header ✅
-- [x] 높이: 56px
-- [x] 뒤로가기 버튼 (좌측)
-- [x] 제목 (중앙)
-- [x] 액션 버튼 (우측, 선택적)
-
-### 5.6 Progress Bar ✅
-- [x] 높이: 48px
-- [x] 배경: #F5F5F5
-- [x] 진행률: #E31E24
-- [x] 단계 표시: "N/M 단계"
-
----
-
-## 6. 상태 관리
-
-### 6.1 AppState 사용 ✅
-- [x] localStorage 기반 상태 관리
-- [x] user, store, currentEvent 객체
-- [x] init(), save(), load() 메서드
-- [x] 화면 간 데이터 공유
-
-### 6.2 데이터 흐름 ✅
-- [x] 폼 입력 → AppState 저장
-- [x] 다음 화면 → AppState 로드
-- [x] 일관된 상태 관리
-
----
-
-## 7. 접근성 (WCAG 2.1 AA)
-
-### 7.1 시맨틱 HTML ✅
-- [x] 적절한 Heading 구조 (h1, h2, h3)
-- [x] Landmark 역할 (header, main, nav)
-- [x] Skip Link 제공
-
-### 7.2 ARIA 속성 ✅
-- [x] aria-label (아이콘 버튼)
-- [x] aria-labelledby (섹션 제목)
-- [x] role (dialog, progressbar, status)
-- [x] aria-live (Toast, 실시간 업데이트)
-
-### 7.3 키보드 접근성 ✅
-- [x] 모든 인터랙티브 요소 키보드 접근 가능
-- [x] Tab 순서 논리적
-- [x] Focus 표시 명확
-
-### 7.4 터치 타겟 ✅
-- [x] 최소 44x44px
-- [x] 충분한 간격 (8px 이상)
-
----
-
-## 8. 인터랙션 패턴
-
-### 8.1 Modal ✅
-- [x] Backdrop 클릭 시 닫힘
-- [x] 둥근 모서리: 16px
-- [x] 애니메이션: fade-in/scale
-- [x] 헤더 + 본문 + 푸터 구조
-
-### 8.2 Toast ✅
-- [x] 하단 중앙 배치
-- [x] 자동 닫힘 (3초)
-- [x] Success, Error, Info 타입
-- [x] 애니메이션: slide-up/fade
-
-### 8.3 Loading ✅
-- [x] Spinner 표시
-- [x] 메시지 표시
-- [x] Backdrop으로 인터랙션 차단
-
-### 8.4 Progress Indicator ✅
-- [x] AI 처리 단계 표시
-- [x] 진행률 퍼센트
-- [x] 예상 시간 표시
-
----
-
-## 9. AI 특화 컴포넌트
-
-### 9.1 AI 처리 상태 ✅
-- [x] Loading 메시지: "AI가 ~중입니다"
-- [x] 진행률 바 표시
-- [x] 예상 시간 명시
-
-### 9.2 AI 결과 카드 ✅
-- [x] 선택 가능한 옵션 카드
-- [x] 라디오 버튼 또는 체크박스
-- [x] 재생성 버튼 제공
-- [x] 수정 가능한 입력 필드
-
-### 9.3 AI 추천 배지 ✅
-- [x] Gradient 배경
-- [x] "AI 추천" 텍스트
-- [x] 카드 좌상단 배치
-
----
-
-## 10. 성능 최적화
-
-### 10.1 파일 구조 ✅
-- [x] 공통 CSS 분리 (common.css)
-- [x] 공통 JS 분리 (common.js)
-- [x] 중복 코드 최소화
-
-### 10.2 애니메이션 ✅
-- [x] GPU 가속 사용 (transform, opacity)
-- [x] 적절한 Duration (100~500ms)
-- [x] Easing 적용 (ease-out, ease-in)
-
-### 10.3 이미지 최적화 ✅
-- [x] 아이콘: Material Icons CDN
-- [x] 폰트: Google Fonts CDN
-- [x] 불필요한 리소스 최소화
-
----
-
-## 11. 네비게이션 구조
-
-### 11.1 화면 간 전환 ✅
-- [x] 논리적 플로우 (순차 진행)
-- [x] 뒤로가기 버튼 제공
-- [x] Bottom Navigation (홈/이벤트/분석/MY)
-
-### 11.2 URL 구조 ✅
-- [x] 번호-화면명.html 형식
-- [x] 명확한 파일 이름
-
----
-
-## 12. 화면별 체크리스트
-
-### 12.1 User Service (01-02) ✅
-- [x] 01-회원가입: KT 인증 선택적, 이메일 필수
-- [x] 02-매장정보등록: 사업자번호 검증, 주소 검색
-
-### 12.2 Event Planning (03-08) ✅
-- [x] 03-이벤트목적선택: 3가지 목적 라디오 버튼
-- [x] 04-AI트렌드분석결과: AI 분석 결과, 3초 로딩
-- [x] 05-AI경품추천: 5개 옵션, 수정 가능, 직접 입력
-- [x] 06-AI참여방법설계: 3가지 방법, 다중 선택
-- [x] 07-AI홍보문구생성: 5개 버전, 편집 모달
-- [x] 08-이벤트기획안승인: 전체 요약, 승인/수정
-
-### 12.3 Content Generation (09-14) ✅
-- [x] 09-AI이미지생성: (삭제됨)
-- [x] 10-AI영상제작: 15초 영상, 우리동네TV 16:9, TTS 선택
-- [x] 11-SNS콘텐츠생성: Instagram, Blog, Kakao (우리동네TV/링고비즈 제외)
-- [x] 12-QR포스터생성: URL 자동 생성, A4/A3 선택
-- [x] 13-콘텐츠편집: 텍스트/색상/크기 편집, 선택적
-- [x] 14-콘텐츠최종승인: 갤러리 뷰, 다운로드, 시간 추적
-
-### 12.4 Distribution (15-17) ✅
-- [x] 15-배포채널선택: (삭제됨)
-- [x] 16-배포진행상태: 실시간 진행, 재시도, 완료 확인
-- [x] 17-오프라인자료다운로드: QR 포스터, 이미지, 일괄 다운로드
-
-### 12.5 Participation (18-19) ❌
-- [x] 18-이벤트참여: (사용자 요청으로 제외)
-- [x] 19-참여완료: (사용자 요청으로 제외)
-
-### 12.6 Analytics (20-24) ✅
-- [x] 20-당첨자명단관리: 검색/필터, 배송 상태, 엑셀 다운로드
-- [x] 21-실시간대시보드: 5분 자동 새로고침, 주요 지표, 채널 현황
-- [x] 22-채널별성과분석: 순위, 상세 지표, 비교 차트, AI 인사이트
-- [x] 23-ROI분석: 비용/수익 내역, 손익분기점, ROI 추이
-- [x] 24-분석리포트: PDF 생성, 이메일 발송, 생성 이력
-
----
-
-## 13. JavaScript 기능
-
-### 13.1 공통 유틸리티 (common.js) ✅
-- [x] AppState: localStorage 상태 관리
-- [x] Toast: 알림 메시지
-- [x] Loading: 로딩 인디케이터
-- [x] Modal: 모달 열기/닫기
-
-### 13.2 화면별 기능 ✅
-- [x] 폼 검증 (이메일, 전화번호, 사업자번호)
-- [x] AI 로딩 시뮬레이션
-- [x] 데이터 저장 및 로드
-- [x] 네비게이션 처리
-
-### 13.3 이벤트 리스너 ✅
-- [x] DOMContentLoaded: 초기화
-- [x] Form submit: 검증 및 처리
-- [x] Button click: 액션 실행
-- [x] Modal backdrop: 닫기
-
----
-
-## 14. 코드 품질
-
-### 14.1 HTML ✅
-- [x] 시맨틱 태그 사용
-- [x] 적절한 들여쓰기
-- [x] 주석 추가
-- [x] 검증 필요한 입력 필드에 required
-
-### 14.2 CSS ✅
-- [x] CSS Variables 사용
-- [x] 모바일 우선 미디어 쿼리
-- [x] 클래스 명명 규칙 일관성
-- [x] 주석으로 섹션 구분
-
-### 14.3 JavaScript ✅
-- [x] IIFE 패턴 사용 (스코프 격리)
-- [x] 'use strict' 모드
-- [x] 명확한 함수명
-- [x] 에러 처리
-
----
-
-## 15. 최종 검증 항목
-
-### 15.1 필수 파일 존재 ✅
-- [x] css/common.css
-- [x] js/common.js
-- [x] 01~08 화면 (18-19 제외)
-- [x] 10~17 화면 (09, 15 제외)
-- [x] 20~24 화면
-
-### 15.2 통합성 검증 ✅
-- [x] 모든 화면에서 common.css 로드
-- [x] 모든 화면에서 common.js 로드
-- [x] Material Icons CDN 로드
-- [x] Pretendard 폰트 CDN 로드
-
-### 15.3 링크 검증 ✅
-- [x] 다음 화면으로 네비게이션
-- [x] 뒤로가기 버튼 (history.back)
-- [x] Bottom Navigation 링크
-
----
-
-## 검토 결과
-
-### ✅ 통과 항목
-1. 디자인 원칙 준수 (Mobile First, 브랜드, 일관성)
-2. 색상 시스템 (Primary, Secondary, Semantic)
-3. 타이포그래피 (Pretendard, Type Scale)
-4. 간격 시스템 (4px Grid)
-5. 컴포넌트 스타일 (Button, Card, Input, Nav)
-6. 상태 관리 (AppState)
-7. 접근성 (WCAG 2.1 AA)
-8. 인터랙션 패턴 (Modal, Toast, Loading)
-9. AI 특화 컴포넌트
-10. 성능 최적화
-11. 네비게이션 구조
-12. 화면별 기능 (18-19 제외)
-13. JavaScript 기능
-14. 코드 품질
-15. 최종 검증
-
-### ⚠️ 주의 항목
-- 없음 (모든 항목 통과)
-
-### ❌ 불통과 항목
-- 없음 (사용자 요청으로 제외된 18-19 제외)
-
----
-
-## 개선 권장 사항
-
-### 1. 추후 추가 고려 사항
-- [ ] 다크 모드 지원
-- [ ] PWA 기능 (오프라인 지원)
-- [ ] 더 많은 애니메이션 효과
-- [ ] 실제 API 연동
-- [ ] 실제 이미지 리소스
-
-### 2. 테스트 권장 사항
-- [ ] 크로스 브라우저 테스트 (Chrome, Safari, Firefox)
-- [ ] 모바일 디바이스 실제 테스트
-- [ ] 접근성 검증 도구 (Lighthouse, axe)
-- [ ] 성능 측정 (PageSpeed Insights)
-
----
-
-## 최종 승인
-
-**검토자**: 박민지 "픽셀" (UI/UX Designer)
-**검토일**: 2025-01-20
-**상태**: ✅ 승인 (프로토타입 작성원칙 모두 준수)
-
-**총평**:
-모든 화면이 Mobile First 디자인 원칙을 준수하며, KT 브랜드 가이드라인과 스타일 가이드를 충실히 따르고 있습니다. WCAG 2.1 AA 접근성 기준을 만족하며, 일관된 컴포넌트 사용과 상태 관리로 유지보수가 용이한 구조입니다.
-
-사용자 요청에 따라 18-19번 화면을 제외하고 모든 프로토타입 화면이 완성되었으며, 각 화면은 설계 명세를 정확히 구현하고 있습니다.
-
-다음 단계로 웹브라우저 테스트 및 실제 사용성 검증을 진행할 것을 권장합니다.
diff --git a/TEMP_BACKUP/prototype/TEST-REPORT.md b/TEMP_BACKUP/prototype/TEST-REPORT.md
deleted file mode 100644
index 97cac16..0000000
--- a/TEMP_BACKUP/prototype/TEST-REPORT.md
+++ /dev/null
@@ -1,314 +0,0 @@
-# 웹브라우저 테스트 보고서
-
-**테스트 일시**: 2025년 1월 기준
-**테스트 도구**: Playwright (Chromium)
-**테스트 범위**: 프로토타입 HTML 22개 화면
-
----
-
-## 1. 테스트 개요
-
-### 테스트 목적
-- 모든 프로토타입 화면의 정상 로딩 확인
-- 반응형 디자인 동작 확인 (Mobile First)
-- 인터랙티브 요소 동작 확인
-- 접근성 및 사용성 검증
-
-### 테스트 환경
-- **브라우저**: Chromium (Playwright)
-- **해상도**:
- - Desktop: 1280x720 (기본)
- - Mobile: 375x667 (iPhone SE)
-- **OS**: Windows 11
-
----
-
-## 2. 테스트 결과 요약
-
-### ✅ 통과 항목 (22/22)
-
-| 화면 번호 | 화면 이름 | 로딩 | 반응형 | 인터랙션 | 접근성 |
-|---------|----------|------|--------|----------|--------|
-| 01 | 회원가입 | ✅ | ✅ | ✅ | ✅ |
-| 02 | 매장정보등록 | ✅ | ✅ | ✅ | ✅ |
-| 03 | 이벤트목적선택 | ✅ | ✅ | ✅ | ✅ |
-| 04 | AI트렌드분석결과 | ✅ | ✅ | ✅ | ✅ |
-| 05 | AI경품추천 | ✅ | ✅ | ✅ | ✅ |
-| 06 | AI참여방법설계 | ✅ | ✅ | ✅ | ✅ |
-| 07 | AI홍보문구생성 | ✅ | ✅ | ✅ | ✅ |
-| 08 | 이벤트기획안승인 | ✅ | ✅ | ✅ | ✅ |
-| 10 | AI영상제작 | ✅ | ✅ | ✅ | ✅ |
-| 11 | SNS콘텐츠생성 | ✅ | ✅ | ✅ | ✅ |
-| 12 | QR포스터생성 | ✅ | ✅ | ✅ | ✅ |
-| 13 | 콘텐츠편집 | ✅ | ✅ | ✅ | ✅ |
-| 14 | 콘텐츠최종승인 | ✅ | ✅ | ✅ | ✅ |
-| 16 | 배포진행상태 | ✅ | ✅ | ✅ | ✅ |
-| 17 | 오프라인자료다운로드 | ✅ | ✅ | ✅ | ✅ |
-| 20 | 당첨자명단관리 | ✅ | ✅ | ✅ | ✅ |
-| 21 | 실시간대시보드 | ✅ | ✅ | ✅ | ✅ |
-| 22 | 채널별성과분석 | ✅ | ✅ | ✅ | ✅ |
-| 23 | ROI분석 | ✅ | ✅ | ✅ | ✅ |
-| 24 | 분석리포트 | ✅ | ✅ | ✅ | ✅ |
-
-**제외 화면**: 18-참여자관리, 19-당첨자추첨 (사용자 요청으로 미개발)
-
----
-
-## 3. 상세 테스트 결과
-
-### 3.1 화면 로딩 테스트
-
-**테스트 대상**: 01-회원가입.html, 04-AI트렌드분석결과.html, 10-AI영상제작.html, 21-실시간대시보드.html
-
-#### ✅ 성공 사례
-
-1. **01-회원가입.html**
- - 페이지 타이틀: "회원가입 - KT 이벤트 마케팅" ✅
- - Header 렌더링: 정상 ✅
- - Form 요소 렌더링: 정상 ✅
- - Console 로그: "KT Event Marketing App - Common JS loaded" ✅
- - Console 로그: "회원가입 페이지 로드 완료" ✅
-
-2. **04-AI트렌드분석결과.html**
- - 페이지 타이틀: "AI 트렌드 분석 - KT 이벤트 마케팅" ✅
- - AppState 검증 로직 동작: ✅
- - 매장 정보 없을 시 자동 리다이렉트: ✅ (예상된 동작)
-
-3. **10-AI영상제작.html**
- - 페이지 타이틀: "AI 영상 제작 - KT AI 이벤트" ✅
- - 진행률 표시: "콘텐츠 2/5: 영상" ✅
- - 체크박스 그룹: 정상 렌더링 ✅
- - Material Icons: 정상 표시 ✅
-
-4. **21-실시간대시보드.html**
- - 페이지 타이틀: "실시간 대시보드 - KT AI 이벤트" ✅
- - Bottom Navigation: 정상 렌더링 ✅
- - 실시간 데이터 표시: 정상 ✅
- - Progress Bar: 정상 렌더링 ✅
-
-### 3.2 반응형 디자인 테스트
-
-**테스트 해상도**:
-- Desktop: 1280x720
-- Mobile: 375x667 (iPhone SE)
-
-#### ✅ 테스트 결과
-
-1. **21-실시간대시보드.html**
- - Desktop (1280x720):
- - 레이아웃: 정상 ✅
- - Card 간격: 적절 ✅
- - Bottom Navigation: 정상 표시 ✅
-
- - Mobile (375x667):
- - 레이아웃: 정상 축소 ✅
- - 텍스트 가독성: 양호 ✅
- - Bottom Navigation: 고정 하단 표시 ✅
- - 터치 영역: 충분 (44px 이상) ✅
-
-**스크린샷**:
-- `screenshots/21-실시간대시보드.png` (Desktop)
-- `screenshots/21-실시간대시보드-mobile.png` (Mobile)
-
-### 3.3 인터랙션 테스트
-
-**테스트 대상**: 01-회원가입.html
-
-#### ✅ 폼 입력 테스트
-
-1. **입력 필드 동작**
- - 이름 입력: "정우진" 입력 성공 ✅
- - 전화번호 입력: "010-1234-5678" 입력 성공 ✅
- - 이메일 입력: "test@example.com" 입력 성공 ✅
-
-2. **체크박스 동작**
- - 개인정보 수집 동의 체크박스 클릭: 정상 ✅
- - 체크 상태 변경: checked 속성 정상 반영 ✅
-
-3. **버튼 활성화**
- - 초기 상태: disabled ✅
- - 필수 입력 완료 후: enabled 상태로 변경 ✅
- - 버튼 스타일: Primary 버튼 스타일 정상 적용 ✅
-
-**스크린샷**:
-- `screenshots/01-회원가입.png` (초기 상태)
-- `screenshots/01-회원가입-filled.png` (입력 완료 상태)
-
-### 3.4 접근성 테스트
-
-#### ✅ 시맨틱 HTML
-
-1. **Landmark Roles**
- - `` banner role: ✅
- - `` main role: ✅
- - `` navigation role: ✅
-
-2. **Heading 구조**
- - h1: 페이지 제목 (예: "회원가입") ✅
- - h2: 섹션 제목 (예: "주요 지표") ✅
- - h3: 하위 섹션 제목 ✅
- - 논리적 순서: 정상 ✅
-
-3. **ARIA 속성**
- - `aria-label`: 버튼, 아이콘에 적절히 적용 ✅
- - `aria-labelledby`: 섹션 제목 연결 정상 ✅
- - `role`: 적절한 역할 부여 ✅
-
-4. **Skip Link**
- - "본문으로 건너뛰기" 링크: 모든 화면에 존재 ✅
- - href="#main-content": 정상 연결 ✅
-
-5. **터치 타겟**
- - 최소 크기: 44x44px ✅
- - 버튼 높이: 48px (Large), 44px (Medium) ✅
- - 간격: 충분한 여백 확보 ✅
-
-### 3.5 상태 관리 테스트
-
-#### ✅ AppState 동작 확인
-
-1. **localStorage 기반 상태 관리**
- - AppState.init() 호출: 정상 ✅
- - 객체 구조: user, store, currentEvent ✅
-
-2. **화면 간 데이터 공유**
- - 04번 화면에서 store 정보 검증: 정상 ✅
- - 없을 시 자동 리다이렉트: 정상 동작 ✅
-
----
-
-## 4. 발견된 이슈
-
-### ⚠️ 주의 사항 (0건)
-현재까지 발견된 주의 사항 없음
-
-### ❌ 버그 (0건)
-현재까지 발견된 버그 없음
-
----
-
-## 5. 성능 분석
-
-### 5.1 페이지 로딩 속도
-- **HTML 로딩**: 즉시 (로컬 파일)
-- **CSS 로딩**: common.css 1회 로딩, 캐싱 효율적 ✅
-- **JavaScript 로딩**: common.js 1회 로딩, 캐싱 효율적 ✅
-- **Material Icons**: CDN 로딩, 정상 ✅
-- **Pretendard Font**: Google Fonts CDN 로딩, 정상 ✅
-
-### 5.2 렌더링 성능
-- **First Paint**: 즉시 (< 100ms 추정)
-- **Layout Shift**: 없음 ✅
-- **Animation**: smooth, 60fps 예상 ✅
-
----
-
-## 6. 브라우저 호환성 예측
-
-### ✅ 예상 지원 브라우저
-
-| 브라우저 | 버전 | 지원 여부 | 비고 |
-|---------|------|----------|------|
-| Chrome | 90+ | ✅ | 테스트 완료 (Chromium) |
-| Safari | 14+ | ✅ | CSS Variables, Flexbox 지원 |
-| Firefox | 88+ | ✅ | Modern CSS 지원 |
-| Edge | 90+ | ✅ | Chromium 기반 |
-| Mobile Safari | iOS 14+ | ✅ | 반응형 디자인 확인됨 |
-| Chrome Mobile | Android 90+ | ✅ | 반응형 디자인 확인됨 |
-
-### ⚠️ 제한적 지원
-- Internet Explorer 11: ❌ (CSS Variables 미지원)
-- Safari 13 이하: ⚠️ (일부 CSS 기능 제한)
-
----
-
-## 7. 권장 사항
-
-### 7.1 추가 테스트 권장 사항
-
-1. **크로스 브라우저 테스트**
- - Safari (macOS, iOS)
- - Firefox (Windows, macOS)
- - Edge (Windows)
- - Chrome Mobile (Android)
-
-2. **접근성 도구 검증**
- - Lighthouse Accessibility 스코어 측정
- - axe DevTools 검사
- - WAVE 검사
-
-3. **성능 측정**
- - Google PageSpeed Insights
- - Lighthouse Performance 스코어
- - WebPageTest
-
-4. **실제 디바이스 테스트**
- - iPhone SE, iPhone 12/13/14
- - Galaxy S21/S22/S23
- - iPad Air/Pro
- - Android Tablet
-
-### 7.2 개선 권장 사항
-
-1. **Progressive Enhancement**
- - Service Worker 추가 (오프라인 지원)
- - App Manifest 추가 (PWA)
- - 캐싱 전략 최적화
-
-2. **성능 최적화**
- - 이미지 최적화 (WebP, lazy loading)
- - JavaScript 번들 최적화
- - CSS Critical Path 최적화
-
-3. **접근성 강화**
- - 키보드 네비게이션 추가 테스트
- - 스크린 리더 호환성 검증
- - 고대비 모드 지원 검토
-
----
-
-## 8. 최종 결론
-
-### ✅ 테스트 통과
-
-**전체 통과율**: 100% (22/22 화면)
-
-**주요 성과**:
-1. ✅ 모든 화면 정상 로딩 및 렌더링
-2. ✅ Mobile First 반응형 디자인 정상 동작
-3. ✅ 인터랙티브 요소 (폼, 버튼, 체크박스) 정상 동작
-4. ✅ WCAG 2.1 AA 접근성 기준 준수
-5. ✅ AppState 기반 상태 관리 정상 동작
-6. ✅ Material Icons, Pretendard Font 정상 로딩
-7. ✅ KT 브랜드 컬러 시스템 정상 적용
-8. ✅ 4px Grid Spacing System 정상 적용
-
-**프로토타입 품질**: 우수
-- 디자인 일관성: ✅
-- 사용자 경험: ✅
-- 기술적 구현: ✅
-- 접근성: ✅
-
-**배포 준비 상태**: Ready for Review ✅
-
----
-
-## 부록: 테스트 스크린샷
-
-### Desktop 화면
-- `screenshots/01-회원가입.png`
-- `screenshots/04-AI트렌드분석결과.png` (매장정보등록으로 리다이렉트)
-- `screenshots/10-AI영상제작.png`
-- `screenshots/21-실시간대시보드.png`
-
-### Mobile 화면
-- `screenshots/21-실시간대시보드-mobile.png`
-
-### 인터랙션 테스트
-- `screenshots/01-회원가입-filled.png` (폼 입력 완료)
-
----
-
-**테스트 수행자**: Claude (AI Assistant)
-**테스트 도구**: Playwright MCP
-**보고서 작성일**: 2025년 1월
diff --git a/TEMP_BACKUP/prototype/backup/01-로그인.html b/TEMP_BACKUP/prototype/backup/01-로그인.html
deleted file mode 100644
index 87df5ca..0000000
--- a/TEMP_BACKUP/prototype/backup/01-로그인.html
+++ /dev/null
@@ -1,246 +0,0 @@
-
-
-
-
-
-
- 로그인 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
- campaign
-
-
KT 이벤트 마케팅
-
AI로 쉽고 빠르게, 효과적인 이벤트
-
-
-
-
-
-
- 이메일
-
-
-
-
-
- 비밀번호
-
-
-
-
-
-
-
-
- 로그인 상태 유지
-
-
-
- 비밀번호 찾기
-
-
-
-
-
- 로그인
-
-
-
-
- smartphone
- KT 통합 인증으로 로그인
-
-
-
-
-
-
아직 계정이 없으신가요?
-
- 회원가입하기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/02-홈화면.html b/TEMP_BACKUP/prototype/backup/02-홈화면.html
deleted file mode 100644
index 5750ed9..0000000
--- a/TEMP_BACKUP/prototype/backup/02-홈화면.html
+++ /dev/null
@@ -1,262 +0,0 @@
-
-
-
-
-
-
- 홈 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
- KT 이벤트 마케팅
-
- notifications
-
-
-
-
-
-
-
-
-
- 홍길동님, 안녕하세요! 👋
- 오늘도 성공적인 이벤트를 만들어보세요
-
-
-
-
- 빠른 시작
-
-
-
-
- add_circle
-
- 새 이벤트 만들기
- AI가 자동으로 기획
-
-
-
-
-
- dashboard
-
- 실시간 대시보드
- 성과 한눈에 보기
-
-
-
-
-
- analytics
-
- 성과 분석
- 채널별 성과 확인
-
-
-
-
-
- emoji_events
-
- 당첨자 관리
- 당첨자 명단 확인
-
-
-
-
-
-
-
-
진행 중인 이벤트
-
- 전체보기
-
-
-
-
-
-
-
event_busy
-
진행 중인 이벤트가 없습니다
-
- 첫 이벤트 만들기
-
-
-
-
-
-
-
-
-
-
- AI 추천 팁 💡
-
-
-
- lightbulb
-
-
-
이번 주 트렌드
-
- "설날 특별 할인" 키워드가 급상승 중입니다. 지금 이벤트를 시작하면 평균 대비 2.3배 높은 참여율이 예상됩니다.
-
-
- 자세히 보기
- arrow_forward
-
-
-
-
-
-
-
-
- 최근 활동
-
-
-
history
-
최근 활동이 없습니다
-
-
-
-
-
-
-
-
-
- home
- 홈
-
-
- campaign
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/03-회원가입.html b/TEMP_BACKUP/prototype/backup/03-회원가입.html
deleted file mode 100644
index c92e52f..0000000
--- a/TEMP_BACKUP/prototype/backup/03-회원가입.html
+++ /dev/null
@@ -1,324 +0,0 @@
-
-
-
-
-
-
- 회원가입 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- 회원가입
-
-
-
-
-
-
-
-
-
-
-
-
- 이름
-
-
-
-
-
- 전화번호
-
-
-
-
-
- 이메일
-
-
-
-
-
-
-
-
-
-
-
- 다음 단계
-
-
-
-
-
-
- 이미 계정이 있으신가요?
- 로그인
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/04-1-AI이벤트유형추천.html b/TEMP_BACKUP/prototype/backup/04-1-AI이벤트유형추천.html
deleted file mode 100644
index a332dd9..0000000
--- a/TEMP_BACKUP/prototype/backup/04-1-AI이벤트유형추천.html
+++ /dev/null
@@ -1,550 +0,0 @@
-
-
-
-
-
-
- AI 이벤트 유형 추천 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 이벤트 유형 추천
-
- tune
-
-
-
-
-
-
-
-
-
-
auto_awesome
-
-
수원왕갈비님을 위한 맞춤 추천
-
- 한식당 · 봄 시즌 · 예산 30만원
-
-
- lightbulb
- 13가지 이벤트 유형 중 7가지 가 추천되었습니다
-
-
-
-
-
-
-
-
- 총 7개 이벤트
-
-
- 추천순
- 가성비 높은 순
- 난이도 낮은 순
- 예산 낮은 순
-
-
-
-
-
-
-
-
-
-
-
-
-
- check_circle
- 선택한 이벤트로 계속하기
-
-
- 이벤트를 선택해주세요
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/04-2-이벤트상세정보.html b/TEMP_BACKUP/prototype/backup/04-2-이벤트상세정보.html
deleted file mode 100644
index 4a59600..0000000
--- a/TEMP_BACKUP/prototype/backup/04-2-이벤트상세정보.html
+++ /dev/null
@@ -1,624 +0,0 @@
-
-
-
-
-
-
- 이벤트 상세 정보 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- 이벤트 상세 정보
-
-
-
-
-
-
-
-
-
-
- tag
-
-
-
SNS 해시태그 이벤트
-
- 인스타그램 해시태그 참여로 바이럴 효과 극대화
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- trending_up
- 기대 효과
-
-
-
-
check_circle
-
-
SNS 노출 +400~600%
-
해시태그를 통한 유기적 확산으로 브랜드 노출 극대화
-
-
-
-
group_add
-
-
신규 고객 +60~80%
-
SNS를 통한 새로운 고객 유입 및 방문 증가
-
-
-
-
campaign
-
-
브랜드 인지도 +120%
-
바이럴 효과로 지역 내 인지도 상승
-
-
-
-
-
-
-
-
- store
- 적합한 매장
-
-
-
- check
- 비주얼이 좋은 메뉴를 보유한 매장
-
-
- check
- 20~40대 젊은 층을 타겟으로 하는 매장
-
-
- check
- 카페, 일식당, 양식당 (인스타 특화)
-
-
- check
- 매장 내 포토존 또는 감성적인 공간 보유
-
-
-
-
-
-
-
- calendar_today
- 추천 계절/시기
-
-
-
-
🌸 봄
-
벚꽃 시즌 특히 효과적
-
추천도 ⭐⭐⭐⭐⭐
-
-
-
❄️ 겨울
-
크리스마스 시즌 효과
-
추천도 ⭐⭐⭐⭐⭐
-
-
-
🧊 여름
-
시원한 메뉴와 연계
-
추천도 ⭐⭐⭐⭐
-
-
-
🍁 가을
-
단풍 콘셉트 활용
-
추천도 ⭐⭐⭐⭐
-
-
-
-
-
-
-
-
-
-
-
- 5단계 실행 가이드
-
-
-
-
1
-
-
준비 단계 (1-2일)
-
- ✓ 이벤트 이미지 제작 (Canva 무료 활용)
- ✓ 해시태그 선정 (매장명 + 이벤트명 + 지역명)
- ✓ 참여 조건 명확화
- ✓ 경품 준비
-
-
-
-
-
-
2
-
-
게시 단계 (1일)
-
- ✓ 피드 게시: 이벤트 메인 이미지 + 상세 설명
- ✓ 스토리 게시: 24시간 노출용 간단 안내
- ✓ 하이라이트 등록: 이벤트 기간 동안 계속 노출
-
-
-
-
-
-
3
-
-
운영 단계 (이벤트 기간)
-
- ✓ 매일 오전 9시: 스토리 재업로드
- ✓ 댓글 답변: 2시간 이내 응답
- ✓ 참여자 리그램: 하루 3-5건
-
-
-
-
-
-
4
-
-
추첨 단계 (이벤트 종료 후)
-
- ✓ 참여자 목록 엑셀 정리
- ✓ 무작위 추첨 (random.org 활용)
- ✓ 당첨자 DM 발송 + 피드 공지
-
-
-
-
-
-
5
-
-
사후 관리
-
- ✓ 참여 감사 스토리
- ✓ 이벤트 결과 공유
- ✓ 다음 이벤트 예고
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 비용 구조 상세
-
-
-
총 비용: 50,000원
-
-
-
-
제작비
-
Canva 무료 템플릿 사용
-
-
0원
-
-
-
-
-
경품비
-
음료 쿠폰 50장 × 1,000원
-
-
50,000원
-
-
-
-
-
-
예상 수익 분석
-
-
- 신규 팔로워
- 100-300명
-
-
- 예상 매출 증가
- 500,000-1,500,000원
-
-
- 순수익 (원가 30% 제외)
- 300,000-1,300,000원
-
-
- ROI
- 600-650%
-
-
-
-
-
-
-
- 예산별 시뮬레이션
-
-
-
추천 예산: 50,000원
-
경품 50개 제공
-
- 예상 순수익
- +850,000원
-
-
-
-
최소 예산: 30,000원
-
경품 30개 제공
-
- 예상 순수익
- +510,000원
-
-
-
-
최대 예산: 100,000원
-
경품 100개 제공
-
- 예상 순수익
- +1,650,000원
-
-
-
-
-
-
-
-
-
-
-
-
-
- star
-
수원 소재 카페 A
-
-
- 업종: 카페 | 지역: 수원 | 계절: 봄 (벚꽃 시즌)
-
-
-
이벤트 내용
-
- "벚꽃 라떼 인증샷 이벤트" 진행
- 해시태그 #OO카페벚꽃 #수원카페 #벚꽃라떼
- 팔로우 + 게시물 공유 + 해시태그 3개
-
-
- 결과
-
-
-
-
-
-
- star
-
강남 소재 일식당 B
-
-
- 업종: 일식당 | 지역: 강남 | 계절: 여름
-
-
-
이벤트 내용
-
- "여름 초밥 플레이팅 인증샷 이벤트"
- 해시태그 #OO초밥 #강남맛집 #여름초밥
- 스토리 공유 시 음료 무료 제공
-
-
- 결과
-
-
-
-
-
-
-
-
-
-
-
- arrow_forward
- 이 이벤트로 기획안 만들기
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/04-매장정보등록.html b/TEMP_BACKUP/prototype/backup/04-매장정보등록.html
deleted file mode 100644
index c865ab3..0000000
--- a/TEMP_BACKUP/prototype/backup/04-매장정보등록.html
+++ /dev/null
@@ -1,843 +0,0 @@
-
-
-
-
-
-
- 매장정보등록 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- 매장정보등록
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 선택 정보
-
- 이벤트 맞춤화를 위해 추가 정보를 입력해주세요
-
-
-
-
- 메뉴/상품 (최대 10개)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 등록 완료하기
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/05-이벤트목적선택.html b/TEMP_BACKUP/prototype/backup/05-이벤트목적선택.html
deleted file mode 100644
index 72664bc..0000000
--- a/TEMP_BACKUP/prototype/backup/05-이벤트목적선택.html
+++ /dev/null
@@ -1,540 +0,0 @@
-
-
-
-
-
-
- 이벤트 목적 선택 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
이벤트 목적을 선택하세요
-
선택한 목적에 맞춰 AI가 최적의 이벤트를 기획합니다
-
-
-
-
-
-
-
-
-
- info
-
-
👤
-
신규고객 유치
-
새로운 고객 확보
-
예상효과: +30%
-
- check_circle
-
-
-
-
-
-
-
-
-
- info
-
-
🔄
-
재방문 유도
-
기존 고객 재방문
-
예상효과: +25%
-
- check_circle
-
-
-
-
-
-
-
-
-
- info
-
-
💰
-
매출 증대
-
단기 매출 향상
-
예상효과: +40%
-
- check_circle
-
-
-
-
-
-
-
-
-
- info
-
-
📢
-
인지도 향상
-
브랜드 인지도 제고
-
예상효과: +50%
-
- check_circle
-
-
-
-
-
-
-
- 다음 (AI분석)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/06-1-AI트렌드분석결과.html b/TEMP_BACKUP/prototype/backup/06-1-AI트렌드분석결과.html
deleted file mode 100644
index 5c44b09..0000000
--- a/TEMP_BACKUP/prototype/backup/06-1-AI트렌드분석결과.html
+++ /dev/null
@@ -1,538 +0,0 @@
-
-
-
-
-
-
- AI 트렌드 분석 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 트렌드 분석
-
- close
-
-
-
-
-
-
-
-
-
-
-
-
-
🤖 AI가 분석중입니다...
-
업종, 지역, 시즌을 고려한 트렌드를 분석하고 있습니다
-
-
-
-
-
-
-
-
분석 시작 중...
-
-
-
-
-
-
-
- 📊
- 분석 결과
-
-
-
-
-
매장
-
-
-
-
업종
-
-
-
-
지역
-
-
-
-
시즌
-
-
-
-
-
-
-
-
-
-
-
-
-
- 78% 🎯
-
-
예상 성공률 (동일 업종 평균 대비)
-
-
-
-
-
- refresh
- 다시 분석하기
-
-
-
-
- 다음 (경품추천)
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/06-2-이벤트상세정보.html b/TEMP_BACKUP/prototype/backup/06-2-이벤트상세정보.html
deleted file mode 100644
index 4a59600..0000000
--- a/TEMP_BACKUP/prototype/backup/06-2-이벤트상세정보.html
+++ /dev/null
@@ -1,624 +0,0 @@
-
-
-
-
-
-
- 이벤트 상세 정보 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- 이벤트 상세 정보
-
-
-
-
-
-
-
-
-
-
- tag
-
-
-
SNS 해시태그 이벤트
-
- 인스타그램 해시태그 참여로 바이럴 효과 극대화
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- trending_up
- 기대 효과
-
-
-
-
check_circle
-
-
SNS 노출 +400~600%
-
해시태그를 통한 유기적 확산으로 브랜드 노출 극대화
-
-
-
-
group_add
-
-
신규 고객 +60~80%
-
SNS를 통한 새로운 고객 유입 및 방문 증가
-
-
-
-
campaign
-
-
브랜드 인지도 +120%
-
바이럴 효과로 지역 내 인지도 상승
-
-
-
-
-
-
-
-
- store
- 적합한 매장
-
-
-
- check
- 비주얼이 좋은 메뉴를 보유한 매장
-
-
- check
- 20~40대 젊은 층을 타겟으로 하는 매장
-
-
- check
- 카페, 일식당, 양식당 (인스타 특화)
-
-
- check
- 매장 내 포토존 또는 감성적인 공간 보유
-
-
-
-
-
-
-
- calendar_today
- 추천 계절/시기
-
-
-
-
🌸 봄
-
벚꽃 시즌 특히 효과적
-
추천도 ⭐⭐⭐⭐⭐
-
-
-
❄️ 겨울
-
크리스마스 시즌 효과
-
추천도 ⭐⭐⭐⭐⭐
-
-
-
🧊 여름
-
시원한 메뉴와 연계
-
추천도 ⭐⭐⭐⭐
-
-
-
🍁 가을
-
단풍 콘셉트 활용
-
추천도 ⭐⭐⭐⭐
-
-
-
-
-
-
-
-
-
-
-
- 5단계 실행 가이드
-
-
-
-
1
-
-
준비 단계 (1-2일)
-
- ✓ 이벤트 이미지 제작 (Canva 무료 활용)
- ✓ 해시태그 선정 (매장명 + 이벤트명 + 지역명)
- ✓ 참여 조건 명확화
- ✓ 경품 준비
-
-
-
-
-
-
2
-
-
게시 단계 (1일)
-
- ✓ 피드 게시: 이벤트 메인 이미지 + 상세 설명
- ✓ 스토리 게시: 24시간 노출용 간단 안내
- ✓ 하이라이트 등록: 이벤트 기간 동안 계속 노출
-
-
-
-
-
-
3
-
-
운영 단계 (이벤트 기간)
-
- ✓ 매일 오전 9시: 스토리 재업로드
- ✓ 댓글 답변: 2시간 이내 응답
- ✓ 참여자 리그램: 하루 3-5건
-
-
-
-
-
-
4
-
-
추첨 단계 (이벤트 종료 후)
-
- ✓ 참여자 목록 엑셀 정리
- ✓ 무작위 추첨 (random.org 활용)
- ✓ 당첨자 DM 발송 + 피드 공지
-
-
-
-
-
-
5
-
-
사후 관리
-
- ✓ 참여 감사 스토리
- ✓ 이벤트 결과 공유
- ✓ 다음 이벤트 예고
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 비용 구조 상세
-
-
-
총 비용: 50,000원
-
-
-
-
제작비
-
Canva 무료 템플릿 사용
-
-
0원
-
-
-
-
-
경품비
-
음료 쿠폰 50장 × 1,000원
-
-
50,000원
-
-
-
-
-
-
예상 수익 분석
-
-
- 신규 팔로워
- 100-300명
-
-
- 예상 매출 증가
- 500,000-1,500,000원
-
-
- 순수익 (원가 30% 제외)
- 300,000-1,300,000원
-
-
- ROI
- 600-650%
-
-
-
-
-
-
-
- 예산별 시뮬레이션
-
-
-
추천 예산: 50,000원
-
경품 50개 제공
-
- 예상 순수익
- +850,000원
-
-
-
-
최소 예산: 30,000원
-
경품 30개 제공
-
- 예상 순수익
- +510,000원
-
-
-
-
최대 예산: 100,000원
-
경품 100개 제공
-
- 예상 순수익
- +1,650,000원
-
-
-
-
-
-
-
-
-
-
-
-
-
- star
-
수원 소재 카페 A
-
-
- 업종: 카페 | 지역: 수원 | 계절: 봄 (벚꽃 시즌)
-
-
-
이벤트 내용
-
- "벚꽃 라떼 인증샷 이벤트" 진행
- 해시태그 #OO카페벚꽃 #수원카페 #벚꽃라떼
- 팔로우 + 게시물 공유 + 해시태그 3개
-
-
- 결과
-
-
-
-
-
-
- star
-
강남 소재 일식당 B
-
-
- 업종: 일식당 | 지역: 강남 | 계절: 여름
-
-
-
이벤트 내용
-
- "여름 초밥 플레이팅 인증샷 이벤트"
- 해시태그 #OO초밥 #강남맛집 #여름초밥
- 스토리 공유 시 음료 무료 제공
-
-
- 결과
-
-
-
-
-
-
-
-
-
-
-
- arrow_forward
- 이 이벤트로 기획안 만들기
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/06-AI이벤트유형추천.html b/TEMP_BACKUP/prototype/backup/06-AI이벤트유형추천.html
deleted file mode 100644
index ea6437e..0000000
--- a/TEMP_BACKUP/prototype/backup/06-AI이벤트유형추천.html
+++ /dev/null
@@ -1,696 +0,0 @@
-
-
-
-
-
-
- AI 이벤트 유형 추천 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 이벤트 유형 추천
-
- tune
-
-
-
-
-
-
-
-
-
단계 2/6: AI 이벤트 유형 추천
-
-
-
-
-
-
-
auto_awesome
-
-
수원왕갈비님을 위한 맞춤 추천
-
- 한식당 · 봄 시즌 · 예산 30만원
-
-
- lightbulb
- 13가지 이벤트 유형 중 7가지 가 추천되었습니다
-
-
-
-
-
-
-
-
-
-
-
- 총 7개 이벤트
-
-
- 추천순
- 가성비 높은 순
- 난이도 낮은 순
- 예산 낮은 순
-
-
-
-
-
-
-
-
-
-
-
-
-
- check_circle
- 선택한 이벤트로 계속하기
-
-
- 이벤트를 선택해주세요
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/06-AI트렌드분석결과.html b/TEMP_BACKUP/prototype/backup/06-AI트렌드분석결과.html
deleted file mode 100644
index 1f54cdd..0000000
--- a/TEMP_BACKUP/prototype/backup/06-AI트렌드분석결과.html
+++ /dev/null
@@ -1,644 +0,0 @@
-
-
-
-
-
-
- AI 트렌드 분석 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 트렌드 분석
-
- close
-
-
-
-
-
-
-
-
-
-
-
-
-
- 🤖 AI가 분석중입니다...
-
-
- 업종, 지역, 시즌을 고려한 트렌드를 분석하고 있습니다
-
-
-
- 분석 시작 중...
-
-
-
-
-
-
-
-
- 📊
- 분석 결과
-
-
-
-
-
매장
-
- -
-
-
-
업종
-
- -
-
-
-
지역
-
- -
-
-
-
시즌
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
- 78% 🎯
-
-
- 예상 성공률 (동일 업종 평균 대비)
-
-
-
-
-
-
- refresh
- 다시 분석하기
-
-
-
-
- 다음 (경품추천)
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/07-AI이벤트상품추천.html b/TEMP_BACKUP/prototype/backup/07-AI이벤트상품추천.html
deleted file mode 100644
index 9db3d82..0000000
--- a/TEMP_BACKUP/prototype/backup/07-AI이벤트상품추천.html
+++ /dev/null
@@ -1,686 +0,0 @@
-
-
-
-
-
-
- AI 경품 추천 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 경품 추천
-
- close
-
-
-
-
-
-
-
-
-
-
-
-
-
-
campaign
-
SNS 해시태그 이벤트
-
-
- 인스타그램 해시태그 참여로 바이럴 효과 극대화
-
-
- 디지털
- 예산: 5~10만원
-
-
-
-
-
-
- 예산 설정
-
-
-
-
-
-
-
- 1만원
- 500만원
-
-
-
-
-
-
-
- 🤖
- AI 추천 경품 (Top 5)
-
-
-
-
-
-
-
-
-
- add
- 직접 입력하기
-
-
-
-
-
-
-
warning
-
-
- 예산 초과
-
-
- 선택한 경품의 총 비용이 예산을 초과합니다.
-
-
-
-
-
-
-
-
- 다음 (참여방법)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/08-AI참여방법설계.html b/TEMP_BACKUP/prototype/backup/08-AI참여방법설계.html
deleted file mode 100644
index 99b7e55..0000000
--- a/TEMP_BACKUP/prototype/backup/08-AI참여방법설계.html
+++ /dev/null
@@ -1,510 +0,0 @@
-
-
-
-
-
-
- AI 참여방법 설계 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 참여방법 설계
-
- close
-
-
-
-
-
-
-
-
-
-
-
-
- 🤖
- AI 추천 참여방법
-
-
이벤트 목적에 맞는 최적의 참여 방법을 선택하세요
-
-
-
-
-
-
-
-
-
-
옵션 1: 간편형
-
📱 QR 코드 스캔
-
-
-
- check_circle
-
-
-
-
-
-
- 난이도: ⭐ (쉬움)
-
-
- 예상참여율:
- 60%
-
-
- 재방문율:
- 20%
-
-
-
-
-
- check
- 빠른 참여
-
-
- check
- 매장 방문 불필요
-
-
-
-
- 선택하기
-
-
-
-
-
-
-
-
-
-
옵션 2: 재방문 유도형
-
🏪 매장 방문 + 리뷰
-
-
-
- check_circle
-
-
-
-
-
-
- 난이도: ⭐⭐ (보통)
-
-
- 예상참여율:
- 35%
-
-
- 재방문율:
- 80%
-
-
-
-
-
- check
- 높은 재방문율
-
-
- check
- 리뷰 축적
-
-
-
-
- 선택하기
-
-
-
-
-
-
-
-
-
-
옵션 3: 바이럴형
-
📢 SNS 공유 + 태그
-
-
-
- check_circle
-
-
-
-
-
-
- 난이도: ⭐⭐⭐ (어려움)
-
-
- 예상참여율:
- 25%
-
-
- 바이럴 확산:
- 150%
-
-
-
-
-
- check
- 입소문 효과
-
-
- check
- 신규고객 유입
-
-
-
-
- 선택하기
-
-
-
-
-
-
-
- compare_arrows
- 옵션 비교하기
-
-
-
-
- 다음 (홍보문구)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/09-AI홍보문구생성.html b/TEMP_BACKUP/prototype/backup/09-AI홍보문구생성.html
deleted file mode 100644
index fff4b81..0000000
--- a/TEMP_BACKUP/prototype/backup/09-AI홍보문구생성.html
+++ /dev/null
@@ -1,504 +0,0 @@
-
-
-
-
-
-
- AI 홍보문구 생성 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- arrow_back
-
- AI 홍보문구 생성
-
- close
-
-
-
-
-
-
-
-
-
-
-
-
-
🤖 AI가 생성중입니다...
-
매장과 이벤트에 맞는 홍보 문구를 작성하고 있습니다
-
-
문구 생성 준비 중...
-
-
-
-
-
- 📝
- 생성된 홍보 문구
-
-
-
-
-
-
-
-
- refresh
- 다시 생성하기
-
-
-
-
- 다음 (최종확인)
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/10-AI영상제작.html b/TEMP_BACKUP/prototype/backup/10-AI영상제작.html
deleted file mode 100644
index c9d241b..0000000
--- a/TEMP_BACKUP/prototype/backup/10-AI영상제작.html
+++ /dev/null
@@ -1,648 +0,0 @@
-
-
-
-
-
- AI 영상 제작 - KT AI 이벤트
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
- 영상 설정
-
-
-
-
-
배경 음악
-
-
- music_note
- 경쾌한 음악 1
- play_circle
-
-
- music_note
- 신나는 음악 2
- play_circle
-
-
- music_note
- 차분한 음악 3
- play_circle
-
-
-
-
-
-
-
-
-
텍스트 오버레이
-
-
- edit
- 편집하기
-
-
-
-
-
-
-
-
해상도 선택
-
- 선택한 채널별로 영상이 생성됩니다.
-
-
-
-
-
-
-
SNS용 (정사각형)
-
1080x1080 • Instagram, Facebook
-
-
-
-
-
-
-
-
우리동네TV용 (16:9)
-
1920x1080 • Full HD
-
-
-
-
-
-
-
-
-
- smart_display
- AI 영상 제작 시작
-
-
-
-
-
-
-
-
-
- movie_creation
-
-
-
🎬 AI가 영상 제작중...
-
- 이미지를 분석하고 있습니다...
-
-
-
- 0 %
-
-
- 예상 소요: 3분
-
-
-
-
-
-
-
- 생성 완료
-
-
-
-
-
-
- play_circle
-
-
- movie
-
-
-
- 15초 홍보 영상
-
-
-
-
- check_circle
- SNS용, 우리동네TV용 영상 생성완료
-
-
- check_circle
- 배경 음악 및 텍스트 오버레이 적용
-
-
-
-
-
-
-
-
-
- download
- 다운로드
-
-
- refresh
- 다시제작
-
-
-
-
-
-
-
-
- 다음 (SNS콘텐츠)
-
-
-
-
-
-
-
-
-
영상에 표시될 텍스트
-
-
- 0 /100자
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/10-이벤트기획안승인.html b/TEMP_BACKUP/prototype/backup/10-이벤트기획안승인.html
deleted file mode 100644
index 4d1e488..0000000
--- a/TEMP_BACKUP/prototype/backup/10-이벤트기획안승인.html
+++ /dev/null
@@ -1,619 +0,0 @@
-
-
-
-
-
- 이벤트 기획안 승인 - KT AI 이벤트
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
- schedule
-
- 소요 시간: 0초
-
-
-
- 목표 시간(10초) 대비
-
-
-
-
-
- 기획안 요약
-
-
-
-
-
- store
-
매장명
-
-
-
- 업종
- 음식점
-
-
- 위치
- 서울 강남구
-
-
-
-
-
-
-
-
-
- flag
-
이벤트 목적
-
-
신규 고객 유치
-
-
-
-
-
-
-
-
- card_giftcard
-
경품 정보
-
-
- edit
-
-
-
-
-
-
-
-
-
-
-
- how_to_reg
-
참여 방법
-
-
- edit
-
-
-
-
간편 QR 참여
-
매장 방문 시 QR 코드 스캔으로 즉시 참여
-
-
-
-
-
-
-
-
-
-
- campaign
-
홍보 문구
-
-
- edit
-
-
-
-
-
-
-
-
-
- 예상 비용
-
-
-
-
- 경품 총 비용
- 0원
-
-
- 플랫폼 이용료
- 무료
-
-
-
-
-
-
-
-
-
- 예상 효과
-
-
-
-
-
-
-
- monetization_on
-
-
-
-
-
-
-
-
-
-
-
- AI 분석 및 조언
-
-
-
lightbulb
-
-
최적화 제안
-
- 현재 기획안은 목적에 부합하는 최적의 조합입니다.
-
-
-
-
-
-
-
-
-
-
- 이전
-
-
- 승인 및 콘텐츠 제작
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/11-AI이미지생성.html b/TEMP_BACKUP/prototype/backup/11-AI이미지생성.html
deleted file mode 100644
index 52cb5a1..0000000
--- a/TEMP_BACKUP/prototype/backup/11-AI이미지생성.html
+++ /dev/null
@@ -1,390 +0,0 @@
-
-
-
-
-
- AI 이미지 생성 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
- 브랜드 설정
-
-
-
-
-
-
-
-
- auto_awesome
- AI 이미지 생성 시작
-
-
-
-
-
-
- 🤖 AI가 이미지 생성중...
-
-
-
-
-
- 브랜드 컬러와 로고를 반영하여 3가지 스타일의 이미지를 생성합니다
-
-
-
-
-
- 진행률: 0%
-
-
-
- 예상 소요: 2분 30초
-
-
-
-
-
-
-
- 생성된 이미지 (3종)
-
-
-
-
-
-
-
-
- download
- 다운로드
-
-
- refresh
- 재생성
-
-
-
-
-
-
-
-
auto_awesome
-
화려한 스타일
-
-
- check_circle
-
-
-
-
- download
- 다운로드
-
-
- refresh
- 재생성
-
-
-
-
-
-
-
-
trending_up
-
트렌디 스타일
-
-
- check_circle
-
-
-
-
- download
- 다운로드
-
-
- refresh
- 재생성
-
-
-
-
-
-
- 다음 단계
- arrow_forward
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/12-SNS콘텐츠생성.html b/TEMP_BACKUP/prototype/backup/12-SNS콘텐츠생성.html
deleted file mode 100644
index 598bd11..0000000
--- a/TEMP_BACKUP/prototype/backup/12-SNS콘텐츠생성.html
+++ /dev/null
@@ -1,483 +0,0 @@
-
-
-
-
-
- SNS 콘텐츠 생성 - KT AI 이벤트
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
- 각 플랫폼에 최적화된 콘텐츠가 생성됩니다.
-
-
-
-
-
-
-
-
-
-
- photo_camera
-
-
-
- Instagram
- 필수
-
-
1080x1080 (정사각형)
-
-
-
- 미리보기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- article
-
-
-
Naver Blog
-
800x600 (가로형)
-
-
-
- 미리보기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- chat
-
-
-
Kakao Channel
-
800x800 (정사각형)
-
-
-
- 미리보기
-
-
-
-
-
-
-
-
- auto_awesome
- 콘텐츠 생성하기
-
-
-
-
-
- 생성된 콘텐츠
-
-
-
-
-
-
-
-
-
-
- download
- 일괄 다운로드
-
-
- refresh
- 다시생성
-
-
-
-
-
-
-
-
- 다음 (QR포스터)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/13-QR포스터생성선택.html b/TEMP_BACKUP/prototype/backup/13-QR포스터생성선택.html
deleted file mode 100644
index 3cb73c9..0000000
--- a/TEMP_BACKUP/prototype/backup/13-QR포스터생성선택.html
+++ /dev/null
@@ -1,240 +0,0 @@
-
-
-
-
-
- QR 포스터 생성 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
- QR 코드 설정
-
-
-
-
연결 URL (자동생성)
-
-
- ktevnt.co/abc123
-
-
- content_copy
-
-
-
-
-
-
-
-
-
-
포스터 크기
-
-
-
-
-
-
A4
-
210 × 297mm (일반 인쇄용)
-
-
-
-
-
-
-
-
A3
-
297 × 420mm (대형 포스터용)
-
-
-
-
-
-
-
-
- description
- 포스터 생성하기
-
-
-
-
- 생성 완료
-
-
-
-
-
-
🎉
-
이벤트 참여하세요!
-
-
QR 코드를 스캔하세요
-
-
-
-
-
- PDF 파일
- 2.1 MB
-
-
- QR 이미지
- 150 KB
-
-
-
-
-
-
-
- download
- 다운로드
-
-
- print
- 인쇄하기
-
-
-
-
-
-
-
- 다음 (콘텐츠편집)
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/15-콘텐츠편집.html b/TEMP_BACKUP/prototype/backup/15-콘텐츠편집.html
deleted file mode 100644
index 446b66a..0000000
--- a/TEMP_BACKUP/prototype/backup/15-콘텐츠편집.html
+++ /dev/null
@@ -1,325 +0,0 @@
-
-
-
-
-
- 콘텐츠 편집 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
- 편집할 콘텐츠 선택
-
-
-
-
- image
-
- 이미지
-
-
-
-
- videocam
-
- 영상
-
-
-
-
- share
-
- SNS
-
-
-
-
-
-
-
편집 중
-
- close
-
-
-
-
-
-
-
-
-
- text_fields
- 텍스트
-
-
- palette
- 색상
-
-
- photo_size_select_small
- 크기
-
-
-
-
-
편집 이력
-
-
-
- • 원본
- 되돌리기
-
-
- • 버전 1 (현재)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 취소
-
-
- 저장하기
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/16-콘텐츠최종승인.html b/TEMP_BACKUP/prototype/backup/16-콘텐츠최종승인.html
deleted file mode 100644
index 6128c89..0000000
--- a/TEMP_BACKUP/prototype/backup/16-콘텐츠최종승인.html
+++ /dev/null
@@ -1,279 +0,0 @@
-
-
-
-
-
- 콘텐츠 최종 승인 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
- check_circle
- 콘텐츠 생성 완료!
-
-
-
-
-
- 생성된 콘텐츠 (갤러리)
-
-
-
-
- image
-
- 이미지1
-
-
-
-
- image
-
- 이미지2
-
-
-
-
- image
-
- 이미지3
-
-
-
-
- play_circle
-
- 15초영상
-
-
-
-
- share
-
- SNS세트
-
-
-
-
- qr_code
-
- QR포스터
-
-
-
-
- download
- 전체 다운로드
-
-
-
-
-
-
-
- schedule
- 콘텐츠 생성 시간
-
-
-
7분
-
목표: 5-8분 이내
-
✓ 목표 달성!
-
-
-
-
-
-
-
-
- arrow_back
- 수정
-
-
- check
- 승인하기
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/17-배포채널선택.html b/TEMP_BACKUP/prototype/backup/17-배포채널선택.html
deleted file mode 100644
index c720d1d..0000000
--- a/TEMP_BACKUP/prototype/backup/17-배포채널선택.html
+++ /dev/null
@@ -1,386 +0,0 @@
-
-
-
-
-
- 배포 채널 선택 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
- KT 채널
-
-
-
-
-
-
-
-
-
- tv
- 우리동네TV
-
-
지역 주변 5km 내 자동 노출
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- call
- 링고비즈 연결음
-
-
매장 전화 연결음으로 이벤트 홍보
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- connected_tv
- 지니TV 광고
-
-
TV 광고로 대규모 노출
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- SNS 채널
-
-
-
-
-
-
-
-
-
- photo_camera
- Instagram (필수)
-
-
- check_circle
- 계정 연동 완료
-
-
-
-
-
-
-
-
-
-
- facebook
- Facebook
-
-
페이스북 페이지에 자동 게시
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- article
- Naver Blog
-
-
네이버 블로그 자동 포스팅
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- chat
- 카카오톡 채널
-
-
카카오톡 채널 메시지 발송
-
-
-
- 설정
- chevron_right
-
-
-
-
-
-
-
-
- 오프라인 채널
-
-
-
-
-
-
-
-
- qr_code_2
- QR 포스터 (기본)
-
-
매장 내 부착용 QR 포스터
-
-
-
-
-
-
-
-
- 배포 일정
-
-
-
-
-
-
-
-
즉시 배포
-
승인 후 즉시 모든 채널에 배포
-
-
-
-
-
-
-
예약 배포
-
지정한 날짜/시간에 자동 배포
-
-
-
-
-
-
-
-
-
-
-
-
-
info
-
- 선택한 채널: 2개
- Instagram은 필수 채널이며, QR 포스터는 기본 제공됩니다.
-
-
-
-
-
- 다음 단계
- arrow_forward
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/18-배포진행상태.html b/TEMP_BACKUP/prototype/backup/18-배포진행상태.html
deleted file mode 100644
index 45c9c5d..0000000
--- a/TEMP_BACKUP/prototype/backup/18-배포진행상태.html
+++ /dev/null
@@ -1,364 +0,0 @@
-
-
-
-
-
- 배포 진행 중 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- check
-
-
-
Instagram
-
✅ 배포 완료 (3초)
-
-
- 게시물 보기
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
우리동네TV
-
🔄 배포 중... (15 초)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- error
-
-
-
Naver Blog
-
❌ 배포 실패 (재시도 중)
-
1/3 재시도
-
-
- 수동 재시도
-
-
-
-
-
-
-
-
-
-
-
- 전체 진행률
- 50%
-
-
- 예상 소요
- 45초
-
-
-
-
-
-
-
-
- 취소
-
-
- refresh
- 새로고침
-
-
-
-
-
-
- check_circle
- 완료 확인
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/19-오프라인자료다운로드.html b/TEMP_BACKUP/prototype/backup/19-오프라인자료다운로드.html
deleted file mode 100644
index 3761e51..0000000
--- a/TEMP_BACKUP/prototype/backup/19-오프라인자료다운로드.html
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
- 오프라인 자료 다운로드 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
- check_circle
- 배포 완료!
-
-
-
-
-
- 오프라인 홍보 자료
-
-
-
-
-
- description
-
-
-
QR 포스터 (A4)
-
2.1MB PDF
-
-
- 다운로드
-
-
-
-
-
-
-
-
-
- description
-
-
-
QR 포스터 (A3)
-
4.5MB PDF
-
-
- 다운로드
-
-
-
-
-
-
-
-
-
- qr_code
-
-
-
QR 코드 이미지
-
150KB PNG
-
-
- 다운로드
-
-
-
-
-
-
-
-
-
- collections
-
-
-
고해상도 이미지 (3종)
-
8.3MB ZIP
-
-
- 다운로드
-
-
-
-
-
-
- download
- 전체 일괄 다운로드 (ZIP)
-
-
-
-
-
-
- check_circle
- 완료
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/22-당첨자명단관리.html b/TEMP_BACKUP/prototype/backup/22-당첨자명단관리.html
deleted file mode 100644
index bfbd7f9..0000000
--- a/TEMP_BACKUP/prototype/backup/22-당첨자명단관리.html
+++ /dev/null
@@ -1,432 +0,0 @@
-
-
-
-
-
- 이벤트 관리 대시보드 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
- dashboard
- 대시보드
-
-
- emoji_events
- 당첨자
-
-
- analytics
- 분석
-
-
-
-
-
-
-
-
-
-
-
-
연말 대박 이벤트
-
D-5 (2025-12-31까지)
-
-
-
-
-
-
-
-
-
총 참여자
-
1,234명
-
+45 (오늘)
-
-
-
-
-
-
총 노출 수
-
15,678회
-
+230 (1시간)
-
-
-
-
-
-
매출 증가율
-
+42%
-
(이벤트 전 대비)
-
-
-
-
-
-
예상 ROI
-
245%
-
(투자 대비)
-
-
-
-
-
-
- 채널별 참여 현황
-
-
-
-
-
-
- Instagram
- 30%
-
-
-
-
-
-
- Naver Blog
- 10%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
연말 대박 이벤트
-
당첨인원: 100명
-
-
-
-
-
-
-
-
- 전체
- 미지급
- 완료
-
-
-
-
-
-
-
-
-
-
- people
- 참여자 전체
-
-
- download
- 엑셀 다운로드
-
-
-
-
-
-
-
-
- 채널별 성과 분석
-
-
-
-
-
bar_chart
-
채널별 성과 차트
-
-
-
-
-
-
-
- ROI 분석
-
-
-
-
- 총 투자 비용
- 500,000원
-
-
- 예상 수익
- 1,225,000원
-
-
- ROI
- 245%
-
-
- 순이익
- 725,000원
-
-
-
-
-
-
-
-
- description
- 분석 리포트 다운로드
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/23-실시간대시보드.html b/TEMP_BACKUP/prototype/backup/23-실시간대시보드.html
deleted file mode 100644
index dd76ecf..0000000
--- a/TEMP_BACKUP/prototype/backup/23-실시간대시보드.html
+++ /dev/null
@@ -1,330 +0,0 @@
-
-
-
-
-
- 실시간 대시보드 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
- 마지막 업데이트: 15:35
-
-
- refresh
- 새로고침
-
-
-
-
-
-
-
-
진행 중인 이벤트
-
연말 대박 이벤트
-
- D-5 (2025-12-31까지)
-
-
-
-
-
-
- 주요 지표
-
-
-
-
-
- people
-
-
-
총 참여자
-
1,234명
-
- trending_up
- +45 (오늘)
-
-
-
-
-
-
- visibility
-
-
-
총 노출 수
-
15,678회
-
- trending_up
- +230 (최근 1시간)
-
-
-
-
-
-
- monetization_on
-
-
-
매출 증가율
-
+42%
-
(이벤트 전 대비)
-
-
-
-
-
- trending_up
-
-
-
예상 ROI
-
245%
-
(투자 대비 수익)
-
-
-
-
-
-
-
- 채널별 참여 현황
-
-
-
-
-
-
-
- qr_code_2
- QR코드
-
-
45%
-
-
-
556명 참여
-
-
-
-
-
- photo_camera
- Instagram
-
-
30%
-
-
-
370명 참여
-
-
-
-
-
- tv
- 우리동네TV
-
-
15%
-
-
-
185명 참여
-
-
-
-
-
- article
- Naver Blog
-
-
10%
-
-
-
123명 참여
-
-
-
-
-
-
-
-
- analytics
- 상세 분석 보기
-
-
-
-
-
-
-
- home
- 홈
-
-
- event
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/24-채널별성과분석.html b/TEMP_BACKUP/prototype/backup/24-채널별성과분석.html
deleted file mode 100644
index df2d7b1..0000000
--- a/TEMP_BACKUP/prototype/backup/24-채널별성과분석.html
+++ /dev/null
@@ -1,522 +0,0 @@
-
-
-
-
-
- 채널별 성과 분석 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
📊 채널별 성과 비교
-
- download
- 리포트
-
-
-
-
-
-
분석 기간
-
- 최근 7일
- 최근 30일
- 최근 90일
- 전체 기간
-
-
2025-12-01 ~ 현재
-
-
-
-
-
-
-
- 채널별 상세 성과
-
-
-
-
-
-
- qr_code_2
- QR코드
-
-
🥇
-
-
-
-
-
-
-
-
CPA (고객 획득 비용)
-
180원
-
-
-
- 상세 보기
- chevron_right
-
-
-
-
-
-
-
-
-
- photo_camera
- Instagram
-
-
🥈
-
-
-
-
-
-
-
-
CPA (고객 획득 비용)
-
270원
-
-
-
- 상세 보기
- chevron_right
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
CPA (고객 획득 비용)
-
405원
-
-
-
- 상세 보기
- chevron_right
-
-
-
-
-
-
-
-
-
- article
- Naver Blog
-
-
-
-
-
-
-
-
-
CPA (고객 획득 비용)
-
815원
-
-
-
- 상세 보기
- chevron_right
-
-
-
-
-
-
- 비교 차트
-
-
-
-
참여율 비교
-
-
-
-
-
-
- Instagram
- 8.2%
-
-
-
-
-
-
-
-
- Naver Blog
- 7.5%
-
-
-
-
-
-
-
-
-
-
-
-
-
lightbulb
-
-
💡 AI 인사이트
-
- QR코드가 가장 높은 참여율(9.8%)과 전환율(40%)을 보입니다. 오프라인 홍보를 강화하면 효과가 더 좋을 것 같아요. 또한 Instagram의 노출 대비 참여율이 좋으므로 SNS 콘텐츠 제작을 늘리는 것을 추천합니다.
-
-
-
-
-
-
-
-
-
-
-
- home
- 홈
-
-
- event
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/25-광고수익률분석.html b/TEMP_BACKUP/prototype/backup/25-광고수익률분석.html
deleted file mode 100644
index bc3ffd0..0000000
--- a/TEMP_BACKUP/prototype/backup/25-광고수익률분석.html
+++ /dev/null
@@ -1,393 +0,0 @@
-
-
-
-
-
- ROI 분석 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
ROI (투자 대비 수익률)
-
245%
-
- 투자한 금액 대비 2.45배 수익!
-
-
-
-
-
-
- 비용 내역
-
-
-
-
-
-
- card_giftcard
- 경품 비용
-
-
100,000원
-
-
- 상품권 10장 × 10,000원
-
-
-
-
-
- settings
- 플랫폼 이용료
-
-
-
- • 우리동네TV
- 무료
-
-
- • 지니TV
- 무료
-
-
- • SNS (Instagram, Blog)
- 무료
-
-
-
-
-
-
-
-
-
-
- 수익 내역
-
-
-
-
-
-
- trending_up
- 매출 증가액
-
-
180,000원
-
-
- 이벤트 기간 vs 평균 매출 비교
-
-
-
-
-
-
- people
- 신규 고객 가치
-
-
65,000원
-
-
- 78명 × 예상 LTV (고객 생애 가치)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- check_circle
- 손익 분기점
-
-
달성
-
이벤트 3일차
-
-
-
-
- schedule
- 회수 기간 예상
-
-
약 1.5개월
-
신규 고객 기준
-
-
-
-
-
-
-
-
-
-
-
-
info
-
- ROI는 5분마다 자동으로 업데이트됩니다. POS 시스템과 연동하여 실시간 매출 데이터를 반영합니다.
-
-
-
-
-
-
-
-
-
- home
- 홈
-
-
- event
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/25-마이페이지.html b/TEMP_BACKUP/prototype/backup/25-마이페이지.html
deleted file mode 100644
index 8d9f483..0000000
--- a/TEMP_BACKUP/prototype/backup/25-마이페이지.html
+++ /dev/null
@@ -1,480 +0,0 @@
-
-
-
-
-
-
- 마이페이지 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- person
-
-
-
-
-
홍길동
-
hong@example.com
-
010-1234-5678
-
-
-
-
- 수정
-
-
-
-
-
-
-
-
-
매장 정보
-
- 수정
-
-
-
-
-
-
store
-
등록된 매장이 없습니다
-
- 매장 등록하기
-
-
-
-
-
-
-
- 서비스 관리
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 설정
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 고객 지원
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 로그아웃
-
-
-
- 회원 탈퇴
-
-
-
-
-
-
-
-
- home
- 홈
-
-
- campaign
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/26-분석리포트.html b/TEMP_BACKUP/prototype/backup/26-분석리포트.html
deleted file mode 100644
index e014846..0000000
--- a/TEMP_BACKUP/prototype/backup/26-분석리포트.html
+++ /dev/null
@@ -1,385 +0,0 @@
-
-
-
-
-
- 분석 리포트 - KT AI 이벤트
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
이벤트
-
연말 대박 이벤트
-
-
기간
-
2025-12-01 ~ 2025-12-31
-
-
-
-
-
- 리포트 미리보기
-
-
-
-
-
-
description
-
PDF 썸네일
-
-
-
-
-
-
-
-
-
- 포함 내용
-
-
-
-
-
- check_circle
- 이벤트 개요
-
-
- check_circle
- 참여 통계
-
-
- check_circle
- 노출 통계
-
-
- check_circle
- 매출 분석
-
-
- check_circle
- ROI 분석
-
-
- check_circle
- 채널별 성과 비교
-
-
- check_circle
- 업종 평균 벤치마킹
-
-
- check_circle
- 그래프 시각화
-
-
-
-
-
-
-
-
- download
- PDF 다운로드
-
-
-
- email
- 이메일로 받기
-
-
-
-
- 생성 이력
-
-
-
-
-
-
최종 리포트
-
2025-12-31 16:00
-
-
- download
- 다운로드
-
-
-
-
-
-
중간 리포트
-
2025-12-15 14:30
-
-
- download
- 다운로드
-
-
-
-
-
-
초기 리포트
-
2025-12-01 10:00
-
-
- download
- 다운로드
-
-
-
-
-
-
-
-
-
-
info
-
- 리포트 생성은 최대 30초가 소요됩니다. PDF 파일은 최대 10MB까지 최적화됩니다.
-
-
-
-
-
-
-
-
-
-
-
-
- 받는 사람
-
-
-
-
-
-
info
-
- 등록된 이메일 주소로 리포트가 발송됩니다.
-
-
-
-
-
-
-
-
-
-
-
- home
- 홈
-
-
- event
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/26-이벤트목록.html b/TEMP_BACKUP/prototype/backup/26-이벤트목록.html
deleted file mode 100644
index c909b40..0000000
--- a/TEMP_BACKUP/prototype/backup/26-이벤트목록.html
+++ /dev/null
@@ -1,365 +0,0 @@
-
-
-
-
-
-
- 이벤트 목록 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
- 전체 0
-
-
- 진행중 0
-
-
- 예정 0
-
-
- 종료 0
-
-
-
-
-
-
-
-
-
- event_busy
-
-
진행 중인 이벤트가 없습니다
-
- AI가 자동으로 이벤트를 기획해드립니다.
- 첫 이벤트를 만들어보세요!
-
-
- add_circle
- 새 이벤트 만들기
-
-
-
-
-
-
-
-
-
-
-
- add
-
-
-
-
-
- home
- 홈
-
-
- campaign
- 이벤트
-
-
- analytics
- 분석
-
-
- person
- MY
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/backup/css/common.css b/TEMP_BACKUP/prototype/backup/css/common.css
deleted file mode 100644
index c5c2e6a..0000000
--- a/TEMP_BACKUP/prototype/backup/css/common.css
+++ /dev/null
@@ -1,888 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * 공통 스타일시트
- *
- * 작성일: 2025-01-20
- * 버전: 1.0
- * 디자인 원칙: Mobile First, 접근성 우선, 일관성
- */
-
-/* ============================================
- 1. CSS Variables (Design Tokens)
- ============================================ */
-:root {
- /* Primary Colors */
- --color-primary-main: #E31E24;
- --color-primary-light: #FF4D52;
- --color-primary-dark: #C71820;
-
- /* Secondary Colors */
- --color-secondary-main: #0066FF;
- --color-secondary-light: #4D94FF;
- --color-secondary-dark: #004DBF;
-
- /* Grayscale */
- --color-black: #1A1A1A;
- --color-gray-700: #4A4A4A;
- --color-gray-500: #9E9E9E;
- --color-gray-300: #D9D9D9;
- --color-gray-100: #F5F5F5;
- --color-white: #FFFFFF;
-
- /* Semantic Colors */
- --color-success: #00C853;
- --color-warning: #FFA000;
- --color-error: #D32F2F;
- --color-info: #0288D1;
-
- /* Typography */
- --font-family-base: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', system-ui, sans-serif;
-
- /* Font Sizes (Mobile First) */
- --font-size-display: 28px;
- --font-size-h1: 24px;
- --font-size-h2: 20px;
- --font-size-h3: 18px;
- --font-size-body-l: 16px;
- --font-size-body-m: 14px;
- --font-size-body-s: 12px;
- --font-size-button: 16px;
-
- /* Font Weights */
- --font-weight-regular: 400;
- --font-weight-medium: 500;
- --font-weight-semibold: 600;
- --font-weight-bold: 700;
-
- /* Line Heights */
- --line-height-tight: 1.3;
- --line-height-normal: 1.4;
- --line-height-relaxed: 1.5;
-
- /* Spacing (4px Grid System) */
- --spacing-xs: 4px;
- --spacing-s: 8px;
- --spacing-m: 16px;
- --spacing-l: 24px;
- --spacing-xl: 32px;
- --spacing-2xl: 48px;
-
- /* Border Radius */
- --radius-sm: 8px;
- --radius-md: 12px;
- --radius-lg: 16px;
- --radius-xl: 24px;
- --radius-full: 50%;
-
- /* Shadows */
- --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);
- --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.08);
- --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.12);
- --shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.2);
-
- /* Transitions */
- --transition-fast: 100ms ease-out;
- --transition-normal: 200ms ease-out;
- --transition-slow: 300ms ease-out;
-
- /* Z-index */
- --z-dropdown: 1000;
- --z-sticky: 1020;
- --z-fixed: 1030;
- --z-modal-backdrop: 1040;
- --z-modal: 1050;
- --z-toast: 1060;
-}
-
-/* Tablet */
-@media (min-width: 768px) {
- :root {
- --font-size-display: 32px;
- --font-size-h1: 28px;
- --font-size-h2: 22px;
- --font-size-h3: 20px;
- --font-size-body-l: 18px;
- --font-size-body-m: 16px;
- --font-size-body-s: 14px;
- }
-}
-
-/* Desktop */
-@media (min-width: 1024px) {
- :root {
- --font-size-display: 36px;
- --font-size-h1: 32px;
- --font-size-h2: 24px;
- }
-}
-
-/* ============================================
- 2. Reset & Base Styles
- ============================================ */
-*, *::before, *::after {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
-}
-
-html {
- font-size: 16px;
- -webkit-text-size-adjust: 100%;
- -webkit-tap-highlight-color: transparent;
-}
-
-body {
- font-family: var(--font-family-base);
- font-size: var(--font-size-body-m);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-relaxed);
- color: var(--color-black);
- background-color: var(--color-gray-100);
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-/* ============================================
- 3. Typography System
- ============================================ */
-.display {
- font-size: var(--font-size-display);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-tight);
- letter-spacing: -0.5px;
-}
-
-h1, .h1 {
- font-size: var(--font-size-h1);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-tight);
- letter-spacing: -0.3px;
-}
-
-h2, .h2 {
- font-size: var(--font-size-h2);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-normal);
- letter-spacing: -0.2px;
-}
-
-h3, .h3 {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-normal);
-}
-
-.body-l {
- font-size: var(--font-size-body-l);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-relaxed);
-}
-
-.body-m {
- font-size: var(--font-size-body-m);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-relaxed);
-}
-
-.body-s {
- font-size: var(--font-size-body-s);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-relaxed);
-}
-
-/* ============================================
- 4. Layout
- ============================================ */
-.container {
- width: 100%;
- margin: 0 auto;
- padding: 0 20px;
-}
-
-@media (min-width: 768px) {
- .container {
- padding: 0 40px;
- }
-}
-
-@media (min-width: 1024px) {
- .container {
- max-width: 1200px;
- padding: 0 80px;
- }
-}
-
-/* App Layout */
-.app-wrapper {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- background-color: var(--color-gray-100);
-}
-
-.app-content {
- flex: 1;
- padding-bottom: 80px; /* Bottom Navigation 공간 */
-}
-
-/* ============================================
- 5. Top App Bar
- ============================================ */
-.app-bar {
- position: sticky;
- top: 0;
- z-index: var(--z-sticky);
- background-color: var(--color-white);
- border-bottom: 1px solid var(--color-gray-300);
- height: 56px;
- display: flex;
- align-items: center;
- padding: 0 var(--spacing-s);
-}
-
-.app-bar__back {
- width: 48px;
- height: 48px;
- display: flex;
- align-items: center;
- justify-content: center;
- border: none;
- background: none;
- cursor: pointer;
- color: var(--color-gray-700);
- border-radius: var(--radius-full);
- transition: background-color var(--transition-fast);
-}
-
-.app-bar__back:hover {
- background-color: var(--color-gray-100);
-}
-
-.app-bar__title {
- flex: 1;
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- text-align: center;
- margin-right: 48px; /* 뒤로가기 버튼과 균형 */
-}
-
-.app-bar__action {
- width: 48px;
- height: 48px;
- display: flex;
- align-items: center;
- justify-content: center;
- border: none;
- background: none;
- cursor: pointer;
- color: var(--color-gray-700);
- border-radius: var(--radius-full);
- transition: background-color var(--transition-fast);
-}
-
-.app-bar__action:hover {
- background-color: var(--color-gray-100);
-}
-
-/* ============================================
- 6. Bottom Navigation
- ============================================ */
-.bottom-nav {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: var(--z-fixed);
- background-color: var(--color-white);
- border-top: 1px solid var(--color-gray-300);
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
- height: 60px;
- display: flex;
-}
-
-.bottom-nav__item {
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: var(--spacing-xs);
- border: none;
- background: none;
- color: var(--color-gray-500);
- cursor: pointer;
- text-decoration: none;
- transition: color var(--transition-fast);
- min-width: 44px;
- min-height: 44px;
-}
-
-.bottom-nav__item:hover {
- color: var(--color-primary-main);
-}
-
-.bottom-nav__item.active {
- color: var(--color-primary-main);
-}
-
-.bottom-nav__icon {
- font-size: 24px;
- font-family: 'Material Icons';
- font-weight: normal;
- font-style: normal;
- display: inline-block;
-}
-
-.bottom-nav__label {
- font-size: var(--font-size-body-s);
- font-weight: var(--font-weight-regular);
-}
-
-/* ============================================
- 7. Buttons
- ============================================ */
-.btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: var(--spacing-s);
- font-family: var(--font-family-base);
- font-size: var(--font-size-button);
- font-weight: var(--font-weight-semibold);
- line-height: 1.5;
- text-align: center;
- text-decoration: none;
- border: none;
- border-radius: var(--radius-sm);
- cursor: pointer;
- transition: all var(--transition-normal);
- min-width: 44px;
- min-height: 44px;
-}
-
-.btn:disabled {
- cursor: not-allowed;
- opacity: 0.6;
-}
-
-/* Primary Button */
-.btn-primary {
- background-color: var(--color-primary-main);
- color: var(--color-white);
- box-shadow: var(--shadow-sm);
-}
-
-.btn-primary:hover:not(:disabled) {
- background-color: var(--color-primary-light);
-}
-
-.btn-primary:active:not(:disabled) {
- background-color: var(--color-primary-dark);
- transform: scale(0.95);
-}
-
-.btn-primary:disabled {
- background-color: var(--color-gray-300);
- color: var(--color-gray-500);
-}
-
-/* Secondary Button */
-.btn-secondary {
- background-color: var(--color-white);
- color: var(--color-primary-main);
- border: 2px solid var(--color-primary-main);
-}
-
-.btn-secondary:hover:not(:disabled) {
- background-color: rgba(227, 30, 36, 0.05);
-}
-
-.btn-secondary:active:not(:disabled) {
- background-color: rgba(227, 30, 36, 0.1);
- transform: scale(0.95);
-}
-
-/* Text Button */
-.btn-text {
- background-color: transparent;
- color: var(--color-primary-main);
-}
-
-.btn-text:hover:not(:disabled) {
- background-color: rgba(227, 30, 36, 0.05);
-}
-
-/* Button Sizes */
-.btn-lg {
- padding: 16px 24px;
- height: 48px;
-}
-
-.btn-md {
- padding: 12px 20px;
- height: 44px;
- font-size: var(--font-size-body-m);
-}
-
-.btn-sm {
- padding: 8px 16px;
- height: 36px;
- font-size: var(--font-size-body-s);
-}
-
-/* Full Width Button */
-.btn-block {
- width: 100%;
-}
-
-/* ============================================
- 8. Cards
- ============================================ */
-.card {
- background-color: var(--color-white);
- border: 1px solid rgba(224, 224, 224, 1);
- border-radius: var(--radius-md);
- padding: var(--spacing-l);
- box-shadow: var(--shadow-md);
- transition: all var(--transition-normal);
-}
-
-.card:hover {
- border-color: var(--color-primary-main);
- box-shadow: var(--shadow-lg);
-}
-
-.card.selected {
- border: 2px solid var(--color-primary-main);
- background-color: rgba(227, 30, 36, 0.02);
-}
-
-.card__header {
- margin-bottom: var(--spacing-m);
-}
-
-.card__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- margin-bottom: var(--spacing-s);
-}
-
-.card__body {
- color: var(--color-gray-700);
- font-size: var(--font-size-body-m);
-}
-
-.card__footer {
- margin-top: var(--spacing-m);
- padding-top: var(--spacing-m);
- border-top: 1px solid var(--color-gray-300);
-}
-
-/* ============================================
- 9. Form Elements
- ============================================ */
-.form-group {
- margin-bottom: var(--spacing-m);
-}
-
-.form-label {
- display: block;
- font-size: var(--font-size-body-m);
- font-weight: var(--font-weight-medium);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.form-label.required::after {
- content: '*';
- color: var(--color-error);
- margin-left: var(--spacing-xs);
-}
-
-.form-input {
- width: 100%;
- height: 48px;
- padding: var(--spacing-m);
- font-family: var(--font-family-base);
- font-size: var(--font-size-body-l);
- font-weight: var(--font-weight-regular);
- color: var(--color-black);
- background-color: var(--color-white);
- border: 1px solid var(--color-gray-300);
- border-radius: var(--radius-sm);
- transition: all var(--transition-normal);
-}
-
-.form-input::placeholder {
- color: var(--color-gray-500);
-}
-
-.form-input:focus {
- outline: none;
- border: 2px solid var(--color-secondary-main);
- box-shadow: 0 0 0 4px rgba(0, 102, 255, 0.1);
-}
-
-.form-input:disabled {
- background-color: var(--color-gray-100);
- color: var(--color-gray-500);
- cursor: not-allowed;
-}
-
-.form-input.error {
- border: 2px solid var(--color-error);
- box-shadow: 0 0 0 4px rgba(211, 47, 47, 0.1);
-}
-
-.form-error {
- display: block;
- margin-top: var(--spacing-s);
- font-size: var(--font-size-body-s);
- color: var(--color-error);
-}
-
-/* Textarea */
-.form-textarea {
- min-height: 120px;
- resize: vertical;
- padding: var(--spacing-m);
- font-size: var(--font-size-body-m);
- line-height: var(--line-height-relaxed);
-}
-
-/* Checkbox & Radio */
-.form-check {
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
- cursor: pointer;
- min-height: 44px;
-}
-
-.form-check input[type="checkbox"],
-.form-check input[type="radio"] {
- width: 24px;
- height: 24px;
- cursor: pointer;
- accent-color: var(--color-primary-main);
-}
-
-/* ============================================
- 10. Progress & Loading
- ============================================ */
-.progress-bar {
- width: 100%;
- height: 8px;
- background-color: var(--color-gray-100);
- border-radius: 4px;
- overflow: hidden;
-}
-
-.progress-bar__fill {
- height: 100%;
- background-color: var(--color-primary-main);
- transition: width var(--transition-slow);
-}
-
-.spinner {
- width: 32px;
- height: 32px;
- border: 3px solid var(--color-gray-100);
- border-top-color: var(--color-primary-main);
- border-radius: var(--radius-full);
- animation: spin 0.8s linear infinite;
-}
-
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-.loading-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: var(--z-modal);
-}
-
-/* ============================================
- 11. Toast Notification
- ============================================ */
-.toast {
- position: fixed;
- bottom: 80px;
- left: 50%;
- transform: translateX(-50%);
- z-index: var(--z-toast);
- background-color: rgba(26, 26, 26, 0.9);
- color: var(--color-white);
- padding: var(--spacing-m) var(--spacing-l);
- border-radius: var(--radius-sm);
- font-size: var(--font-size-body-m);
- box-shadow: var(--shadow-xl);
- animation: toast-show 200ms ease-out;
- max-width: calc(100% - 40px);
-}
-
-@keyframes toast-show {
- from {
- opacity: 0;
- transform: translateX(-50%) translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateX(-50%) translateY(0);
- }
-}
-
-.toast.hide {
- animation: toast-hide 200ms ease-in forwards;
-}
-
-@keyframes toast-hide {
- to {
- opacity: 0;
- transform: translateX(-50%) translateY(20px);
- }
-}
-
-/* ============================================
- 12. Modal
- ============================================ */
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.6);
- z-index: var(--z-modal-backdrop);
- animation: fade-in 250ms ease-out;
-}
-
-@keyframes fade-in {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- z-index: var(--z-modal);
- background-color: var(--color-white);
- border-radius: var(--radius-lg);
- padding: var(--spacing-l);
- max-width: 400px;
- width: calc(100% - 40px);
- box-shadow: var(--shadow-xl);
- animation: modal-show 250ms ease-out;
-}
-
-@keyframes modal-show {
- from {
- opacity: 0;
- transform: translate(-50%, -50%) scale(0.95);
- }
- to {
- opacity: 1;
- transform: translate(-50%, -50%) scale(1);
- }
-}
-
-.modal__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: var(--spacing-m);
-}
-
-.modal__title {
- font-size: var(--font-size-h2);
- font-weight: var(--font-weight-bold);
-}
-
-.modal__close {
- width: 32px;
- height: 32px;
- display: flex;
- align-items: center;
- justify-content: center;
- border: none;
- background: none;
- cursor: pointer;
- color: var(--color-gray-700);
- border-radius: var(--radius-full);
- transition: background-color var(--transition-fast);
-}
-
-.modal__close:hover {
- background-color: var(--color-gray-100);
-}
-
-.modal__body {
- margin-bottom: var(--spacing-l);
- color: var(--color-gray-700);
-}
-
-.modal__footer {
- display: flex;
- gap: var(--spacing-s);
- justify-content: flex-end;
-}
-
-/* ============================================
- 13. Bottom Sheet
- ============================================ */
-.bottom-sheet-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.5);
- z-index: var(--z-modal-backdrop);
- animation: fade-in 300ms ease-out;
-}
-
-.bottom-sheet {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: var(--z-modal);
- background-color: var(--color-white);
- border-radius: var(--radius-xl) var(--radius-xl) 0 0;
- max-height: 80vh;
- overflow-y: auto;
- box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.15);
- animation: slide-up 300ms ease-out;
-}
-
-@keyframes slide-up {
- from {
- transform: translateY(100%);
- }
- to {
- transform: translateY(0);
- }
-}
-
-.bottom-sheet__handle {
- width: 40px;
- height: 4px;
- background-color: var(--color-gray-300);
- border-radius: 2px;
- margin: var(--spacing-m) auto;
-}
-
-.bottom-sheet__content {
- padding: 0 var(--spacing-l) var(--spacing-l);
-}
-
-/* ============================================
- 14. Utility Classes
- ============================================ */
-/* Display */
-.d-none { display: none !important; }
-.d-block { display: block !important; }
-.d-flex { display: flex !important; }
-.d-grid { display: grid !important; }
-
-/* Flex */
-.flex-column { flex-direction: column !important; }
-.flex-wrap { flex-wrap: wrap !important; }
-.justify-center { justify-content: center !important; }
-.justify-between { justify-content: space-between !important; }
-.align-center { align-items: center !important; }
-.gap-xs { gap: var(--spacing-xs) !important; }
-.gap-s { gap: var(--spacing-s) !important; }
-.gap-m { gap: var(--spacing-m) !important; }
-.gap-l { gap: var(--spacing-l) !important; }
-
-/* Spacing */
-.mt-s { margin-top: var(--spacing-s) !important; }
-.mt-m { margin-top: var(--spacing-m) !important; }
-.mt-l { margin-top: var(--spacing-l) !important; }
-.mb-s { margin-bottom: var(--spacing-s) !important; }
-.mb-m { margin-bottom: var(--spacing-m) !important; }
-.mb-l { margin-bottom: var(--spacing-l) !important; }
-.p-m { padding: var(--spacing-m) !important; }
-.p-l { padding: var(--spacing-l) !important; }
-
-/* Text */
-.text-center { text-align: center !important; }
-.text-right { text-align: right !important; }
-.text-primary { color: var(--color-primary-main) !important; }
-.text-secondary { color: var(--color-secondary-main) !important; }
-.text-success { color: var(--color-success) !important; }
-.text-error { color: var(--color-error) !important; }
-.text-muted { color: var(--color-gray-500) !important; }
-
-/* Background */
-.bg-white { background-color: var(--color-white) !important; }
-.bg-gray { background-color: var(--color-gray-100) !important; }
-.bg-primary { background-color: var(--color-primary-main) !important; }
-
-/* Border */
-.border { border: 1px solid var(--color-gray-300) !important; }
-.border-top { border-top: 1px solid var(--color-gray-300) !important; }
-.border-bottom { border-bottom: 1px solid var(--color-gray-300) !important; }
-
-/* Visibility */
-.hidden { visibility: hidden !important; }
-.sr-only {
- position: absolute !important;
- width: 1px !important;
- height: 1px !important;
- padding: 0 !important;
- margin: -1px !important;
- overflow: hidden !important;
- clip: rect(0, 0, 0, 0) !important;
- white-space: nowrap !important;
- border: 0 !important;
-}
-
-/* ============================================
- 15. Accessibility
- ============================================ */
-/* Focus Visible */
-*:focus-visible {
- outline: 2px solid var(--color-secondary-main);
- outline-offset: 2px;
-}
-
-/* Skip Link */
-.skip-link {
- position: absolute;
- top: -40px;
- left: 0;
- background-color: var(--color-primary-main);
- color: var(--color-white);
- padding: var(--spacing-s) var(--spacing-m);
- text-decoration: none;
- z-index: 9999;
-}
-
-.skip-link:focus {
- top: 0;
-}
-
-/* ============================================
- 16. Animations
- ============================================ */
-@media (prefers-reduced-motion: reduce) {
- *,
- *::before,
- *::after {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
-}
diff --git a/TEMP_BACKUP/prototype/backup/js/common.js b/TEMP_BACKUP/prototype/backup/js/common.js
deleted file mode 100644
index a3921ef..0000000
--- a/TEMP_BACKUP/prototype/backup/js/common.js
+++ /dev/null
@@ -1,555 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * 공통 JavaScript 유틸리티
- *
- * 작성일: 2025-01-20
- * 버전: 1.0
- */
-
-(function() {
- 'use strict';
-
- // ============================================
- // 1. 상태 관리
- // ============================================
- window.AppState = {
- // 사용자 정보
- user: null,
-
- // 매장 정보
- store: null,
-
- // 현재 이벤트 정보
- currentEvent: null,
-
- // localStorage에서 데이터 로드
- load() {
- try {
- this.user = JSON.parse(localStorage.getItem('kt_user') || 'null');
- this.store = JSON.parse(localStorage.getItem('kt_store') || 'null');
- this.currentEvent = JSON.parse(localStorage.getItem('kt_current_event') || 'null');
- } catch (e) {
- console.error('Failed to load app state:', e);
- }
- },
-
- // localStorage에 데이터 저장
- save() {
- try {
- localStorage.setItem('kt_user', JSON.stringify(this.user));
- localStorage.setItem('kt_store', JSON.stringify(this.store));
- localStorage.setItem('kt_current_event', JSON.stringify(this.currentEvent));
- } catch (e) {
- console.error('Failed to save app state:', e);
- }
- },
-
- // 상태 초기화
- clear() {
- this.user = null;
- this.store = null;
- this.currentEvent = null;
- localStorage.removeItem('kt_user');
- localStorage.removeItem('kt_store');
- localStorage.removeItem('kt_current_event');
- }
- };
-
- // 페이지 로드 시 상태 복원
- document.addEventListener('DOMContentLoaded', function() {
- window.AppState.load();
- });
-
- // ============================================
- // 2. Toast 알림
- // ============================================
- window.Toast = {
- show(message, duration = 3000) {
- // 기존 토스트 제거
- const existingToast = document.querySelector('.toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- // 새 토스트 생성
- const toast = document.createElement('div');
- toast.className = 'toast';
- toast.textContent = message;
- toast.setAttribute('role', 'status');
- toast.setAttribute('aria-live', 'polite');
-
- document.body.appendChild(toast);
-
- // 자동 제거
- setTimeout(() => {
- toast.classList.add('hide');
- setTimeout(() => {
- toast.remove();
- }, 200);
- }, duration);
- },
-
- success(message) {
- this.show('✓ ' + message);
- },
-
- error(message) {
- this.show('✕ ' + message);
- },
-
- info(message) {
- this.show('ℹ ' + message);
- }
- };
-
- // ============================================
- // 3. Modal 다이얼로그
- // ============================================
- window.Modal = {
- show(options) {
- const {
- title = '',
- body = '',
- confirmText = '확인',
- cancelText = '취소',
- onConfirm = () => {},
- onCancel = () => {},
- showCancel = true
- } = options;
-
- // 백드롭 생성
- const backdrop = document.createElement('div');
- backdrop.className = 'modal-backdrop';
-
- // 모달 생성
- const modal = document.createElement('div');
- modal.className = 'modal';
- modal.setAttribute('role', 'dialog');
- modal.setAttribute('aria-labelledby', 'modal-title');
- modal.setAttribute('aria-modal', 'true');
-
- modal.innerHTML = `
-
-
- ${body}
-
-
- `;
-
- // 닫기 함수
- const close = () => {
- backdrop.remove();
- modal.remove();
- document.body.style.overflow = '';
- };
-
- // 이벤트 리스너
- modal.querySelector('.modal__close').addEventListener('click', () => {
- close();
- onCancel();
- });
-
- if (showCancel) {
- modal.querySelector('.modal__cancel').addEventListener('click', () => {
- close();
- onCancel();
- });
- }
-
- modal.querySelector('.modal__confirm').addEventListener('click', () => {
- close();
- onConfirm();
- });
-
- backdrop.addEventListener('click', (e) => {
- if (e.target === backdrop) {
- close();
- onCancel();
- }
- });
-
- // 추가
- document.body.appendChild(backdrop);
- document.body.appendChild(modal);
- document.body.style.overflow = 'hidden';
-
- // 첫 번째 버튼에 포커스
- modal.querySelector('button').focus();
- },
-
- confirm(title, body, onConfirm) {
- this.show({
- title,
- body,
- confirmText: '확인',
- cancelText: '취소',
- onConfirm,
- showCancel: true
- });
- },
-
- alert(title, body, onConfirm = () => {}) {
- this.show({
- title,
- body,
- confirmText: '확인',
- onConfirm,
- showCancel: false
- });
- }
- };
-
- // ============================================
- // 4. Bottom Sheet
- // ============================================
- window.BottomSheet = {
- show(content, options = {}) {
- const {
- onClose = () => {}
- } = options;
-
- // 백드롭 생성
- const backdrop = document.createElement('div');
- backdrop.className = 'bottom-sheet-backdrop';
-
- // Bottom Sheet 생성
- const sheet = document.createElement('div');
- sheet.className = 'bottom-sheet';
- sheet.setAttribute('role', 'dialog');
- sheet.setAttribute('aria-modal', 'true');
-
- sheet.innerHTML = `
-
-
- ${content}
-
- `;
-
- // 닫기 함수
- const close = () => {
- backdrop.remove();
- sheet.remove();
- document.body.style.overflow = '';
- onClose();
- };
-
- // 이벤트 리스너
- backdrop.addEventListener('click', close);
-
- // Handle 드래그로 닫기 (간단한 구현)
- let startY = 0;
- const handle = sheet.querySelector('.bottom-sheet__handle');
-
- handle.addEventListener('touchstart', (e) => {
- startY = e.touches[0].clientY;
- });
-
- handle.addEventListener('touchend', (e) => {
- const endY = e.changedTouches[0].clientY;
- if (endY - startY > 50) { // 50px 이상 드래그하면 닫기
- close();
- }
- });
-
- // 추가
- document.body.appendChild(backdrop);
- document.body.appendChild(sheet);
- document.body.style.overflow = 'hidden';
-
- return { close };
- }
- };
-
- // ============================================
- // 5. 로딩 인디케이터
- // ============================================
- window.Loading = {
- show(message = '처리중...') {
- // 기존 로딩 제거
- this.hide();
-
- const overlay = document.createElement('div');
- overlay.className = 'loading-overlay';
- overlay.id = 'app-loading';
- overlay.innerHTML = `
-
- `;
-
- document.body.appendChild(overlay);
- document.body.style.overflow = 'hidden';
- },
-
- hide() {
- const overlay = document.getElementById('app-loading');
- if (overlay) {
- overlay.remove();
- document.body.style.overflow = '';
- }
- }
- };
-
- // ============================================
- // 6. 폼 검증 유틸리티
- // ============================================
- window.FormValidator = {
- // 이메일 검증
- isValidEmail(email) {
- const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- return re.test(email);
- },
-
- // 전화번호 검증 (010-XXXX-XXXX)
- isValidPhone(phone) {
- const re = /^010-\d{4}-\d{4}$/;
- return re.test(phone);
- },
-
- // 사업자번호 검증 (XXX-XX-XXXXX)
- isValidBusinessNumber(number) {
- const re = /^\d{3}-\d{2}-\d{5}$/;
- return re.test(number);
- },
-
- // 이름 검증 (2자 이상)
- isValidName(name) {
- return name && name.length >= 2;
- },
-
- // 필드에 에러 표시
- showError(inputElement, message) {
- inputElement.classList.add('error');
-
- // 기존 에러 메시지 제거
- const existingError = inputElement.parentElement.querySelector('.form-error');
- if (existingError) {
- existingError.remove();
- }
-
- // 새 에러 메시지 추가
- if (message) {
- const errorDiv = document.createElement('div');
- errorDiv.className = 'form-error';
- errorDiv.textContent = message;
- errorDiv.setAttribute('role', 'alert');
- inputElement.parentElement.appendChild(errorDiv);
- }
- },
-
- // 필드에서 에러 제거
- clearError(inputElement) {
- inputElement.classList.remove('error');
- const errorDiv = inputElement.parentElement.querySelector('.form-error');
- if (errorDiv) {
- errorDiv.remove();
- }
- },
-
- // 전체 폼 검증
- validateForm(formElement) {
- let isValid = true;
- const inputs = formElement.querySelectorAll('[required]');
-
- inputs.forEach(input => {
- if (!input.value.trim()) {
- this.showError(input, '필수 입력 항목입니다.');
- isValid = false;
- } else {
- this.clearError(input);
- }
- });
-
- return isValid;
- }
- };
-
- // ============================================
- // 7. 네비게이션 유틸리티
- // ============================================
- window.Navigation = {
- // 페이지 이동
- goto(page) {
- window.location.href = page;
- },
-
- // 뒤로가기
- back() {
- window.history.back();
- },
-
- // Bottom Navigation 활성화 상태 설정
- updateBottomNav(activePage) {
- const navItems = document.querySelectorAll('.bottom-nav__item');
- navItems.forEach(item => {
- if (item.getAttribute('data-page') === activePage) {
- item.classList.add('active');
- } else {
- item.classList.remove('active');
- }
- });
- }
- };
-
- // ============================================
- // 8. 유틸리티 함수
- // ============================================
- window.Utils = {
- // 숫자 포맷 (1000 -> 1,000)
- formatNumber(num) {
- return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
- },
-
- // 날짜 포맷 (YYYY-MM-DD)
- formatDate(date) {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
- },
-
- // 날짜 포맷 (YYYY.MM.DD)
- formatDateDot(date) {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
- return `${year}.${month}.${day}`;
- },
-
- // 랜덤 ID 생성
- generateId() {
- return 'id-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
- },
-
- // Debounce 함수
- debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
- },
-
- // AI 처리 시뮬레이션
- simulateAI(duration = 3000) {
- return new Promise(resolve => {
- setTimeout(resolve, duration);
- });
- },
-
- // 이미지 로드 체크
- preloadImage(src) {
- return new Promise((resolve, reject) => {
- const img = new Image();
- img.onload = () => resolve(img);
- img.onerror = reject;
- img.src = src;
- });
- }
- };
-
- // ============================================
- // 9. 공통 이벤트 핸들러
- // ============================================
-
- // 뒤로가기 버튼
- document.addEventListener('click', function(e) {
- if (e.target.closest('.app-bar__back')) {
- e.preventDefault();
- window.Navigation.back();
- }
- });
-
- // 입력 필드 실시간 검증
- document.addEventListener('input', function(e) {
- const input = e.target;
-
- // 이메일 필드
- if (input.type === 'email' && input.value) {
- if (!window.FormValidator.isValidEmail(input.value)) {
- window.FormValidator.showError(input, '올바른 이메일 형식을 입력하세요.');
- } else {
- window.FormValidator.clearError(input);
- }
- }
-
- // 전화번호 필드
- if (input.name === 'phone' && input.value) {
- // 자동 하이픈 추가
- let value = input.value.replace(/[^0-9]/g, '');
- if (value.length > 3 && value.length <= 7) {
- value = value.slice(0, 3) + '-' + value.slice(3);
- } else if (value.length > 7) {
- value = value.slice(0, 3) + '-' + value.slice(3, 7) + '-' + value.slice(7, 11);
- }
- input.value = value;
-
- // 검증
- if (value.length === 13) {
- if (!window.FormValidator.isValidPhone(value)) {
- window.FormValidator.showError(input, '올바른 전화번호 형식을 입력하세요.');
- } else {
- window.FormValidator.clearError(input);
- }
- }
- }
-
- // 사업자번호 필드 (name이 businessNumber인 경우도 처리)
- if ((input.name === 'business_number' || input.name === 'businessNumber') && input.value) {
- // 자동 하이픈 추가
- let value = input.value.replace(/[^0-9]/g, '');
- if (value.length > 3 && value.length <= 5) {
- value = value.slice(0, 3) + '-' + value.slice(3);
- } else if (value.length > 5) {
- value = value.slice(0, 3) + '-' + value.slice(3, 5) + '-' + value.slice(5, 10);
- }
- input.value = value;
-
- // 검증 (완전한 형식일 때만)
- if (value.length === 12) {
- if (!window.FormValidator.isValidBusinessNumber(value)) {
- window.FormValidator.showError(input, '올바른 사업자번호 형식을 입력하세요.');
- } else {
- window.FormValidator.clearError(input);
- }
- } else {
- // 입력 중일 때는 에러 제거
- window.FormValidator.clearError(input);
- }
- }
- });
-
- // Material Icons 로드 확인
- if (!document.querySelector('link[href*="material-icons"]')) {
- const link = document.createElement('link');
- link.href = 'https://fonts.googleapis.com/icon?family=Material+Icons';
- link.rel = 'stylesheet';
- document.head.appendChild(link);
- }
-
- // Pretendard 폰트 로드 확인
- if (!document.querySelector('link[href*="pretendard"]')) {
- const link = document.createElement('link');
- link.href = 'https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css';
- link.rel = 'stylesheet';
- document.head.appendChild(link);
- }
-
- console.log('KT Event Marketing App - Common JS loaded');
-
-})();
diff --git a/TEMP_BACKUP/prototype/backup/temp05-이벤트목적선택.html b/TEMP_BACKUP/prototype/backup/temp05-이벤트목적선택.html
deleted file mode 100644
index 44bf8ea..0000000
--- a/TEMP_BACKUP/prototype/backup/temp05-이벤트목적선택.html
+++ /dev/null
@@ -1,498 +0,0 @@
-
-
-
-
-
-
- 이벤트 목적 선택 - KT 이벤트 마케팅
-
-
-
-
-
-
-
-
-
-
- 본문으로 건너뛰기
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
이벤트 목적을 선택하세요
-
선택한 목적에 맞춰 AI가 최적의 이벤트를 기획합니다
-
-
-
-
-
-
-
-
-
👤
-
신규고객 유치
-
새로운 고객 확보
-
예상효과: +30%
-
- check_circle
-
-
-
-
-
-
-
-
-
🔄
-
재방문 유도
-
기존 고객 재방문
-
예상효과: +25%
-
- check_circle
-
-
-
-
-
-
-
-
-
💰
-
매출 증대
-
단기 매출 향상
-
예상효과: +40%
-
- check_circle
-
-
-
-
-
-
-
-
-
📢
-
인지도 향상
-
브랜드 인지도 제고
-
예상효과: +50%
-
- check_circle
-
-
-
-
-
-
-
- 다음 (AI분석)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/TEMP_BACKUP/prototype/css/common.css b/TEMP_BACKUP/prototype/css/common.css
deleted file mode 100644
index 8cd0d7b..0000000
--- a/TEMP_BACKUP/prototype/css/common.css
+++ /dev/null
@@ -1,478 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Common Styles (전역 스타일)
- *
- * 참조: design/uiux/style-guide.md
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Global Styles
- ======================================== */
-
-html {
- scroll-behavior: smooth;
-}
-
-body {
- font-family: var(--font-family);
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
- background-color: var(--color-white);
- overflow-x: hidden;
-}
-
-/* ========================================
- Typography
- ======================================== */
-
-/* Display */
-.display {
- font-size: var(--font-size-display);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-display);
- letter-spacing: var(--letter-spacing-display);
- color: var(--color-black);
-}
-
-/* H1 */
-h1, .h1 {
- font-size: var(--font-size-h1);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-h1);
- letter-spacing: var(--letter-spacing-h1);
- color: var(--color-black);
-}
-
-/* H2 */
-h2, .h2 {
- font-size: var(--font-size-h2);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-h2);
- letter-spacing: var(--letter-spacing-h2);
- color: var(--color-black);
-}
-
-/* H3 */
-h3, .h3 {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- letter-spacing: var(--letter-spacing-h3);
- color: var(--color-black);
-}
-
-/* Body Large */
-.body-large {
- font-size: var(--font-size-body-large);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-large);
- letter-spacing: var(--letter-spacing-body);
-}
-
-/* Body Medium (기본) */
-.body-medium {
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-medium);
- letter-spacing: var(--letter-spacing-body);
-}
-
-/* Body Small */
-.body-small {
- font-size: var(--font-size-body-small);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-small);
- letter-spacing: var(--letter-spacing-body);
-}
-
-/* Font Weights */
-.font-regular { font-weight: var(--font-weight-regular); }
-.font-medium { font-weight: var(--font-weight-medium); }
-.font-semibold { font-weight: var(--font-weight-semibold); }
-.font-bold { font-weight: var(--font-weight-bold); }
-
-/* ========================================
- Text Colors
- ======================================== */
-
-.text-primary { color: var(--color-primary); }
-.text-secondary { color: var(--color-secondary); }
-.text-black { color: var(--color-black); }
-.text-gray-700 { color: var(--color-gray-700); }
-.text-gray-500 { color: var(--color-gray-500); }
-.text-white { color: var(--color-white); }
-.text-success { color: var(--color-success); }
-.text-warning { color: var(--color-warning); }
-.text-error { color: var(--color-error); }
-.text-info { color: var(--color-info); }
-
-/* ========================================
- Background Colors
- ======================================== */
-
-.bg-white { background-color: var(--color-white); }
-.bg-gray-100 { background-color: var(--color-gray-100); }
-.bg-gray-300 { background-color: var(--color-gray-300); }
-.bg-primary { background-color: var(--color-primary); }
-.bg-secondary { background-color: var(--color-secondary); }
-.bg-success { background-color: var(--color-success); }
-.bg-warning { background-color: var(--color-warning); }
-.bg-error { background-color: var(--color-error); }
-.bg-info { background-color: var(--color-info); }
-
-/* Gradient Backgrounds */
-.bg-gradient-primary { background: var(--gradient-primary); }
-.bg-gradient-secondary { background: var(--gradient-secondary); }
-
-/* ========================================
- Links
- ======================================== */
-
-a {
- color: var(--color-primary);
- transition: color var(--transition-fast) var(--ease-out);
-}
-
-a:hover {
- color: var(--color-primary-light);
-}
-
-a:active {
- color: var(--color-primary-dark);
-}
-
-/* ========================================
- Focus States (접근성)
- ======================================== */
-
-*:focus-visible {
- outline: 2px solid var(--color-secondary);
- outline-offset: 2px;
- border-radius: var(--radius-s);
-}
-
-button:focus-visible,
-a:focus-visible {
- outline: 2px solid var(--color-secondary);
- outline-offset: 2px;
-}
-
-/* ========================================
- Disabled States
- ======================================== */
-
-.disabled,
-:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- pointer-events: none;
-}
-
-/* ========================================
- Loading State
- ======================================== */
-
-.loading {
- position: relative;
- pointer-events: none;
- opacity: 0.6;
-}
-
-.loading::after {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 20px;
- height: 20px;
- margin: -10px 0 0 -10px;
- border: 2px solid var(--color-gray-300);
- border-top-color: var(--color-primary);
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
-}
-
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-/* ========================================
- Animations
- ======================================== */
-
-/* Fade In */
-@keyframes fadeIn {
- from {
- opacity: 0;
- }
- to {
- opacity: 1;
- }
-}
-
-.fade-in {
- animation: fadeIn var(--transition-fast) var(--ease-out);
-}
-
-/* Slide Up */
-@keyframes slideUp {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.slide-up {
- animation: slideUp var(--transition-normal) var(--ease-out);
-}
-
-/* Slide Down */
-@keyframes slideDown {
- from {
- opacity: 0;
- transform: translateY(-20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.slide-down {
- animation: slideDown var(--transition-normal) var(--ease-out);
-}
-
-/* Scale In */
-@keyframes scaleIn {
- from {
- opacity: 0;
- transform: scale(0.95);
- }
- to {
- opacity: 1;
- transform: scale(1);
- }
-}
-
-.scale-in {
- animation: scaleIn var(--transition-fast) var(--ease-out);
-}
-
-/* ========================================
- Shadows
- ======================================== */
-
-.shadow-sm { box-shadow: var(--shadow-sm); }
-.shadow-md { box-shadow: var(--shadow-md); }
-.shadow-lg { box-shadow: var(--shadow-lg); }
-.shadow-xl { box-shadow: var(--shadow-xl); }
-.shadow-none { box-shadow: none; }
-
-/* ========================================
- Border Radius
- ======================================== */
-
-.rounded-xs { border-radius: var(--radius-xs); }
-.rounded-s { border-radius: var(--radius-s); }
-.rounded-m { border-radius: var(--radius-m); }
-.rounded-l { border-radius: var(--radius-l); }
-.rounded-xl { border-radius: var(--radius-xl); }
-.rounded-full { border-radius: var(--radius-pill); }
-.rounded-none { border-radius: 0; }
-
-/* ========================================
- Borders
- ======================================== */
-
-.border { border: 1px solid var(--color-gray-300); }
-.border-2 { border: 2px solid var(--color-gray-300); }
-.border-primary { border-color: var(--color-primary); }
-.border-secondary { border-color: var(--color-secondary); }
-.border-error { border-color: var(--color-error); }
-.border-none { border: none; }
-
-/* ========================================
- Opacity
- ======================================== */
-
-.opacity-0 { opacity: 0; }
-.opacity-50 { opacity: 0.5; }
-.opacity-100 { opacity: 1; }
-
-/* ========================================
- Cursor
- ======================================== */
-
-.cursor-pointer { cursor: pointer; }
-.cursor-not-allowed { cursor: not-allowed; }
-.cursor-default { cursor: default; }
-
-/* ========================================
- User Select
- ======================================== */
-
-.select-none { user-select: none; }
-.select-text { user-select: text; }
-
-/* ========================================
- Pointer Events
- ======================================== */
-
-.pointer-events-none { pointer-events: none; }
-.pointer-events-auto { pointer-events: auto; }
-
-/* ========================================
- Page Layout
- ======================================== */
-
-.page {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-.page-header {
- position: sticky;
- top: 0;
- z-index: var(--z-sticky);
- background-color: var(--color-white);
- border-bottom: 1px solid var(--color-gray-300);
-}
-
-.page-main {
- flex: 1;
- padding-bottom: calc(var(--bottom-nav-height) + var(--spacing-l));
-}
-
-.page-footer {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: var(--z-fixed);
-}
-
-/* ========================================
- Divider
- ======================================== */
-
-.divider {
- height: 1px;
- background-color: var(--color-gray-300);
- margin: var(--spacing-l) 0;
-}
-
-.divider-thick {
- height: 8px;
- background-color: var(--color-gray-100);
- margin: var(--spacing-l) 0;
-}
-
-/* ========================================
- Badge
- ======================================== */
-
-.badge {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- padding: var(--spacing-xs) var(--spacing-s);
- border-radius: var(--radius-pill);
- font-size: var(--font-size-body-small);
- font-weight: var(--font-weight-semibold);
- line-height: 1;
-}
-
-.badge-primary {
- background-color: var(--color-primary);
- color: var(--color-white);
-}
-
-.badge-secondary {
- background: var(--gradient-secondary);
- color: var(--color-white);
-}
-
-.badge-success {
- background-color: var(--color-success);
- color: var(--color-white);
-}
-
-.badge-warning {
- background-color: var(--color-warning);
- color: var(--color-white);
-}
-
-.badge-error {
- background-color: var(--color-error);
- color: var(--color-white);
-}
-
-.badge-gray {
- background-color: var(--color-gray-300);
- color: var(--color-gray-700);
-}
-
-/* ========================================
- Empty State
- ======================================== */
-
-.empty-state {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: var(--spacing-2xl) var(--spacing-l);
- text-align: center;
- color: var(--color-gray-500);
-}
-
-.empty-state__icon {
- width: 48px;
- height: 48px;
- margin-bottom: var(--spacing-m);
- color: var(--color-gray-300);
-}
-
-.empty-state__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- color: var(--color-gray-700);
- margin-bottom: var(--spacing-s);
-}
-
-.empty-state__description {
- font-size: var(--font-size-body-medium);
- color: var(--color-gray-500);
-}
-
-/* ========================================
- Utility: Truncate Text
- ======================================== */
-
-.truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.line-clamp-2 {
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.line-clamp-3 {
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
diff --git a/TEMP_BACKUP/prototype/css/components/buttons.css b/TEMP_BACKUP/prototype/css/components/buttons.css
deleted file mode 100644
index 3699931..0000000
--- a/TEMP_BACKUP/prototype/css/components/buttons.css
+++ /dev/null
@@ -1,247 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Button Components
- *
- * 참조: design/uiux/style-guide.md (Section 6.1)
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Button Base
- ======================================== */
-
-.btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: var(--spacing-s);
- border: none;
- border-radius: var(--radius-s);
- font-family: var(--font-family);
- font-weight: var(--font-weight-semibold);
- text-align: center;
- text-decoration: none;
- cursor: pointer;
- transition: all var(--transition-fast) var(--ease-out);
- user-select: none;
- white-space: nowrap;
-
- /* Touch Target */
- min-height: var(--touch-target-min);
-}
-
-.btn:focus-visible {
- outline: 2px solid var(--color-secondary);
- outline-offset: 2px;
-}
-
-/* ========================================
- Primary Button
- ======================================== */
-
-.btn-primary {
- background-color: var(--color-primary);
- color: var(--color-white);
- box-shadow: var(--shadow-primary);
-}
-
-.btn-primary:hover:not(:disabled) {
- background-color: var(--color-primary-light);
-}
-
-.btn-primary:active:not(:disabled) {
- background-color: var(--color-primary-dark);
-}
-
-.btn-primary:disabled {
- background-color: var(--color-gray-300);
- color: var(--color-gray-500);
- box-shadow: none;
- cursor: not-allowed;
-}
-
-/* ========================================
- Secondary Button
- ======================================== */
-
-.btn-secondary {
- background-color: var(--color-white);
- color: var(--color-primary);
- border: 2px solid var(--color-primary);
- box-shadow: none;
-}
-
-.btn-secondary:hover:not(:disabled) {
- background-color: var(--color-primary-50);
-}
-
-.btn-secondary:active:not(:disabled) {
- background-color: var(--color-primary-100);
-}
-
-.btn-secondary:disabled {
- background-color: var(--color-white);
- border-color: var(--border-medium);
- color: var(--color-gray-500);
- cursor: not-allowed;
-}
-
-/* ========================================
- Text Button
- ======================================== */
-
-.btn-text {
- background-color: transparent;
- color: var(--color-primary);
- box-shadow: none;
-}
-
-.btn-text:hover:not(:disabled) {
- background-color: var(--color-primary-50);
-}
-
-.btn-text:active:not(:disabled) {
- background-color: var(--color-primary-100);
-}
-
-.btn-text:disabled {
- background-color: transparent;
- color: var(--color-gray-500);
- cursor: not-allowed;
-}
-
-/* ========================================
- Button Sizes
- ======================================== */
-
-/* Large - 주요 CTA */
-.btn-large {
- height: var(--button-height-large);
- padding: 16px 24px;
- font-size: var(--font-size-button);
- line-height: var(--line-height-button);
-}
-
-/* Medium - 일반 액션 */
-.btn-medium {
- height: var(--button-height-medium);
- padding: 12px 20px;
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
-}
-
-/* Small - 보조 액션 */
-.btn-small {
- height: var(--button-height-small);
- padding: 8px 16px;
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
-}
-
-/* ========================================
- Button with Icon
- ======================================== */
-
-.btn-icon-left {
- flex-direction: row;
-}
-
-.btn-icon-right {
- flex-direction: row-reverse;
-}
-
-.btn .icon {
- width: 20px;
- height: 20px;
- flex-shrink: 0;
-}
-
-.btn-large .icon {
- width: 24px;
- height: 24px;
-}
-
-.btn-small .icon {
- width: 16px;
- height: 16px;
-}
-
-/* ========================================
- Full Width Button
- ======================================== */
-
-.btn-block {
- width: 100%;
- display: flex;
-}
-
-/* ========================================
- Loading State
- ======================================== */
-
-.btn-loading {
- position: relative;
- color: transparent;
- pointer-events: none;
-}
-
-.btn-loading::after {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 16px;
- height: 16px;
- margin: -8px 0 0 -8px;
- border: 2px solid currentColor;
- border-top-color: transparent;
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
- color: var(--color-white);
-}
-
-.btn-secondary.btn-loading::after,
-.btn-text.btn-loading::after {
- color: var(--color-primary);
-}
-
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-/* ========================================
- Button Group
- ======================================== */
-
-.btn-group {
- display: flex;
- gap: 12px; /* S + XS */
- flex-wrap: wrap;
-}
-
-.btn-group-vertical {
- flex-direction: column;
- align-items: stretch;
-}
-
-.btn-group-vertical .btn {
- width: 100%;
-}
-
-/* ========================================
- Icon-only Button
- ======================================== */
-
-.btn-icon-only {
- width: var(--button-height-medium);
- padding: 0;
- aspect-ratio: 1;
-}
-
-.btn-icon-only.btn-large {
- width: var(--button-height-large);
-}
-
-.btn-icon-only.btn-small {
- width: var(--button-height-small);
-}
diff --git a/TEMP_BACKUP/prototype/css/components/cards.css b/TEMP_BACKUP/prototype/css/components/cards.css
deleted file mode 100644
index b244da8..0000000
--- a/TEMP_BACKUP/prototype/css/components/cards.css
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Card Components
- *
- * 참조: design/uiux/style-guide.md (Section 6.2, 8.2)
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Card Base
- ======================================== */
-
-.card {
- background-color: var(--bg-primary);
- border: 1px solid var(--border-light);
- border-radius: var(--radius-m);
- box-shadow: var(--shadow-md);
- padding: var(--spacing-l);
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.card:hover {
- border-color: var(--color-primary);
- box-shadow: var(--shadow-lg);
-}
-
-.card-selected {
- border: 2px solid var(--color-primary);
- padding: calc(var(--spacing-l) - 1px); /* 테두리 2px 보정 */
-}
-
-/* ========================================
- Event Card
- ======================================== */
-
-.event-card {
- background-color: var(--bg-primary);
- border-radius: var(--radius-m);
- box-shadow: var(--shadow-md);
- overflow: hidden;
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.event-card:hover {
- box-shadow: var(--shadow-lg);
- transform: translateY(-2px);
-}
-
-.event-card__image {
- width: 100%;
- aspect-ratio: 16 / 9;
- object-fit: cover;
- display: block;
-}
-
-.event-card__content {
- padding: var(--spacing-l);
-}
-
-.event-card__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.event-card__meta {
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-gray-500);
- margin-bottom: var(--spacing-m);
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
-}
-
-.event-card__footer {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: var(--spacing-s);
- margin-top: var(--spacing-m);
-}
-
-/* ========================================
- Stat Card (지표 카드)
- ======================================== */
-
-.stat-card {
- background-color: var(--bg-primary);
- border-radius: var(--radius-l);
- box-shadow: var(--shadow-md);
- padding: var(--spacing-l);
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.stat-card:hover {
- box-shadow: var(--shadow-lg);
-}
-
-.stat-card__header {
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
- margin-bottom: var(--spacing-m);
-}
-
-.stat-card__icon {
- width: 24px;
- height: 24px;
- color: var(--color-primary);
-}
-
-.stat-card__label {
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-gray-700);
-}
-
-.stat-card__value {
- font-size: var(--font-size-display);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-display);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.stat-card__change {
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- display: flex;
- align-items: center;
- gap: var(--spacing-xs);
-}
-
-.stat-card__change--positive {
- color: var(--color-success);
-}
-
-.stat-card__change--negative {
- color: var(--color-error);
-}
-
-.stat-card__change--neutral {
- color: var(--color-gray-500);
-}
-
-/* Gradient variant */
-.stat-card--gradient {
- background: var(--gradient-primary);
- color: var(--color-white);
-}
-
-.stat-card--gradient .stat-card__label,
-.stat-card--gradient .stat-card__value,
-.stat-card--gradient .stat-card__change {
- color: var(--color-white);
-}
-
-.stat-card--gradient .stat-card__icon {
- color: var(--color-white);
-}
-
-/* ========================================
- AI Result Card (AI 생성 옵션 카드)
- ======================================== */
-
-.ai-card {
- position: relative;
- background-color: var(--bg-primary);
- border: 1px solid var(--border-light);
- border-radius: var(--radius-m);
- padding: var(--spacing-l);
- cursor: pointer;
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.ai-card:hover {
- border-color: var(--color-primary-light);
- box-shadow: var(--shadow-lg);
- transform: translateY(-2px);
-}
-
-.ai-card--selected {
- border: 2px solid var(--color-primary);
- background-color: var(--color-primary-50);
- padding: calc(var(--spacing-l) - 1px);
-}
-
-.ai-card__radio {
- position: absolute;
- top: var(--spacing-m);
- right: var(--spacing-m);
-}
-
-.ai-card__preview {
- width: 100%;
- aspect-ratio: 16 / 9;
- border-radius: var(--radius-s);
- object-fit: cover;
- margin-bottom: var(--spacing-m);
-}
-
-.ai-card__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.ai-card__description {
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-gray-500);
- margin-bottom: var(--spacing-m);
-}
-
-.ai-card__actions {
- display: flex;
- gap: var(--spacing-s);
-}
-
-/* AI 추천 배지 */
-.ai-badge {
- position: absolute;
- top: var(--spacing-m);
- left: var(--spacing-m);
- background: var(--gradient-secondary);
- color: var(--color-white);
- font-size: var(--font-size-body-small);
- font-weight: var(--font-weight-semibold);
- padding: 4px 12px;
- border-radius: var(--radius-pill);
- z-index: 1;
-}
-
-/* ========================================
- Card Grid
- ======================================== */
-
-.card-grid {
- display: grid;
- gap: var(--spacing-m);
- grid-template-columns: repeat(1, 1fr);
-}
-
-@media (min-width: 768px) {
- .card-grid {
- grid-template-columns: repeat(2, 1fr);
- }
-}
-
-@media (min-width: 1024px) {
- .card-grid {
- grid-template-columns: repeat(3, 1fr);
- }
-}
-
-/* ========================================
- Clickable Card
- ======================================== */
-
-.card-clickable {
- cursor: pointer;
- text-decoration: none;
- color: inherit;
-}
-
-.card-clickable:hover {
- text-decoration: none;
-}
-
-/* ========================================
- Card with Image
- ======================================== */
-
-.card-image {
- padding: 0;
- overflow: hidden;
-}
-
-.card-image__img {
- width: 100%;
- height: 200px;
- object-fit: cover;
-}
-
-.card-image__content {
- padding: var(--spacing-l);
-}
diff --git a/TEMP_BACKUP/prototype/css/components/inputs.css b/TEMP_BACKUP/prototype/css/components/inputs.css
deleted file mode 100644
index 0f8873f..0000000
--- a/TEMP_BACKUP/prototype/css/components/inputs.css
+++ /dev/null
@@ -1,339 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Input Components
- *
- * 참조: design/uiux/style-guide.md (Section 6.3, 6.4)
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Form Group
- ======================================== */
-
-.form-group {
- margin-bottom: var(--spacing-m);
-}
-
-.form-label {
- display: block;
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.form-label--required::after {
- content: '*';
- color: var(--color-error);
- margin-left: 4px;
-}
-
-.form-helper {
- display: block;
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-gray-500);
- margin-top: var(--spacing-xs);
-}
-
-.form-error {
- display: block;
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-error);
- margin-top: var(--spacing-xs);
-}
-
-/* ========================================
- Text Input
- ======================================== */
-
-.input {
- width: 100%;
- height: var(--input-height);
- padding: var(--spacing-m);
- border: 1px solid var(--border-medium);
- border-radius: var(--radius-s);
- background-color: var(--bg-primary);
- font-family: var(--font-family);
- font-size: var(--font-size-body-large);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-large);
- color: var(--color-black);
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.input::placeholder {
- color: var(--color-gray-500);
- font-style: italic;
-}
-
-.input:focus {
- outline: none;
- border: 2px solid var(--color-secondary);
- box-shadow: var(--shadow-secondary);
- padding: calc(var(--spacing-m) - 1px); /* 테두리 2px 보정 */
-}
-
-.input:disabled {
- background-color: var(--bg-tertiary);
- border-color: var(--border-light);
- color: var(--color-gray-500);
- cursor: not-allowed;
-}
-
-/* Error State */
-.input-error {
- border: 2px solid var(--color-error);
- box-shadow: var(--shadow-error);
- padding: calc(var(--spacing-m) - 1px);
-}
-
-.input-error:focus {
- border-color: var(--color-error);
- box-shadow: var(--shadow-error);
-}
-
-/* ========================================
- Textarea
- ======================================== */
-
-.textarea {
- width: 100%;
- min-height: var(--textarea-min-height);
- padding: var(--spacing-m);
- border: 1px solid var(--border-medium);
- border-radius: var(--radius-s);
- background-color: var(--bg-primary);
- font-family: var(--font-family);
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
- resize: vertical;
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.textarea::placeholder {
- color: var(--color-gray-500);
- font-style: italic;
-}
-
-.textarea:focus {
- outline: none;
- border: 2px solid var(--color-secondary);
- box-shadow: var(--shadow-secondary);
- padding: calc(var(--spacing-m) - 1px);
-}
-
-.textarea:disabled {
- background-color: var(--bg-tertiary);
- border-color: var(--border-light);
- color: var(--color-gray-500);
- cursor: not-allowed;
- resize: none;
-}
-
-/* ========================================
- Select
- ======================================== */
-
-.select {
- width: 100%;
- height: var(--input-height);
- padding: var(--spacing-m);
- padding-right: 40px;
- border: 1px solid var(--border-medium);
- border-radius: var(--radius-s);
- background-color: var(--bg-primary);
- background-image: url('data:image/svg+xml;charset=UTF-8, ');
- background-repeat: no-repeat;
- background-position: right 16px center;
- font-family: var(--font-family);
- font-size: var(--font-size-body-large);
- font-weight: var(--font-weight-regular);
- line-height: var(--line-height-body-large);
- color: var(--color-black);
- cursor: pointer;
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-.select:focus {
- outline: none;
- border: 2px solid var(--color-secondary);
- box-shadow: var(--shadow-secondary);
- padding: calc(var(--spacing-m) - 1px);
- padding-right: 39px;
-}
-
-.select:disabled {
- background-color: var(--bg-tertiary);
- border-color: var(--border-light);
- color: var(--color-gray-500);
- cursor: not-allowed;
-}
-
-/* ========================================
- Checkbox
- ======================================== */
-
-.checkbox-wrapper {
- display: inline-flex;
- align-items: center;
- gap: var(--spacing-s);
- cursor: pointer;
- user-select: none;
- min-height: var(--touch-target-min);
-}
-
-.checkbox {
- appearance: none;
- width: 24px;
- height: 24px;
- border: 2px solid var(--border-medium);
- border-radius: var(--radius-xs);
- background-color: var(--bg-primary);
- cursor: pointer;
- position: relative;
- transition: all var(--transition-fast) var(--ease-out);
- flex-shrink: 0;
-}
-
-.checkbox:checked {
- background-color: var(--color-primary);
- border-color: var(--color-primary);
-}
-
-.checkbox:checked::after {
- content: '';
- position: absolute;
- top: 2px;
- left: 6px;
- width: 6px;
- height: 12px;
- border: solid var(--color-white);
- border-width: 0 2px 2px 0;
- transform: rotate(45deg);
-}
-
-.checkbox:focus-visible {
- outline: 2px solid var(--color-secondary);
- outline-offset: 2px;
-}
-
-.checkbox:disabled {
- background-color: var(--bg-tertiary);
- border-color: var(--border-light);
- cursor: not-allowed;
-}
-
-.checkbox-label {
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
-}
-
-/* ========================================
- Radio Button
- ======================================== */
-
-.radio-wrapper {
- display: inline-flex;
- align-items: center;
- gap: var(--spacing-s);
- cursor: pointer;
- user-select: none;
- min-height: var(--touch-target-min);
-}
-
-.radio {
- appearance: none;
- width: 24px;
- height: 24px;
- border: 2px solid var(--border-medium);
- border-radius: 50%;
- background-color: var(--bg-primary);
- cursor: pointer;
- position: relative;
- transition: all var(--transition-fast) var(--ease-out);
- flex-shrink: 0;
-}
-
-.radio:checked {
- border-color: var(--color-primary);
-}
-
-.radio:checked::after {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 12px;
- height: 12px;
- background-color: var(--color-primary);
- border-radius: 50%;
- transform: translate(-50%, -50%);
-}
-
-.radio:focus-visible {
- outline: 2px solid var(--color-secondary);
- outline-offset: 2px;
-}
-
-.radio:disabled {
- background-color: var(--bg-tertiary);
- border-color: var(--border-light);
- cursor: not-allowed;
-}
-
-.radio-label {
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
-}
-
-/* ========================================
- Radio/Checkbox Group
- ======================================== */
-
-.radio-group,
-.checkbox-group {
- display: flex;
- flex-direction: column;
- gap: var(--spacing-m);
-}
-
-.radio-group--inline,
-.checkbox-group--inline {
- flex-direction: row;
- flex-wrap: wrap;
- gap: var(--spacing-l);
-}
-
-/* ========================================
- Input with Icon
- ======================================== */
-
-.input-icon-wrapper {
- position: relative;
-}
-
-.input-icon-wrapper .input {
- padding-left: 48px;
-}
-
-.input-icon {
- position: absolute;
- left: 16px;
- top: 50%;
- transform: translateY(-50%);
- width: 20px;
- height: 20px;
- color: var(--color-gray-500);
- pointer-events: none;
-}
-
-.input-icon-wrapper .input:focus ~ .input-icon {
- color: var(--color-secondary);
-}
diff --git a/TEMP_BACKUP/prototype/css/components/loaders.css b/TEMP_BACKUP/prototype/css/components/loaders.css
deleted file mode 100644
index 0e13ddb..0000000
--- a/TEMP_BACKUP/prototype/css/components/loaders.css
+++ /dev/null
@@ -1,321 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Loading Components
- *
- * 참조: design/uiux/style-guide.md (Section 8.1)
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Spinner (간단한 로딩)
- ======================================== */
-
-.spinner {
- display: inline-block;
- width: 32px;
- height: 32px;
- border: 3px solid var(--color-gray-300);
- border-top-color: var(--color-primary);
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
-}
-
-.spinner--small {
- width: 16px;
- height: 16px;
- border-width: 2px;
-}
-
-.spinner--large {
- width: 48px;
- height: 48px;
- border-width: 4px;
-}
-
-.spinner--secondary {
- border-top-color: var(--color-secondary);
-}
-
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-/* ========================================
- Loading Skeleton
- ======================================== */
-
-.skeleton {
- background-color: var(--color-gray-100);
- border-radius: var(--radius-s);
- position: relative;
- overflow: hidden;
-}
-
-.skeleton::after {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(
- 90deg,
- transparent,
- rgba(255, 255, 255, 0.5),
- transparent
- );
- animation: shimmer 1.5s infinite;
-}
-
-@keyframes shimmer {
- to { left: 100%; }
-}
-
-.skeleton-text {
- height: 16px;
- margin-bottom: var(--spacing-s);
-}
-
-.skeleton-text--title {
- height: 24px;
- width: 60%;
-}
-
-.skeleton-text--body {
- height: 14px;
- width: 100%;
-}
-
-.skeleton-text--body:last-child {
- width: 80%;
-}
-
-.skeleton-image {
- width: 100%;
- aspect-ratio: 16 / 9;
-}
-
-.skeleton-circle {
- width: 48px;
- height: 48px;
- border-radius: 50%;
-}
-
-.skeleton-button {
- height: 48px;
- width: 120px;
- border-radius: var(--radius-s);
-}
-
-/* ========================================
- AI Progress Indicator
- ======================================== */
-
-.ai-progress {
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: var(--spacing-2xl) var(--spacing-l);
- background-color: var(--color-white);
- border: 1px solid #E0E0E0;
- border-radius: var(--radius-m);
- text-align: center;
-}
-
-.ai-progress__icon {
- width: 48px;
- height: 48px;
- margin-bottom: var(--spacing-m);
- color: var(--color-secondary);
- animation: pulse 2s ease-in-out infinite;
-}
-
-@keyframes pulse {
- 0%, 100% { opacity: 1; transform: scale(1); }
- 50% { opacity: 0.6; transform: scale(0.95); }
-}
-
-.ai-progress__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
- margin-bottom: var(--spacing-m);
-}
-
-.ai-progress__bar {
- width: 100%;
- height: 8px;
- background-color: var(--color-gray-100);
- border-radius: var(--radius-xs);
- overflow: hidden;
- margin-bottom: var(--spacing-s);
-}
-
-.ai-progress__fill {
- height: 100%;
- background-color: var(--color-secondary);
- border-radius: var(--radius-xs);
- transition: width var(--transition-normal) var(--ease-out);
-}
-
-.ai-progress__percentage {
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-semibold);
- color: var(--color-black);
- margin-bottom: var(--spacing-s);
-}
-
-.ai-progress__time {
- font-size: var(--font-size-body-small);
- color: var(--color-gray-700);
-}
-
-/* ========================================
- Skeleton Card
- ======================================== */
-
-.skeleton-card {
- background-color: var(--color-white);
- border: 1px solid #E0E0E0;
- border-radius: var(--radius-m);
- padding: var(--spacing-l);
-}
-
-.skeleton-card__header {
- display: flex;
- align-items: center;
- gap: var(--spacing-m);
- margin-bottom: var(--spacing-m);
-}
-
-.skeleton-card__avatar {
- width: 48px;
- height: 48px;
- border-radius: 50%;
-}
-
-.skeleton-card__title {
- flex: 1;
-}
-
-.skeleton-card__image {
- width: 100%;
- aspect-ratio: 16 / 9;
- margin-bottom: var(--spacing-m);
-}
-
-.skeleton-card__content {
- display: flex;
- flex-direction: column;
- gap: var(--spacing-s);
-}
-
-.skeleton-card__footer {
- display: flex;
- gap: var(--spacing-s);
- margin-top: var(--spacing-m);
-}
-
-/* ========================================
- Loading Overlay
- ======================================== */
-
-.loading-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: var(--z-modal);
-}
-
-.loading-overlay__content {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--spacing-m);
- background-color: var(--color-white);
- padding: var(--spacing-2xl);
- border-radius: var(--radius-m);
- box-shadow: var(--shadow-xl);
-}
-
-.loading-overlay__text {
- font-size: var(--font-size-body-medium);
- color: var(--color-black);
- text-align: center;
-}
-
-/* ========================================
- Dots Loader
- ======================================== */
-
-.dots-loader {
- display: inline-flex;
- align-items: center;
- gap: var(--spacing-s);
-}
-
-.dots-loader__dot {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- background-color: var(--color-primary);
- animation: dotPulse 1.4s infinite ease-in-out;
-}
-
-.dots-loader__dot:nth-child(1) {
- animation-delay: -0.32s;
-}
-
-.dots-loader__dot:nth-child(2) {
- animation-delay: -0.16s;
-}
-
-@keyframes dotPulse {
- 0%, 80%, 100% {
- opacity: 0.3;
- transform: scale(0.8);
- }
- 40% {
- opacity: 1;
- transform: scale(1);
- }
-}
-
-/* ========================================
- Linear Progress
- ======================================== */
-
-.linear-progress {
- width: 100%;
- height: 4px;
- background-color: var(--color-gray-100);
- border-radius: var(--radius-xs);
- overflow: hidden;
-}
-
-.linear-progress__bar {
- height: 100%;
- background-color: var(--color-primary);
- transition: width var(--transition-normal) var(--ease-out);
-}
-
-.linear-progress--indeterminate .linear-progress__bar {
- width: 30%;
- animation: indeterminate 1.5s infinite;
-}
-
-@keyframes indeterminate {
- 0% {
- transform: translateX(-100%);
- }
- 100% {
- transform: translateX(400%);
- }
-}
diff --git a/TEMP_BACKUP/prototype/css/components/modals.css b/TEMP_BACKUP/prototype/css/components/modals.css
deleted file mode 100644
index 8bc7c25..0000000
--- a/TEMP_BACKUP/prototype/css/components/modals.css
+++ /dev/null
@@ -1,390 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Modal Components
- *
- * 참조: design/uiux/style-guide.md
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Modal Backdrop
- ======================================== */
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: var(--bg-overlay);
- z-index: var(--z-modal-backdrop);
- display: flex;
- align-items: center;
- justify-content: center;
- padding: var(--spacing-l);
- animation: fadeIn var(--transition-fast) var(--ease-out);
-}
-
-/* ========================================
- Modal
- ======================================== */
-
-.modal {
- background-color: var(--bg-primary);
- border-radius: var(--radius-m);
- box-shadow: var(--shadow-xl);
- max-width: 600px;
- width: 100%;
- max-height: 90vh;
- display: flex;
- flex-direction: column;
- z-index: var(--z-modal);
- animation: scaleIn var(--transition-fast) var(--ease-out);
-}
-
-.modal--small {
- max-width: 400px;
-}
-
-.modal--large {
- max-width: 800px;
-}
-
-.modal--fullscreen {
- max-width: 100%;
- max-height: 100%;
- height: 100%;
- border-radius: 0;
-}
-
-.modal__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: var(--spacing-l);
- border-bottom: 1px solid var(--border-light);
-}
-
-.modal__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
-}
-
-.modal__close {
- width: 24px;
- height: 24px;
- color: var(--color-gray-500);
- cursor: pointer;
- transition: color var(--transition-fast) var(--ease-out);
- flex-shrink: 0;
-}
-
-.modal__close:hover {
- color: var(--color-black);
-}
-
-.modal__body {
- flex: 1;
- padding: var(--spacing-l);
- overflow-y: auto;
-}
-
-.modal__footer {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: var(--spacing-m);
- padding: var(--spacing-l);
- border-top: 1px solid var(--border-light);
-}
-
-/* ========================================
- Bottom Sheet
- ======================================== */
-
-.bottom-sheet {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- background-color: var(--bg-primary);
- border-radius: var(--radius-l) var(--radius-l) 0 0;
- box-shadow: var(--shadow-lg);
- max-height: 90vh;
- display: flex;
- flex-direction: column;
- z-index: var(--z-modal);
- animation: slideUp var(--transition-normal) var(--ease-out);
-}
-
-.bottom-sheet__handle {
- width: 40px;
- height: 4px;
- background-color: var(--border-medium);
- border-radius: var(--radius-xs);
- margin: var(--spacing-m) auto;
- cursor: grab;
-}
-
-.bottom-sheet__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 var(--spacing-l) var(--spacing-l);
- border-bottom: 1px solid var(--border-light);
-}
-
-.bottom-sheet__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
-}
-
-.bottom-sheet__close {
- width: 24px;
- height: 24px;
- color: var(--color-gray-500);
- cursor: pointer;
- transition: color var(--transition-fast) var(--ease-out);
- flex-shrink: 0;
-}
-
-.bottom-sheet__close:hover {
- color: var(--color-black);
-}
-
-.bottom-sheet__body {
- flex: 1;
- padding: var(--spacing-l);
- overflow-y: auto;
-}
-
-.bottom-sheet__footer {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: var(--spacing-m);
- padding: var(--spacing-l);
- border-top: 1px solid var(--border-light);
-}
-
-/* ========================================
- Toast / Snackbar
- ======================================== */
-
-.toast {
- position: fixed;
- bottom: calc(var(--bottom-nav-height) + var(--spacing-l));
- left: 50%;
- transform: translateX(-50%);
- min-width: 280px;
- max-width: 90%;
- background-color: var(--color-black);
- color: var(--color-white);
- padding: var(--spacing-m) var(--spacing-l);
- border-radius: var(--radius-s);
- box-shadow: var(--shadow-lg);
- z-index: var(--z-toast);
- display: flex;
- align-items: center;
- gap: var(--spacing-m);
- animation: slideUp var(--transition-fast) var(--ease-out);
-}
-
-.toast--top {
- top: var(--spacing-l);
- bottom: auto;
- animation: slideDown var(--transition-fast) var(--ease-out);
-}
-
-.toast--success {
- background-color: var(--color-success);
-}
-
-.toast--warning {
- background-color: var(--color-warning);
-}
-
-.toast--error {
- background-color: var(--color-error);
-}
-
-.toast--info {
- background-color: var(--color-info);
-}
-
-.toast__icon {
- width: 20px;
- height: 20px;
- flex-shrink: 0;
-}
-
-.toast__message {
- flex: 1;
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
-}
-
-.toast__close {
- width: 20px;
- height: 20px;
- color: var(--color-white);
- cursor: pointer;
- opacity: 0.8;
- transition: opacity var(--transition-fast) var(--ease-out);
- flex-shrink: 0;
-}
-
-.toast__close:hover {
- opacity: 1;
-}
-
-/* ========================================
- Dialog (Confirm)
- ======================================== */
-
-.dialog {
- background-color: var(--bg-primary);
- border-radius: var(--radius-m);
- box-shadow: var(--shadow-xl);
- max-width: 400px;
- width: 100%;
- z-index: var(--z-modal);
- animation: scaleIn var(--transition-fast) var(--ease-out);
-}
-
-.dialog__header {
- padding: var(--spacing-l);
- border-bottom: 1px solid var(--border-light);
-}
-
-.dialog__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-semibold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
-}
-
-.dialog__body {
- padding: var(--spacing-l);
-}
-
-.dialog__message {
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-gray-700);
-}
-
-.dialog__footer {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: var(--spacing-m);
- padding: var(--spacing-l);
- border-top: 1px solid var(--border-light);
-}
-
-/* ========================================
- Tooltip
- ======================================== */
-
-.tooltip {
- position: absolute;
- background-color: var(--color-black);
- color: var(--color-white);
- padding: var(--spacing-s) var(--spacing-m);
- border-radius: var(--radius-xs);
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- white-space: nowrap;
- z-index: var(--z-tooltip);
- pointer-events: none;
- animation: fadeIn var(--transition-very-fast) var(--ease-out);
-}
-
-.tooltip::before {
- content: '';
- position: absolute;
- width: 0;
- height: 0;
- border-style: solid;
-}
-
-.tooltip--top {
- bottom: 100%;
- left: 50%;
- transform: translateX(-50%) translateY(-8px);
-}
-
-.tooltip--top::before {
- top: 100%;
- left: 50%;
- transform: translateX(-50%);
- border-width: 4px 4px 0;
- border-color: var(--color-black) transparent transparent;
-}
-
-.tooltip--bottom {
- top: 100%;
- left: 50%;
- transform: translateX(-50%) translateY(8px);
-}
-
-.tooltip--bottom::before {
- bottom: 100%;
- left: 50%;
- transform: translateX(-50%);
- border-width: 0 4px 4px;
- border-color: transparent transparent var(--color-black);
-}
-
-/* ========================================
- Dropdown
- ======================================== */
-
-.dropdown {
- position: relative;
- display: inline-block;
-}
-
-.dropdown__menu {
- position: absolute;
- top: 100%;
- left: 0;
- margin-top: var(--spacing-xs);
- background-color: var(--bg-primary);
- border: 1px solid var(--border-light);
- border-radius: var(--radius-s);
- box-shadow: var(--shadow-md);
- min-width: 200px;
- z-index: var(--z-dropdown);
- animation: fadeIn var(--transition-very-fast) var(--ease-out);
-}
-
-.dropdown__item {
- display: block;
- padding: var(--spacing-m) var(--spacing-l);
- font-size: var(--font-size-body-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-black);
- text-decoration: none;
- cursor: pointer;
- transition: background-color var(--transition-fast) var(--ease-out);
-}
-
-.dropdown__item:hover {
- background-color: var(--bg-tertiary);
-}
-
-.dropdown__item:active {
- background-color: var(--bg-secondary);
-}
-
-.dropdown__divider {
- height: 1px;
- background-color: var(--border-light);
- margin: var(--spacing-xs) 0;
-}
diff --git a/TEMP_BACKUP/prototype/css/components/navigation.css b/TEMP_BACKUP/prototype/css/components/navigation.css
deleted file mode 100644
index 4828602..0000000
--- a/TEMP_BACKUP/prototype/css/components/navigation.css
+++ /dev/null
@@ -1,308 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Navigation Components
- *
- * 참조: design/uiux/style-guide.md (Section 6.5)
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- App Bar (상단 네비게이션)
- ======================================== */
-
-.app-bar {
- position: sticky;
- top: 0;
- left: 0;
- right: 0;
- height: var(--app-bar-height);
- background-color: var(--bg-primary);
- border-bottom: 1px solid var(--border-light);
- box-shadow: var(--shadow-sm);
- z-index: var(--z-sticky);
-}
-
-.app-bar__container {
- display: flex;
- align-items: center;
- justify-content: space-between;
- height: 100%;
- padding: 0 var(--spacing-m);
- max-width: var(--container-desktop);
- margin: 0 auto;
-}
-
-.app-bar__left,
-.app-bar__right {
- display: flex;
- align-items: center;
- gap: var(--spacing-m);
-}
-
-.app-bar__title {
- font-size: var(--font-size-h3);
- font-weight: var(--font-weight-bold);
- line-height: var(--line-height-h3);
- color: var(--color-black);
-}
-
-.app-bar__back {
- width: 24px;
- height: 24px;
- color: var(--color-black);
- cursor: pointer;
- transition: color var(--transition-fast) var(--ease-out);
-}
-
-.app-bar__back:hover {
- color: var(--color-primary);
-}
-
-/* ========================================
- Bottom Navigation
- ======================================== */
-
-.bottom-nav {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- height: var(--bottom-nav-height);
- background-color: var(--bg-primary);
- box-shadow: var(--shadow-md);
- z-index: var(--z-fixed);
-}
-
-.bottom-nav__container {
- display: flex;
- align-items: center;
- justify-content: space-around;
- height: 100%;
- max-width: var(--container-desktop);
- margin: 0 auto;
-}
-
-.bottom-nav__item {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: var(--spacing-xs);
- flex: 1;
- height: 100%;
- min-width: var(--touch-target-min);
- text-decoration: none;
- color: var(--color-gray-500);
- cursor: pointer;
- transition: color var(--transition-fast) var(--ease-out);
- user-select: none;
-}
-
-.bottom-nav__item:hover {
- color: var(--color-primary);
-}
-
-.bottom-nav__item--active {
- color: var(--color-primary);
-}
-
-.bottom-nav__icon {
- width: 24px;
- height: 24px;
-}
-
-.bottom-nav__label {
- font-size: var(--font-size-body-small);
- line-height: 1;
- font-weight: var(--font-weight-regular);
-}
-
-.bottom-nav__item--active .bottom-nav__label {
- font-weight: var(--font-weight-semibold);
-}
-
-/* ========================================
- Tab Navigation
- ======================================== */
-
-.tab-nav {
- display: flex;
- gap: var(--spacing-s);
- border-bottom: 1px solid var(--border-light);
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
-}
-
-.tab-nav__item {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: var(--spacing-s);
- padding: var(--spacing-m) var(--spacing-l);
- min-height: var(--touch-target-min);
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-medium);
- line-height: var(--line-height-body-medium);
- color: var(--color-gray-500);
- text-decoration: none;
- white-space: nowrap;
- border-bottom: 2px solid transparent;
- cursor: pointer;
- transition: all var(--transition-fast) var(--ease-out);
- user-select: none;
-}
-
-.tab-nav__item:hover {
- color: var(--color-primary);
-}
-
-.tab-nav__item--active {
- color: var(--color-primary);
- border-bottom-color: var(--color-primary);
- font-weight: var(--font-weight-semibold);
-}
-
-/* ========================================
- Breadcrumb
- ======================================== */
-
-.breadcrumb {
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
- flex-wrap: wrap;
- padding: var(--spacing-m) 0;
-}
-
-.breadcrumb__item {
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- color: var(--color-gray-500);
-}
-
-.breadcrumb__link {
- color: var(--color-gray-500);
- text-decoration: none;
- transition: color var(--transition-fast) var(--ease-out);
-}
-
-.breadcrumb__link:hover {
- color: var(--color-primary);
-}
-
-.breadcrumb__separator {
- color: var(--color-gray-400);
-}
-
-.breadcrumb__item--active {
- color: var(--color-black);
- font-weight: var(--font-weight-medium);
-}
-
-/* ========================================
- Stepper (단계 표시)
- ======================================== */
-
-.stepper {
- display: flex;
- align-items: center;
- gap: var(--spacing-s);
-}
-
-.stepper__step {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--spacing-xs);
- flex: 1;
-}
-
-.stepper__circle {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 32px;
- height: 32px;
- border-radius: 50%;
- font-size: var(--font-size-body-small);
- font-weight: var(--font-weight-semibold);
- transition: all var(--transition-fast) var(--ease-out);
-}
-
-/* Completed */
-.stepper__step--completed .stepper__circle {
- background-color: var(--color-success);
- color: var(--color-white);
-}
-
-/* Active */
-.stepper__step--active .stepper__circle {
- background-color: var(--color-primary);
- color: var(--color-white);
-}
-
-/* Pending */
-.stepper__step--pending .stepper__circle {
- background-color: var(--bg-tertiary);
- border: 1px solid var(--border-medium);
- color: var(--color-gray-500);
-}
-
-.stepper__label {
- font-size: var(--font-size-body-small);
- line-height: var(--line-height-body-small);
- text-align: center;
- color: var(--color-gray-500);
-}
-
-.stepper__step--active .stepper__label,
-.stepper__step--completed .stepper__label {
- color: var(--color-black);
- font-weight: var(--font-weight-medium);
-}
-
-.stepper__line {
- flex: 1;
- height: 2px;
- background-color: var(--border-medium);
- margin: 0 var(--spacing-s);
-}
-
-.stepper__line--completed {
- background-color: var(--color-success);
-}
-
-/* ========================================
- Progress Bar
- ======================================== */
-
-.progress-bar {
- width: 100%;
- height: 48px;
- background-color: var(--bg-tertiary);
- border-radius: var(--radius-xl);
- overflow: hidden;
- position: relative;
-}
-
-.progress-bar__fill {
- height: 100%;
- background-color: var(--color-primary);
- transition: width var(--transition-normal) var(--ease-out);
- position: relative;
- overflow: hidden;
-}
-
-.progress-bar__text {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- font-size: var(--font-size-body-medium);
- font-weight: var(--font-weight-semibold);
- color: var(--color-black);
- z-index: 1;
-}
diff --git a/TEMP_BACKUP/prototype/css/layout.css b/TEMP_BACKUP/prototype/css/layout.css
deleted file mode 100644
index 7cc4054..0000000
--- a/TEMP_BACKUP/prototype/css/layout.css
+++ /dev/null
@@ -1,304 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Layout System (Grid, Container, Spacing)
- *
- * 참조: design/uiux/style-guide.md
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Container
- ======================================== */
-
-/* Mobile (320px ~ 767px) */
-.container {
- width: 100%;
- max-width: var(--container-mobile);
- margin-left: auto;
- margin-right: auto;
- padding-left: 20px;
- padding-right: 20px;
-}
-
-/* Tablet (768px ~ 1023px) */
-@media (min-width: 768px) {
- .container {
- max-width: var(--container-tablet);
- padding-left: 40px;
- padding-right: 40px;
- }
-}
-
-/* Desktop (1024px ~) */
-@media (min-width: 1024px) {
- .container {
- max-width: var(--container-desktop);
- padding-left: 0;
- padding-right: 0;
- }
-}
-
-/* ========================================
- Grid System
- ======================================== */
-
-/* Mobile Grid (4 Columns) */
-.grid {
- display: grid;
- gap: var(--gutter-mobile);
- grid-template-columns: repeat(4, 1fr);
-}
-
-/* Tablet Grid (8 Columns) */
-@media (min-width: 768px) {
- .grid {
- gap: var(--gutter-tablet);
- grid-template-columns: repeat(8, 1fr);
- }
-}
-
-/* Desktop Grid (12 Columns) */
-@media (min-width: 1024px) {
- .grid {
- gap: var(--gutter-desktop);
- grid-template-columns: repeat(12, 1fr);
- }
-}
-
-/* Grid Column Spans */
-.col-1 { grid-column: span 1; }
-.col-2 { grid-column: span 2; }
-.col-3 { grid-column: span 3; }
-.col-4 { grid-column: span 4; }
-
-@media (min-width: 768px) {
- .col-md-1 { grid-column: span 1; }
- .col-md-2 { grid-column: span 2; }
- .col-md-3 { grid-column: span 3; }
- .col-md-4 { grid-column: span 4; }
- .col-md-5 { grid-column: span 5; }
- .col-md-6 { grid-column: span 6; }
- .col-md-7 { grid-column: span 7; }
- .col-md-8 { grid-column: span 8; }
-}
-
-@media (min-width: 1024px) {
- .col-lg-1 { grid-column: span 1; }
- .col-lg-2 { grid-column: span 2; }
- .col-lg-3 { grid-column: span 3; }
- .col-lg-4 { grid-column: span 4; }
- .col-lg-5 { grid-column: span 5; }
- .col-lg-6 { grid-column: span 6; }
- .col-lg-7 { grid-column: span 7; }
- .col-lg-8 { grid-column: span 8; }
- .col-lg-9 { grid-column: span 9; }
- .col-lg-10 { grid-column: span 10; }
- .col-lg-11 { grid-column: span 11; }
- .col-lg-12 { grid-column: span 12; }
-}
-
-/* ========================================
- Flexbox Utilities
- ======================================== */
-
-.flex {
- display: flex;
-}
-
-.inline-flex {
- display: inline-flex;
-}
-
-/* Flex Direction */
-.flex-row { flex-direction: row; }
-.flex-row-reverse { flex-direction: row-reverse; }
-.flex-col { flex-direction: column; }
-.flex-col-reverse { flex-direction: column-reverse; }
-
-/* Flex Wrap */
-.flex-wrap { flex-wrap: wrap; }
-.flex-nowrap { flex-wrap: nowrap; }
-
-/* Justify Content */
-.justify-start { justify-content: flex-start; }
-.justify-end { justify-content: flex-end; }
-.justify-center { justify-content: center; }
-.justify-between { justify-content: space-between; }
-.justify-around { justify-content: space-around; }
-.justify-evenly { justify-content: space-evenly; }
-
-/* Align Items */
-.items-start { align-items: flex-start; }
-.items-end { align-items: flex-end; }
-.items-center { align-items: center; }
-.items-baseline { align-items: baseline; }
-.items-stretch { align-items: stretch; }
-
-/* Align Self */
-.self-start { align-self: flex-start; }
-.self-end { align-self: flex-end; }
-.self-center { align-self: center; }
-.self-stretch { align-self: stretch; }
-
-/* Gap */
-.gap-xs { gap: var(--spacing-xs); }
-.gap-s { gap: var(--spacing-s); }
-.gap-m { gap: var(--spacing-m); }
-.gap-l { gap: var(--spacing-l); }
-.gap-xl { gap: var(--spacing-xl); }
-.gap-2xl { gap: var(--spacing-2xl); }
-
-/* ========================================
- Spacing Utilities (Margin & Padding)
- ======================================== */
-
-/* Margin */
-.m-0 { margin: 0; }
-.m-xs { margin: var(--spacing-xs); }
-.m-s { margin: var(--spacing-s); }
-.m-m { margin: var(--spacing-m); }
-.m-l { margin: var(--spacing-l); }
-.m-xl { margin: var(--spacing-xl); }
-.m-2xl { margin: var(--spacing-2xl); }
-
-/* Margin Top */
-.mt-0 { margin-top: 0; }
-.mt-xs { margin-top: var(--spacing-xs); }
-.mt-s { margin-top: var(--spacing-s); }
-.mt-m { margin-top: var(--spacing-m); }
-.mt-l { margin-top: var(--spacing-l); }
-.mt-xl { margin-top: var(--spacing-xl); }
-.mt-2xl { margin-top: var(--spacing-2xl); }
-
-/* Margin Bottom */
-.mb-0 { margin-bottom: 0; }
-.mb-xs { margin-bottom: var(--spacing-xs); }
-.mb-s { margin-bottom: var(--spacing-s); }
-.mb-m { margin-bottom: var(--spacing-m); }
-.mb-l { margin-bottom: var(--spacing-l); }
-.mb-xl { margin-bottom: var(--spacing-xl); }
-.mb-2xl { margin-bottom: var(--spacing-2xl); }
-
-/* Margin Left */
-.ml-0 { margin-left: 0; }
-.ml-xs { margin-left: var(--spacing-xs); }
-.ml-s { margin-left: var(--spacing-s); }
-.ml-m { margin-left: var(--spacing-m); }
-.ml-l { margin-left: var(--spacing-l); }
-.ml-xl { margin-left: var(--spacing-xl); }
-
-/* Margin Right */
-.mr-0 { margin-right: 0; }
-.mr-xs { margin-right: var(--spacing-xs); }
-.mr-s { margin-right: var(--spacing-s); }
-.mr-m { margin-right: var(--spacing-m); }
-.mr-l { margin-right: var(--spacing-l); }
-.mr-xl { margin-right: var(--spacing-xl); }
-
-/* Margin Auto */
-.mx-auto {
- margin-left: auto;
- margin-right: auto;
-}
-
-/* Padding */
-.p-0 { padding: 0; }
-.p-xs { padding: var(--spacing-xs); }
-.p-s { padding: var(--spacing-s); }
-.p-m { padding: var(--spacing-m); }
-.p-l { padding: var(--spacing-l); }
-.p-xl { padding: var(--spacing-xl); }
-.p-2xl { padding: var(--spacing-2xl); }
-
-/* Padding Top */
-.pt-0 { padding-top: 0; }
-.pt-xs { padding-top: var(--spacing-xs); }
-.pt-s { padding-top: var(--spacing-s); }
-.pt-m { padding-top: var(--spacing-m); }
-.pt-l { padding-top: var(--spacing-l); }
-.pt-xl { padding-top: var(--spacing-xl); }
-.pt-2xl { padding-top: var(--spacing-2xl); }
-
-/* Padding Bottom */
-.pb-0 { padding-bottom: 0; }
-.pb-xs { padding-bottom: var(--spacing-xs); }
-.pb-s { padding-bottom: var(--spacing-s); }
-.pb-m { padding-bottom: var(--spacing-m); }
-.pb-l { padding-bottom: var(--spacing-l); }
-.pb-xl { padding-bottom: var(--spacing-xl); }
-.pb-2xl { padding-bottom: var(--spacing-2xl); }
-
-/* Padding Left */
-.pl-0 { padding-left: 0; }
-.pl-xs { padding-left: var(--spacing-xs); }
-.pl-s { padding-left: var(--spacing-s); }
-.pl-m { padding-left: var(--spacing-m); }
-.pl-l { padding-left: var(--spacing-l); }
-.pl-xl { padding-left: var(--spacing-xl); }
-
-/* Padding Right */
-.pr-0 { padding-right: 0; }
-.pr-xs { padding-right: var(--spacing-xs); }
-.pr-s { padding-right: var(--spacing-s); }
-.pr-m { padding-right: var(--spacing-m); }
-.pr-l { padding-right: var(--spacing-l); }
-.pr-xl { padding-right: var(--spacing-xl); }
-
-/* ========================================
- Display Utilities
- ======================================== */
-
-.block { display: block; }
-.inline-block { display: inline-block; }
-.inline { display: inline; }
-.hidden { display: none; }
-
-/* Responsive Display */
-@media (max-width: 767px) {
- .hidden-mobile { display: none; }
-}
-
-@media (min-width: 768px) and (max-width: 1023px) {
- .hidden-tablet { display: none; }
-}
-
-@media (min-width: 1024px) {
- .hidden-desktop { display: none; }
-}
-
-/* ========================================
- Position Utilities
- ======================================== */
-
-.relative { position: relative; }
-.absolute { position: absolute; }
-.fixed { position: fixed; }
-.sticky { position: sticky; }
-
-/* ========================================
- Text Align
- ======================================== */
-
-.text-left { text-align: left; }
-.text-center { text-align: center; }
-.text-right { text-align: right; }
-
-/* ========================================
- Width & Height
- ======================================== */
-
-.w-full { width: 100%; }
-.h-full { height: 100%; }
-
-.w-screen { width: 100vw; }
-.h-screen { height: 100vh; }
-
-/* ========================================
- Overflow
- ======================================== */
-
-.overflow-auto { overflow: auto; }
-.overflow-hidden { overflow: hidden; }
-.overflow-scroll { overflow: scroll; }
-.overflow-x-auto { overflow-x: auto; }
-.overflow-y-auto { overflow-y: auto; }
diff --git a/TEMP_BACKUP/prototype/css/navigation.css b/TEMP_BACKUP/prototype/css/navigation.css
deleted file mode 100644
index 05b28fd..0000000
--- a/TEMP_BACKUP/prototype/css/navigation.css
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ========================================
- Navigation Bar (App Bar)
- ======================================== */
-
-.app-bar {
- background: var(--color-white, #FFFFFF);
- padding: 16px;
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
- position: sticky;
- top: 0;
- z-index: 1020;
-}
-
-.app-bar__container {
- display: flex;
- align-items: center;
- justify-content: space-between;
- max-width: 1200px;
- margin: 0 auto;
-}
-
-.app-bar__left,
-.app-bar__right {
- width: 32px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.app-bar__title {
- font-size: 18px;
- font-weight: 600;
- color: var(--color-text-primary, #212121);
- flex: 1;
- text-align: center;
-}
-
-.app-bar__back {
- cursor: pointer;
- color: var(--color-text-primary, #212121);
-}
-
-.app-bar__back:hover {
- opacity: 0.7;
-}
diff --git a/TEMP_BACKUP/prototype/css/reset.css b/TEMP_BACKUP/prototype/css/reset.css
deleted file mode 100644
index 6df1f7c..0000000
--- a/TEMP_BACKUP/prototype/css/reset.css
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * CSS Reset
- *
- * Modern CSS Reset + Box-sizing Fix
- * 작성일: 2025-01-20
- */
-
-/* ========================================
- Box Sizing
- ======================================== */
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-/* ========================================
- Remove Default Margins & Paddings
- ======================================== */
-* {
- margin: 0;
- padding: 0;
-}
-
-/* ========================================
- HTML & Body
- ======================================== */
-html {
- font-size: 16px;
- -webkit-text-size-adjust: 100%;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-body {
- min-height: 100vh;
- line-height: 1.5;
- text-rendering: optimizeSpeed;
-}
-
-/* ========================================
- Typography Defaults
- ======================================== */
-h1, h2, h3, h4, h5, h6 {
- font-weight: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-p, h1, h2, h3, h4, h5, h6 {
- overflow-wrap: break-word;
-}
-
-/* ========================================
- Lists
- ======================================== */
-ul, ol {
- list-style: none;
-}
-
-/* ========================================
- Links
- ======================================== */
-a {
- text-decoration: none;
- color: inherit;
-}
-
-a:hover,
-a:focus {
- text-decoration: none;
-}
-
-/* ========================================
- Images & Media
- ======================================== */
-img,
-picture,
-video,
-canvas,
-svg {
- display: block;
- max-width: 100%;
- height: auto;
-}
-
-/* ========================================
- Forms
- ======================================== */
-input,
-button,
-textarea,
-select {
- font: inherit;
- color: inherit;
-}
-
-button {
- border: none;
- background: none;
- cursor: pointer;
-}
-
-input:focus,
-textarea:focus,
-select:focus {
- outline: none;
-}
-
-/* Remove default input styles */
-input[type="text"],
-input[type="email"],
-input[type="password"],
-input[type="tel"],
-input[type="number"],
-input[type="search"],
-textarea,
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-
-/* Remove spinner from number inputs */
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-
-input[type="number"] {
- -moz-appearance: textfield;
-}
-
-/* Remove search cancel button */
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-
-/* ========================================
- Tables
- ======================================== */
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-/* ========================================
- Accessibility
- ======================================== */
-
-/* Remove all animations for users who prefer reduced motion */
-@media (prefers-reduced-motion: reduce) {
- *,
- *::before,
- *::after {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- scroll-behavior: auto !important;
- }
-}
-
-/* Screen reader only content */
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border-width: 0;
-}
-
-/* ========================================
- Scrollbar (Webkit)
- ======================================== */
-::-webkit-scrollbar {
- width: 8px;
- height: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: #F5F5F5;
-}
-
-::-webkit-scrollbar-thumb {
- background: #D9D9D9;
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: #9E9E9E;
-}
-
-/* ========================================
- Selection
- ======================================== */
-::selection {
- background-color: rgba(227, 30, 36, 0.2);
- color: #1A1A1A;
-}
-
-::-moz-selection {
- background-color: rgba(227, 30, 36, 0.2);
- color: #1A1A1A;
-}
diff --git a/TEMP_BACKUP/prototype/css/variables.css b/TEMP_BACKUP/prototype/css/variables.css
deleted file mode 100644
index e572cce..0000000
--- a/TEMP_BACKUP/prototype/css/variables.css
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * CSS Variables (Design System)
- *
- * 참조: design/uiux/style-guide.md
- * 작성일: 2025-01-20
- */
-
-:root {
- /* ========================================
- Primary Colors (KT Red)
- ======================================== */
- --color-primary: #E31E24;
- --color-primary-light: #FF5A5F;
- --color-primary-dark: #C01015;
- --color-primary-50: #FFF5F5;
- --color-primary-100: #FFE5E6;
- --color-primary-200: #FFCCCE;
-
- /* ========================================
- Secondary Colors (Accent)
- ======================================== */
- --color-secondary: #FF6B6B;
- --color-secondary-light: #FF8787;
- --color-secondary-dark: #FF5252;
- --color-secondary-50: #FFF5F5;
- --color-secondary-100: #FFE3E3;
- --color-secondary-200: #FFC9C9;
-
- /* ========================================
- Grayscale
- ======================================== */
- --color-black: #1A1A1A; /* Gray-900 */
- --color-gray-800: #333333;
- --color-gray-700: #4A4A4A;
- --color-gray-600: #6B6B6B;
- --color-gray-500: #9E9E9E;
- --color-gray-400: #BDBDBD;
- --color-gray-300: #D9D9D9;
- --color-gray-200: #EEEEEE;
- --color-gray-100: #F5F5F5;
- --color-gray-50: #FAFAFA;
- --color-white: #FFFFFF;
-
- /* ========================================
- Semantic Colors
- ======================================== */
- --color-success: #00C853;
- --color-success-light: #5EFC82;
- --color-success-dark: #00A344;
- --color-success-bg: #E8F5E9;
-
- --color-warning: #FFA000;
- --color-warning-light: #FFB333;
- --color-warning-dark: #CC8000;
- --color-warning-bg: #FFF8E1;
-
- --color-error: #E31E24;
- --color-error-light: #FF5A5F;
- --color-error-dark: #C01015;
- --color-error-bg: #FFEBEE;
-
- --color-info: #FF9800;
- --color-info-light: #FFB74D;
- --color-info-dark: #F57C00;
- --color-info-bg: #FFF3E0;
-
- /* ========================================
- Gradient
- ======================================== */
- --gradient-primary: linear-gradient(135deg, #E31E24 0%, #FF5A5F 100%);
- --gradient-secondary: linear-gradient(135deg, #FF6B6B 0%, #FF8787 100%);
- --gradient-success: linear-gradient(135deg, #00C853 0%, #5EFC82 100%);
- --gradient-warning: linear-gradient(135deg, #FFA000 0%, #FFB333 100%);
-
- /* ========================================
- Background Colors
- ======================================== */
- --bg-primary: #FFFFFF;
- --bg-secondary: #FAFAFA;
- --bg-tertiary: #F5F5F5;
- --bg-overlay: rgba(0, 0, 0, 0.5);
-
- /* ========================================
- Border Colors
- ======================================== */
- --border-light: #EEEEEE;
- --border-medium: #D9D9D9;
- --border-dark: #BDBDBD;
-
- /* ========================================
- Typography - Font Family
- ======================================== */
- --font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', system-ui, sans-serif;
-
- /* ========================================
- Typography - Font Sizes (Mobile First)
- ======================================== */
- --font-size-display: 28px; /* Display (메인 타이틀) */
- --font-size-h1: 24px; /* H1 (화면 제목) */
- --font-size-h2: 20px; /* H2 (섹션 제목) */
- --font-size-h3: 18px; /* H3 (카드 제목) */
- --font-size-body-large: 16px; /* Body-Large (큰 본문) */
- --font-size-body-medium: 14px; /* Body-Medium (기본 본문) */
- --font-size-body-small: 12px; /* Body-Small (작은 본문) */
- --font-size-button: 16px; /* Button (버튼 레이블) */
-
- /* ========================================
- Typography - Line Heights
- ======================================== */
- --line-height-display: 1.3; /* 36px */
- --line-height-h1: 1.3; /* 31px */
- --line-height-h2: 1.4; /* 28px */
- --line-height-h3: 1.4; /* 25px */
- --line-height-body-large: 1.5; /* 24px */
- --line-height-body-medium: 1.5; /* 21px */
- --line-height-body-small: 1.5; /* 18px */
- --line-height-button: 1.5; /* 24px */
-
- /* ========================================
- Typography - Font Weights
- ======================================== */
- --font-weight-regular: 400;
- --font-weight-medium: 500;
- --font-weight-semibold: 600;
- --font-weight-bold: 700;
-
- /* ========================================
- Typography - Letter Spacing
- ======================================== */
- --letter-spacing-display: -0.5px;
- --letter-spacing-h1: -0.3px;
- --letter-spacing-h2: -0.2px;
- --letter-spacing-h3: 0px;
- --letter-spacing-body: 0px;
-
- /* ========================================
- Spacing (4px Grid System)
- ======================================== */
- --spacing-xs: 4px; /* Extra Small */
- --spacing-s: 8px; /* Small */
- --spacing-m: 16px; /* Medium */
- --spacing-l: 24px; /* Large */
- --spacing-xl: 32px; /* Extra Large */
- --spacing-2xl: 48px; /* 2X Large */
-
- /* ========================================
- Border Radius
- ======================================== */
- --radius-xs: 4px;
- --radius-s: 8px;
- --radius-m: 12px;
- --radius-l: 16px;
- --radius-xl: 24px;
- --radius-pill: 9999px; /* Pill 형태 */
-
- /* ========================================
- Shadows
- ======================================== */
- --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);
- --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.08);
- --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.12);
- --shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.2);
- --shadow-primary: 0 2px 4px rgba(227, 30, 36, 0.2);
- --shadow-secondary: 0 0 0 4px rgba(255, 107, 107, 0.15);
- --shadow-error: 0 0 0 4px rgba(227, 30, 36, 0.15);
-
- /* ========================================
- Z-Index Scale
- ======================================== */
- --z-base: 0;
- --z-dropdown: 100;
- --z-sticky: 200;
- --z-fixed: 300;
- --z-modal-backdrop: 400;
- --z-modal: 500;
- --z-toast: 600;
- --z-tooltip: 700;
-
- /* ========================================
- Transitions
- ======================================== */
- --transition-instant: 0ms;
- --transition-very-fast: 100ms;
- --transition-fast: 200ms;
- --transition-normal: 300ms;
- --transition-slow: 500ms;
-
- /* ========================================
- Easing
- ======================================== */
- --ease-out: cubic-bezier(0, 0, 0.2, 1);
- --ease-in: cubic-bezier(0.4, 0, 1, 1);
- --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
- --ease-linear: linear;
-
- /* ========================================
- Layout - Breakpoints
- ======================================== */
- --breakpoint-mobile: 320px;
- --breakpoint-tablet: 768px;
- --breakpoint-desktop: 1024px;
-
- /* ========================================
- Layout - Container
- ======================================== */
- --container-mobile: calc(100% - 40px); /* 양쪽 20px 마진 */
- --container-tablet: calc(100% - 80px); /* 양쪽 40px 마진 */
- --container-desktop: 1200px; /* 최대 너비 */
-
- /* ========================================
- Layout - Gutters
- ======================================== */
- --gutter-mobile: 16px;
- --gutter-tablet: 24px;
- --gutter-desktop: 32px;
-
- /* ========================================
- Component - Button Heights
- ======================================== */
- --button-height-large: 48px;
- --button-height-medium: 44px;
- --button-height-small: 36px;
-
- /* ========================================
- Component - Input Heights
- ======================================== */
- --input-height: 48px;
- --textarea-min-height: 120px;
-
- /* ========================================
- Component - Touch Target
- ======================================== */
- --touch-target-min: 44px; /* WCAG 2.1 AA */
- --touch-target-recommended: 48px;
-
- /* ========================================
- Component - Bottom Navigation
- ======================================== */
- --bottom-nav-height: 60px;
-
- /* ========================================
- Component - App Bar
- ======================================== */
- --app-bar-height: 56px;
-}
-
-/* ========================================
- Responsive Typography (Tablet)
- ======================================== */
-@media (min-width: 768px) {
- :root {
- --font-size-display: 32px; /* +4px */
- --font-size-h1: 28px; /* +4px */
- --font-size-h2: 22px; /* +2px */
- --font-size-h3: 20px; /* +2px */
- --font-size-body-large: 18px; /* +2px */
- --font-size-body-medium: 16px; /* +2px */
- --font-size-body-small: 14px; /* +2px */
- }
-}
-
-/* ========================================
- Responsive Typography (Desktop)
- ======================================== */
-@media (min-width: 1024px) {
- :root {
- --font-size-display: 36px; /* +8px */
- --font-size-h1: 32px; /* +8px */
- --font-size-h2: 24px; /* +4px */
- --font-size-h3: 20px; /* +2px */
- }
-}
diff --git a/TEMP_BACKUP/prototype/js/common.js b/TEMP_BACKUP/prototype/js/common.js
deleted file mode 100644
index 76fd884..0000000
--- a/TEMP_BACKUP/prototype/js/common.js
+++ /dev/null
@@ -1,375 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Common JavaScript Utilities
- *
- * 작성일: 2025-01-20
- */
-
-// ========================================
-// DOM 유틸리티
-// ========================================
-
-const $ = (selector, context = document) => context.querySelector(selector);
-const $$ = (selector, context = document) => Array.from(context.querySelectorAll(selector));
-
-const createElement = (tag, className = '', attributes = {}) => {
- const element = document.createElement(tag);
- if (className) element.className = className;
- Object.entries(attributes).forEach(([key, value]) => {
- element.setAttribute(key, value);
- });
- return element;
-};
-
-const addClass = (element, ...classes) => {
- if (!element) return;
- element.classList.add(...classes);
-};
-
-const removeClass = (element, ...classes) => {
- if (!element) return;
- element.classList.remove(...classes);
-};
-
-const toggleClass = (element, className, force) => {
- if (!element) return;
- return element.classList.toggle(className, force);
-};
-
-const hasClass = (element, className) => {
- if (!element) return false;
- return element.classList.contains(className);
-};
-
-// ========================================
-// 이벤트 유틸리티
-// ========================================
-
-const on = (element, event, handler, options = {}) => {
- if (!element) return;
- element.addEventListener(event, handler, options);
-};
-
-const off = (element, event, handler, options = {}) => {
- if (!element) return;
- element.removeEventListener(event, handler, options);
-};
-
-const delegate = (parent, eventType, selector, handler) => {
- on(parent, eventType, (event) => {
- const target = event.target.closest(selector);
- if (target && parent.contains(target)) {
- handler.call(target, event);
- }
- });
-};
-
-const once = (element, event, handler) => {
- on(element, event, handler, { once: true });
-};
-
-// ========================================
-// 애니메이션 유틸리티
-// ========================================
-
-const fadeIn = (element, duration = 200) => {
- if (!element) return Promise.resolve();
-
- element.style.opacity = '0';
- element.style.display = 'block';
-
- return new Promise((resolve) => {
- requestAnimationFrame(() => {
- element.style.transition = `opacity ${duration}ms ease-out`;
- element.style.opacity = '1';
-
- setTimeout(() => {
- element.style.transition = '';
- resolve();
- }, duration);
- });
- });
-};
-
-const fadeOut = (element, duration = 200) => {
- if (!element) return Promise.resolve();
-
- element.style.transition = `opacity ${duration}ms ease-out`;
- element.style.opacity = '0';
-
- return new Promise((resolve) => {
- setTimeout(() => {
- element.style.display = 'none';
- element.style.transition = '';
- resolve();
- }, duration);
- });
-};
-
-const slideUp = (element, duration = 300) => {
- if (!element) return Promise.resolve();
-
- element.style.overflow = 'hidden';
- element.style.transition = `height ${duration}ms ease-out, opacity ${duration}ms ease-out`;
- element.style.height = element.offsetHeight + 'px';
-
- return new Promise((resolve) => {
- requestAnimationFrame(() => {
- element.style.height = '0';
- element.style.opacity = '0';
-
- setTimeout(() => {
- element.style.display = 'none';
- element.style.overflow = '';
- element.style.transition = '';
- element.style.height = '';
- element.style.opacity = '';
- resolve();
- }, duration);
- });
- });
-};
-
-const slideDown = (element, duration = 300) => {
- if (!element) return Promise.resolve();
-
- element.style.display = 'block';
- element.style.overflow = 'hidden';
- element.style.height = '0';
- element.style.opacity = '0';
-
- const height = element.scrollHeight;
-
- return new Promise((resolve) => {
- requestAnimationFrame(() => {
- element.style.transition = `height ${duration}ms ease-out, opacity ${duration}ms ease-out`;
- element.style.height = height + 'px';
- element.style.opacity = '1';
-
- setTimeout(() => {
- element.style.overflow = '';
- element.style.transition = '';
- element.style.height = '';
- element.style.opacity = '';
- resolve();
- }, duration);
- });
- });
-};
-
-// ========================================
-// 데이터 유틸리티
-// ========================================
-
-const debounce = (func, wait = 300) => {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func.apply(this, args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-};
-
-const throttle = (func, limit = 300) => {
- let inThrottle;
- return function executedFunction(...args) {
- if (!inThrottle) {
- func.apply(this, args);
- inThrottle = true;
- setTimeout(() => (inThrottle = false), limit);
- }
- };
-};
-
-const formatNumber = (num) => {
- if (num >= 1000000) {
- return (num / 1000000).toFixed(1) + 'M';
- }
- if (num >= 1000) {
- return (num / 1000).toFixed(1) + 'K';
- }
- return num.toString();
-};
-
-const formatDate = (date) => {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
- return `${year}.${month}.${day}`;
-};
-
-const formatDateTime = (date) => {
- const d = new Date(date);
- const hours = String(d.getHours()).padStart(2, '0');
- const minutes = String(d.getMinutes()).padStart(2, '0');
- return `${formatDate(date)} ${hours}:${minutes}`;
-};
-
-const getRelativeTime = (date) => {
- const now = new Date();
- const target = new Date(date);
- const diff = Math.floor((now - target) / 1000);
-
- if (diff < 60) return '방금 전';
- if (diff < 3600) return `${Math.floor(diff / 60)}분 전`;
- if (diff < 86400) return `${Math.floor(diff / 3600)}시간 전`;
- if (diff < 604800) return `${Math.floor(diff / 86400)}일 전`;
-
- return formatDate(date);
-};
-
-// ========================================
-// 로컬 스토리지 유틸리티
-// ========================================
-
-const storage = {
- set: (key, value) => {
- try {
- localStorage.setItem(key, JSON.stringify(value));
- return true;
- } catch (error) {
- console.error('Storage set error:', error);
- return false;
- }
- },
-
- get: (key, defaultValue = null) => {
- try {
- const item = localStorage.getItem(key);
- return item ? JSON.parse(item) : defaultValue;
- } catch (error) {
- console.error('Storage get error:', error);
- return defaultValue;
- }
- },
-
- remove: (key) => {
- try {
- localStorage.removeItem(key);
- return true;
- } catch (error) {
- console.error('Storage remove error:', error);
- return false;
- }
- },
-
- clear: () => {
- try {
- localStorage.clear();
- return true;
- } catch (error) {
- console.error('Storage clear error:', error);
- return false;
- }
- }
-};
-
-// ========================================
-// URL 유틸리티
-// ========================================
-
-const navigate = (url) => {
- window.location.href = url;
-};
-
-const getQueryParam = (name) => {
- const params = new URLSearchParams(window.location.search);
- return params.get(name);
-};
-
-const setQueryParam = (name, value) => {
- const url = new URL(window.location);
- url.searchParams.set(name, value);
- window.history.pushState({}, '', url);
-};
-
-// ========================================
-// 유효성 검사 유틸리티
-// ========================================
-
-const validators = {
- email: (value) => {
- const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- return re.test(value);
- },
-
- phone: (value) => {
- const re = /^01[0-9]-?[0-9]{3,4}-?[0-9]{4}$/;
- return re.test(value.replace(/[^0-9]/g, ''));
- },
-
- required: (value) => {
- return value !== null && value !== undefined && value.trim() !== '';
- },
-
- minLength: (value, length) => {
- return value.length >= length;
- },
-
- maxLength: (value, length) => {
- return value.length <= length;
- },
-
- number: (value) => {
- return !isNaN(value) && !isNaN(parseFloat(value));
- },
-
- url: (value) => {
- try {
- new URL(value);
- return true;
- } catch {
- return false;
- }
- }
-};
-
-// ========================================
-// 전역 공개
-// ========================================
-
-window.KTEvent = {
- // DOM
- $,
- $$,
- createElement,
- addClass,
- removeClass,
- toggleClass,
- hasClass,
-
- // Events
- on,
- off,
- delegate,
- once,
-
- // Animation
- fadeIn,
- fadeOut,
- slideUp,
- slideDown,
-
- // Data
- debounce,
- throttle,
- formatNumber,
- formatDate,
- formatDateTime,
- getRelativeTime,
-
- // Storage
- storage,
-
- // URL
- navigate,
- getQueryParam,
- setQueryParam,
-
- // Validation
- validators
-};
diff --git a/TEMP_BACKUP/prototype/js/form.js b/TEMP_BACKUP/prototype/js/form.js
deleted file mode 100644
index 5ef4094..0000000
--- a/TEMP_BACKUP/prototype/js/form.js
+++ /dev/null
@@ -1,315 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Form Validation JavaScript
- *
- * 작성일: 2025-01-20
- */
-
-(function() {
- 'use strict';
-
- const { $, $$, on, addClass, removeClass, validators, createElement } = window.KTEvent;
-
- // ========================================
- // Form Validator
- // ========================================
-
- class FormValidator {
- constructor(form, options = {}) {
- if (!form) return;
-
- this.form = form;
- this.options = {
- validateOnBlur: true,
- validateOnInput: false,
- scrollToError: true,
- ...options
- };
-
- this.fields = new Map();
- this.errors = new Map();
-
- this.init();
- }
-
- init() {
- this.bindEvents();
- }
-
- addField(name, rules) {
- this.fields.set(name, rules);
- return this;
- }
-
- bindEvents() {
- // Form submit
- on(this.form, 'submit', (e) => {
- e.preventDefault();
- if (this.validate()) {
- this.onSubmit();
- }
- });
-
- // Field validation
- this.fields.forEach((rules, name) => {
- const field = this.form.elements[name];
- if (!field) return;
-
- if (this.options.validateOnBlur) {
- on(field, 'blur', () => {
- this.validateField(name);
- });
- }
-
- if (this.options.validateOnInput) {
- on(field, 'input', () => {
- if (this.errors.has(name)) {
- this.validateField(name);
- }
- });
- }
- });
- }
-
- validateField(name) {
- const field = this.form.elements[name];
- const rules = this.fields.get(name);
-
- if (!field || !rules) return true;
-
- const value = field.value.trim();
- let isValid = true;
- let errorMessage = '';
-
- // Required
- if (rules.required && !validators.required(value)) {
- isValid = false;
- errorMessage = rules.messages?.required || '필수 입력 항목입니다.';
- }
-
- // Email
- if (isValid && rules.email && value && !validators.email(value)) {
- isValid = false;
- errorMessage = rules.messages?.email || '올바른 이메일 형식이 아닙니다.';
- }
-
- // Phone
- if (isValid && rules.phone && value && !validators.phone(value)) {
- isValid = false;
- errorMessage = rules.messages?.phone || '올바른 전화번호 형식이 아닙니다.';
- }
-
- // Min Length
- if (isValid && rules.minLength && value && !validators.minLength(value, rules.minLength)) {
- isValid = false;
- errorMessage = rules.messages?.minLength || `최소 ${rules.minLength}자 이상 입력해주세요.`;
- }
-
- // Max Length
- if (isValid && rules.maxLength && value && !validators.maxLength(value, rules.maxLength)) {
- isValid = false;
- errorMessage = rules.messages?.maxLength || `최대 ${rules.maxLength}자까지 입력 가능합니다.`;
- }
-
- // Number
- if (isValid && rules.number && value && !validators.number(value)) {
- isValid = false;
- errorMessage = rules.messages?.number || '숫자만 입력 가능합니다.';
- }
-
- // URL
- if (isValid && rules.url && value && !validators.url(value)) {
- isValid = false;
- errorMessage = rules.messages?.url || '올바른 URL 형식이 아닙니다.';
- }
-
- // Custom validator
- if (isValid && rules.custom && !rules.custom(value, field)) {
- isValid = false;
- errorMessage = rules.messages?.custom || '유효하지 않은 값입니다.';
- }
-
- // Update UI
- if (isValid) {
- this.clearError(name);
- } else {
- this.setError(name, errorMessage);
- }
-
- return isValid;
- }
-
- validate() {
- let isValid = true;
- let firstErrorField = null;
-
- this.fields.forEach((rules, name) => {
- if (!this.validateField(name)) {
- isValid = false;
- if (!firstErrorField) {
- firstErrorField = this.form.elements[name];
- }
- }
- });
-
- // Scroll to first error
- if (!isValid && firstErrorField && this.options.scrollToError) {
- firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' });
- firstErrorField.focus();
- }
-
- return isValid;
- }
-
- setError(name, message) {
- const field = this.form.elements[name];
- if (!field) return;
-
- this.errors.set(name, message);
-
- const formGroup = field.closest('.form-group');
- if (!formGroup) return;
-
- addClass(field, 'input-error');
-
- let errorElement = $('.form-error', formGroup);
- if (!errorElement) {
- errorElement = createElement('span', 'form-error');
- formGroup.appendChild(errorElement);
- }
-
- errorElement.textContent = message;
- }
-
- clearError(name) {
- const field = this.form.elements[name];
- if (!field) return;
-
- this.errors.delete(name);
-
- const formGroup = field.closest('.form-group');
- if (!formGroup) return;
-
- removeClass(field, 'input-error');
-
- const errorElement = $('.form-error', formGroup);
- if (errorElement) {
- errorElement.remove();
- }
- }
-
- clearAllErrors() {
- this.errors.clear();
-
- $$('.input-error', this.form).forEach(field => {
- removeClass(field, 'input-error');
- });
-
- $$('.form-error', this.form).forEach(error => {
- error.remove();
- });
- }
-
- getValues() {
- const values = {};
-
- this.fields.forEach((rules, name) => {
- const field = this.form.elements[name];
- if (field) {
- if (field.type === 'checkbox') {
- values[name] = field.checked;
- } else if (field.type === 'radio') {
- const checked = this.form.querySelector(`input[name="${name}"]:checked`);
- values[name] = checked ? checked.value : null;
- } else {
- values[name] = field.value.trim();
- }
- }
- });
-
- return values;
- }
-
- reset() {
- this.form.reset();
- this.clearAllErrors();
- }
-
- onSubmit() {
- // Override this method
- console.log('Form submitted:', this.getValues());
- }
- }
-
- // ========================================
- // Character Counter
- // ========================================
-
- class CharacterCounter {
- constructor(textarea, maxLength) {
- this.textarea = textarea;
- this.maxLength = maxLength;
- this.counter = null;
-
- this.init();
- }
-
- init() {
- const formGroup = this.textarea.closest('.form-group');
- if (!formGroup) return;
-
- this.counter = createElement('span', 'form-helper');
- this.counter.style.textAlign = 'right';
- formGroup.appendChild(this.counter);
-
- this.updateCounter();
-
- on(this.textarea, 'input', () => {
- this.updateCounter();
- });
- }
-
- updateCounter() {
- const length = this.textarea.value.length;
- this.counter.textContent = `${length} / ${this.maxLength}`;
-
- if (length > this.maxLength) {
- this.counter.style.color = 'var(--color-error)';
- } else {
- this.counter.style.color = 'var(--color-gray-500)';
- }
- }
- }
-
- // ========================================
- // Auto Initialize
- // ========================================
-
- function initForms() {
- // Character counters
- $$('textarea[maxlength]').forEach(textarea => {
- const maxLength = parseInt(textarea.getAttribute('maxlength'));
- if (maxLength > 0) {
- new CharacterCounter(textarea, maxLength);
- }
- });
- }
-
- // Initialize on DOMContentLoaded
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', initForms);
- } else {
- initForms();
- }
-
- // ========================================
- // Export
- // ========================================
-
- window.KTEvent = window.KTEvent || {};
- Object.assign(window.KTEvent, {
- FormValidator,
- CharacterCounter
- });
-
-})();
diff --git a/TEMP_BACKUP/prototype/js/modal.js b/TEMP_BACKUP/prototype/js/modal.js
deleted file mode 100644
index 04a6eaf..0000000
--- a/TEMP_BACKUP/prototype/js/modal.js
+++ /dev/null
@@ -1,418 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Modal JavaScript
- *
- * 작성일: 2025-01-20
- */
-
-(function() {
- 'use strict';
-
- const { $, createElement, addClass, removeClass, on, fadeIn, fadeOut } = window.KTEvent;
-
- // ========================================
- // Modal
- // ========================================
-
- class Modal {
- constructor(options = {}) {
- this.options = {
- title: '',
- content: '',
- size: 'medium', // small, medium, large, fullscreen
- showClose: true,
- footer: null,
- onOpen: null,
- onClose: null,
- ...options
- };
-
- this.backdrop = null;
- this.modal = null;
- this.isOpen = false;
-
- this.create();
- }
-
- create() {
- // Create backdrop
- this.backdrop = createElement('div', 'modal-backdrop');
-
- // Create modal
- this.modal = createElement('div', `modal modal--${this.options.size}`);
-
- // Header
- if (this.options.title || this.options.showClose) {
- const header = createElement('div', 'modal__header');
-
- if (this.options.title) {
- const title = createElement('h3', 'modal__title');
- title.textContent = this.options.title;
- header.appendChild(title);
- }
-
- if (this.options.showClose) {
- const closeBtn = createElement('button', 'modal__close');
- closeBtn.innerHTML = '×';
- closeBtn.setAttribute('aria-label', '닫기');
- on(closeBtn, 'click', () => this.close());
- header.appendChild(closeBtn);
- }
-
- this.modal.appendChild(header);
- }
-
- // Body
- const body = createElement('div', 'modal__body');
- if (typeof this.options.content === 'string') {
- body.innerHTML = this.options.content;
- } else if (this.options.content instanceof HTMLElement) {
- body.appendChild(this.options.content);
- }
- this.modal.appendChild(body);
-
- // Footer
- if (this.options.footer) {
- const footer = createElement('div', 'modal__footer');
- footer.innerHTML = this.options.footer;
- this.modal.appendChild(footer);
- }
-
- this.backdrop.appendChild(this.modal);
-
- // Close on backdrop click
- on(this.backdrop, 'click', (e) => {
- if (e.target === this.backdrop) {
- this.close();
- }
- });
-
- // Close on ESC key
- this.handleEscKey = (e) => {
- if (e.key === 'Escape' && this.isOpen) {
- this.close();
- }
- };
- }
-
- open() {
- if (this.isOpen) return;
-
- document.body.appendChild(this.backdrop);
- document.body.style.overflow = 'hidden';
-
- // Animation
- requestAnimationFrame(() => {
- fadeIn(this.backdrop, 200);
- });
-
- this.isOpen = true;
-
- on(document, 'keydown', this.handleEscKey);
-
- if (this.options.onOpen) {
- this.options.onOpen(this);
- }
- }
-
- close() {
- if (!this.isOpen) return;
-
- fadeOut(this.backdrop, 200).then(() => {
- if (this.backdrop.parentNode) {
- document.body.removeChild(this.backdrop);
- }
- document.body.style.overflow = '';
- });
-
- this.isOpen = false;
-
- document.removeEventListener('keydown', this.handleEscKey);
-
- if (this.options.onClose) {
- this.options.onClose(this);
- }
- }
-
- destroy() {
- this.close();
- this.backdrop = null;
- this.modal = null;
- }
- }
-
- // ========================================
- // Bottom Sheet
- // ========================================
-
- class BottomSheet {
- constructor(options = {}) {
- this.options = {
- title: '',
- content: '',
- showClose: true,
- footer: null,
- onOpen: null,
- onClose: null,
- ...options
- };
-
- this.backdrop = null;
- this.sheet = null;
- this.isOpen = false;
-
- this.create();
- }
-
- create() {
- // Create backdrop
- this.backdrop = createElement('div', 'modal-backdrop');
-
- // Create bottom sheet
- this.sheet = createElement('div', 'bottom-sheet');
-
- // Handle
- const handle = createElement('div', 'bottom-sheet__handle');
- this.sheet.appendChild(handle);
-
- // Header
- if (this.options.title || this.options.showClose) {
- const header = createElement('div', 'bottom-sheet__header');
-
- if (this.options.title) {
- const title = createElement('h3', 'bottom-sheet__title');
- title.textContent = this.options.title;
- header.appendChild(title);
- }
-
- if (this.options.showClose) {
- const closeBtn = createElement('button', 'bottom-sheet__close');
- closeBtn.innerHTML = '×';
- closeBtn.setAttribute('aria-label', '닫기');
- on(closeBtn, 'click', () => this.close());
- header.appendChild(closeBtn);
- }
-
- this.sheet.appendChild(header);
- }
-
- // Body
- const body = createElement('div', 'bottom-sheet__body');
- if (typeof this.options.content === 'string') {
- body.innerHTML = this.options.content;
- } else if (this.options.content instanceof HTMLElement) {
- body.appendChild(this.options.content);
- }
- this.sheet.appendChild(body);
-
- // Footer
- if (this.options.footer) {
- const footer = createElement('div', 'bottom-sheet__footer');
- footer.innerHTML = this.options.footer;
- this.sheet.appendChild(footer);
- }
-
- this.backdrop.appendChild(this.sheet);
-
- // Close on backdrop click
- on(this.backdrop, 'click', (e) => {
- if (e.target === this.backdrop) {
- this.close();
- }
- });
- }
-
- open() {
- if (this.isOpen) return;
-
- document.body.appendChild(this.backdrop);
- document.body.style.overflow = 'hidden';
-
- requestAnimationFrame(() => {
- fadeIn(this.backdrop, 200);
- });
-
- this.isOpen = true;
-
- if (this.options.onOpen) {
- this.options.onOpen(this);
- }
- }
-
- close() {
- if (!this.isOpen) return;
-
- fadeOut(this.backdrop, 200).then(() => {
- if (this.backdrop.parentNode) {
- document.body.removeChild(this.backdrop);
- }
- document.body.style.overflow = '';
- });
-
- this.isOpen = false;
-
- if (this.options.onClose) {
- this.options.onClose(this);
- }
- }
-
- destroy() {
- this.close();
- this.backdrop = null;
- this.sheet = null;
- }
- }
-
- // ========================================
- // Toast
- // ========================================
-
- class Toast {
- static show(message, options = {}) {
- const defaults = {
- type: 'default', // default, success, warning, error, info
- duration: 3000,
- position: 'bottom', // top, bottom
- icon: null
- };
-
- const config = { ...defaults, ...options };
-
- // Create toast
- const toast = createElement('div', `toast toast--${config.type} toast--${config.position}`);
-
- // Icon
- if (config.icon) {
- const icon = createElement('span', 'toast__icon');
- icon.innerHTML = config.icon;
- toast.appendChild(icon);
- }
-
- // Message
- const msg = createElement('span', 'toast__message');
- msg.textContent = message;
- toast.appendChild(msg);
-
- // Close button
- const closeBtn = createElement('button', 'toast__close');
- closeBtn.innerHTML = '×';
- closeBtn.setAttribute('aria-label', '닫기');
- toast.appendChild(closeBtn);
-
- // Add to DOM
- document.body.appendChild(toast);
-
- // Animation
- requestAnimationFrame(() => {
- fadeIn(toast, 200);
- });
-
- // Auto close
- const timeout = setTimeout(() => {
- close();
- }, config.duration);
-
- // Close function
- const close = () => {
- clearTimeout(timeout);
- fadeOut(toast, 200).then(() => {
- if (toast.parentNode) {
- document.body.removeChild(toast);
- }
- });
- };
-
- // Close on button click
- on(closeBtn, 'click', close);
-
- return { close };
- }
- }
-
- // ========================================
- // Dialog (Confirm)
- // ========================================
-
- class Dialog {
- static confirm(options = {}) {
- return new Promise((resolve) => {
- const config = {
- title: '확인',
- message: '',
- confirmText: '확인',
- cancelText: '취소',
- ...options
- };
-
- const backdrop = createElement('div', 'modal-backdrop');
- const dialog = createElement('div', 'dialog');
-
- // Header
- const header = createElement('div', 'dialog__header');
- const title = createElement('h3', 'dialog__title');
- title.textContent = config.title;
- header.appendChild(title);
- dialog.appendChild(header);
-
- // Body
- const body = createElement('div', 'dialog__body');
- const message = createElement('p', 'dialog__message');
- message.textContent = config.message;
- body.appendChild(message);
- dialog.appendChild(body);
-
- // Footer
- const footer = createElement('div', 'dialog__footer');
-
- const cancelBtn = createElement('button', 'btn btn-secondary btn-medium');
- cancelBtn.textContent = config.cancelText;
- on(cancelBtn, 'click', () => {
- close(false);
- });
- footer.appendChild(cancelBtn);
-
- const confirmBtn = createElement('button', 'btn btn-primary btn-medium');
- confirmBtn.textContent = config.confirmText;
- on(confirmBtn, 'click', () => {
- close(true);
- });
- footer.appendChild(confirmBtn);
-
- dialog.appendChild(footer);
- backdrop.appendChild(dialog);
-
- // Close function
- const close = (result) => {
- fadeOut(backdrop, 200).then(() => {
- if (backdrop.parentNode) {
- document.body.removeChild(backdrop);
- }
- document.body.style.overflow = '';
- resolve(result);
- });
- };
-
- // Add to DOM
- document.body.appendChild(backdrop);
- document.body.style.overflow = 'hidden';
-
- requestAnimationFrame(() => {
- fadeIn(backdrop, 200);
- });
- });
- }
- }
-
- // ========================================
- // Export
- // ========================================
-
- window.KTEvent = window.KTEvent || {};
- Object.assign(window.KTEvent, {
- Modal,
- BottomSheet,
- Toast,
- Dialog
- });
-
-})();
diff --git a/TEMP_BACKUP/prototype/js/navigation.js b/TEMP_BACKUP/prototype/js/navigation.js
deleted file mode 100644
index bb8f55a..0000000
--- a/TEMP_BACKUP/prototype/js/navigation.js
+++ /dev/null
@@ -1,296 +0,0 @@
-/**
- * KT AI 기반 소상공인 이벤트 자동 생성 서비스
- * Navigation JavaScript
- *
- * 작성일: 2025-01-20
- */
-
-(function() {
- 'use strict';
-
- const { $, $$, on, addClass, removeClass } = window.KTEvent;
-
- // ========================================
- // Bottom Navigation
- // ========================================
-
- class BottomNavigation {
- constructor(element) {
- if (!element) return;
-
- this.element = element;
- this.items = $$('.bottom-nav__item', element);
- this.currentPath = window.location.pathname;
-
- this.init();
- }
-
- init() {
- this.setActiveItem();
- this.bindEvents();
- }
-
- setActiveItem() {
- this.items.forEach(item => {
- const href = item.getAttribute('href');
- if (href && this.currentPath.includes(href.replace('.html', ''))) {
- addClass(item, 'bottom-nav__item--active');
- } else {
- removeClass(item, 'bottom-nav__item--active');
- }
- });
- }
-
- bindEvents() {
- this.items.forEach(item => {
- on(item, 'click', (e) => {
- const href = item.getAttribute('href');
- if (!href || href === '#') {
- e.preventDefault();
- }
-
- this.items.forEach(i => removeClass(i, 'bottom-nav__item--active'));
- addClass(item, 'bottom-nav__item--active');
- });
- });
- }
- }
-
- // ========================================
- // Tab Navigation
- // ========================================
-
- class TabNavigation {
- constructor(element) {
- if (!element) return;
-
- this.element = element;
- this.items = $$('.tab-nav__item', element);
- this.panels = [];
-
- this.init();
- }
-
- init() {
- this.setActiveTa();
- this.bindEvents();
- }
-
- setActiveTab() {
- const activeItem = $('.tab-nav__item--active', this.element);
- if (!activeItem && this.items.length > 0) {
- addClass(this.items[0], 'tab-nav__item--active');
- }
- }
-
- bindEvents() {
- this.items.forEach((item, index) => {
- on(item, 'click', (e) => {
- e.preventDefault();
- this.activateTab(index);
- });
- });
- }
-
- activateTab(index) {
- this.items.forEach(item => removeClass(item, 'tab-nav__item--active'));
- addClass(this.items[index], 'tab-nav__item--active');
-
- // Emit custom event
- const event = new CustomEvent('tabchange', {
- detail: { index, item: this.items[index] }
- });
- this.element.dispatchEvent(event);
- }
- }
-
- // ========================================
- // App Bar
- // ========================================
-
- class AppBar {
- constructor(element) {
- if (!element) return;
-
- this.element = element;
- this.backButton = $('.app-bar__back', element);
-
- this.init();
- }
-
- init() {
- this.bindEvents();
- }
-
- bindEvents() {
- if (this.backButton) {
- on(this.backButton, 'click', () => {
- window.history.back();
- });
- }
- }
- }
-
- // ========================================
- // Stepper
- // ========================================
-
- class Stepper {
- constructor(element) {
- if (!element) return;
-
- this.element = element;
- this.steps = $$('.stepper__step', element);
- this.currentStep = 0;
-
- this.init();
- }
-
- init() {
- this.updateSteps();
- }
-
- updateSteps() {
- this.steps.forEach((step, index) => {
- removeClass(step, 'stepper__step--completed', 'stepper__step--active', 'stepper__step--pending');
-
- if (index < this.currentStep) {
- addClass(step, 'stepper__step--completed');
- } else if (index === this.currentStep) {
- addClass(step, 'stepper__step--active');
- } else {
- addClass(step, 'stepper__step--pending');
- }
-
- // Update line
- const line = $('.stepper__line', step);
- if (line) {
- if (index < this.currentStep) {
- addClass(line, 'stepper__line--completed');
- } else {
- removeClass(line, 'stepper__line--completed');
- }
- }
- });
- }
-
- next() {
- if (this.currentStep < this.steps.length - 1) {
- this.currentStep++;
- this.updateSteps();
- return true;
- }
- return false;
- }
-
- previous() {
- if (this.currentStep > 0) {
- this.currentStep--;
- this.updateSteps();
- return true;
- }
- return false;
- }
-
- goTo(step) {
- if (step >= 0 && step < this.steps.length) {
- this.currentStep = step;
- this.updateSteps();
- return true;
- }
- return false;
- }
- }
-
- // ========================================
- // Progress Bar
- // ========================================
-
- class ProgressBar {
- constructor(element) {
- if (!element) return;
-
- this.element = element;
- this.fill = $('.progress-bar__fill', element);
- this.text = $('.progress-bar__text', element);
- this.progress = 0;
-
- this.init();
- }
-
- init() {
- this.setProgress(this.progress);
- }
-
- setProgress(value) {
- this.progress = Math.max(0, Math.min(100, value));
-
- if (this.fill) {
- this.fill.style.width = this.progress + '%';
- }
-
- if (this.text) {
- this.text.textContent = `${this.progress}%`;
- }
- }
-
- increment(value = 1) {
- this.setProgress(this.progress + value);
- }
-
- reset() {
- this.setProgress(0);
- }
- }
-
- // ========================================
- // Auto Initialize
- // ========================================
-
- function initNavigation() {
- // Bottom Navigation
- const bottomNav = $('.bottom-nav');
- if (bottomNav) {
- new BottomNavigation(bottomNav);
- }
-
- // Tab Navigation
- $$('.tab-nav').forEach(tabNav => {
- new TabNavigation(tabNav);
- });
-
- // App Bar
- const appBar = $('.app-bar');
- if (appBar) {
- new AppBar(appBar);
- }
-
- // Stepper
- $$('.stepper').forEach(stepper => {
- new Stepper(stepper);
- });
-
- // Progress Bar
- $$('.progress-bar').forEach(progressBar => {
- new ProgressBar(progressBar);
- });
- }
-
- // Initialize on DOMContentLoaded
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', initNavigation);
- } else {
- initNavigation();
- }
-
- // Export classes
- window.KTEvent = window.KTEvent || {};
- Object.assign(window.KTEvent, {
- BottomNavigation,
- TabNavigation,
- AppBar,
- Stepper,
- ProgressBar
- });
-
-})();
diff --git a/TEMP_BACKUP/prototype/사용자여정맵.md b/TEMP_BACKUP/prototype/사용자여정맵.md
deleted file mode 100644
index d009863..0000000
--- a/TEMP_BACKUP/prototype/사용자여정맵.md
+++ /dev/null
@@ -1,303 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 사용자 여정 맵
-
-## 문서 정보
-- **작성일**: 2025-01-20
-- **버전**: 2.0
-- **작성자**: UI/UX Designer
-- **최종 업데이트**: 파일명 정리 및 여정 재구성
-
----
-
-## 📱 전체 화면 목록 (26개 + 추가 화면)
-
-### ✅ 구현 완료 (24개)
-
-| 번호 | 화면명 | 파일명 | 유저스토리 | 중요도 | 상태 |
-|-----|--------|--------|-----------|--------|------|
-| **User Service** |
-| 01 | 로그인 | 01-로그인.html | UFR-USER-001 | Must | ✅ |
-| 02 | 홈화면 | 02-홈화면.html | UFR-USER-002 | Must | ✅ |
-| 03 | 회원가입 | 03-회원가입.html | UFR-USER-010 | Must | ✅ |
-| 04 | 매장정보등록 | 04-매장정보등록.html | UFR-USER-020 | Must | ✅ |
-| **Event Planning Service** |
-| 05 | 이벤트목적선택 | 05-이벤트목적선택.html | UFR-PLAN-010 | Must | ✅ |
-| 06 | AI트렌드분석결과 | 06-AI트렌드분석결과.html | UFR-PLAN-020 | Must | ✅ |
-| 06-1 | AI이벤트유형추천 | 06-AI이벤트유형추천.html | - | 추가 | ✅ 최근수정 |
-| 07 | AI이벤트상품추천 | 07-AI이벤트상품추천.html | UFR-PLAN-030 | Must | ✅ |
-| 08 | AI참여방법설계 | 08-AI참여방법설계.html | UFR-PLAN-040 | Must | ✅ |
-| 09 | AI홍보문구생성 | 09-AI홍보문구생성.html | UFR-PLAN-050 | Must | ✅ |
-| 10 | 이벤트기획안승인 | 10-이벤트기획안승인.html | UFR-PLAN-060 | Must | ✅ |
-| **Content Generation Service** |
-| 11 | AI이미지생성 | 11-AI이미지생성.html | UFR-CONT-010 | Must | ✅ |
-| 12 | SNS콘텐츠생성 | 12-SNS콘텐츠생성.html | UFR-CONT-030 | Must | ✅ |
-| 13 | QR포스터생성선택 | 13-QR포스터생성선택.html | UFR-CONT-040 | Must | ✅ |
-| 14 | QR포스터상세설정 | - | UFR-CONT-040 | Must | ⏳ 13번에서 분리 필요 |
-| 15 | 콘텐츠편집 | 15-콘텐츠편집.html | UFR-CONT-050 | Should | ✅ |
-| 16 | 콘텐츠최종승인 | 16-콘텐츠최종승인.html | UFR-CONT-060 | Must | ✅ |
-| **Distribution Service** |
-| 17 | 배포채널선택 | 17-배포채널선택.html | UFR-DIST-010 | Must | ✅ |
-| 18 | 배포진행상태 | 18-배포진행상태.html | UFR-DIST-020~050 | Must | ✅ |
-| 19 | 오프라인자료다운로드 | 19-오프라인자료다운로드.html | UFR-DIST-060 | Should | ✅ |
-| **Participation Service** |
-| 20 | 이벤트참여 | - | UFR-PART-010 | Must | ⏳ 고객용 화면 |
-| 21 | 참여완료 | - | UFR-PART-010 | Must | ⏳ 고객용 화면 |
-| **Analytics & Management Service** |
-| 22 | 당첨자명단관리 | 22-당첨자명단관리.html | UFR-PART-050 | Must | ✅ |
-| 23 | 실시간대시보드 | 23-실시간대시보드.html | UFR-ANAL-010 | Must | ✅ |
-| 24 | 채널별성과분석 | 24-채널별성과분석.html | UFR-ANAL-020 | Must | ✅ |
-| 25 | 광고수익률분석 | 25-광고수익률분석.html | UFR-ANAL-030 | Must | ✅ |
-| 26 | 분석리포트 | 26-분석리포트.html | UFR-ANAL-040 | Should | ✅ |
-| **추가 화면 (네비게이션용)** |
-| - | 마이페이지 | 25-마이페이지.html | - | 추가 | ✅ |
-| - | 이벤트목록 | 26-이벤트목록.html | - | 추가 | ✅ |
-
-### ⏳ 작성 필요 (3개)
-
-- **14-QR포스터상세설정**: 13번 화면에서 기능 분리 필요
-- **20-이벤트참여**: 고객용 참여 화면
-- **21-참여완료**: 고객용 완료 화면
-
----
-
-## 🗺️ 소상공인 여정 (Main Journey)
-
-### 1️⃣ 온보딩 여정
-
-```mermaid
-graph TD
- A[01-로그인] --> B{최초 방문?}
- B -->|Yes| C[03-회원가입]
- B -->|No| D[02-홈화면]
- C --> E[04-매장정보등록]
- E --> D
-```
-
-**화면 구성:**
-- **01-로그인**: JWT 인증, 이메일/비밀번호
-- **03-회원가입**: 기본 정보 입력
-- **04-매장정보등록**: 사업자번호 검증, 업종, 주소, 영업시간
-- **02-홈화면**: 대시보드 요약, 새 이벤트 생성 버튼
-
----
-
-### 2️⃣ 이벤트 기획 여정 (Event Planning)
-
-```mermaid
-graph TD
- A[02-홈화면] --> B[05-이벤트목적선택]
- B --> C[06-AI트렌드분석결과]
- C --> D[06-1-AI이벤트유형추천]
- D --> E[07-AI이벤트상품추천]
- E --> F[08-AI참여방법설계]
- F --> G[09-AI홍보문구생성]
- G --> H[10-이벤트기획안승인]
-
- E -->|수정| E
- G -->|편집| G
-```
-
-**화면별 주요 기능:**
-
-| 화면 | 주요 기능 | AI 역할 | 사용자 액션 |
-|-----|----------|---------|-----------|
-| 05-이벤트목적선택 | 목적 선택 (신규고객/재방문/브랜드인지도) | - | 목적 선택 |
-| 06-AI트렌드분석결과 | 시장 트렌드, 경쟁사 분석 | 트렌드 분석 | 확인 |
-| 06-1-AI이벤트유형추천 | 이벤트 유형 7개 추천 | 맞춤 추천 | 유형 선택 |
-| 07-AI이벤트상품추천 | Top 5 경품 추천 | 경품 추천 | 선택/수정 |
-| 08-AI참여방법설계 | 3가지 참여 방법 제시 | 방법 설계 | 방법 선택 |
-| 09-AI홍보문구생성 | 5개 버전 문구 생성 | 문구 생성 | 선택/편집 |
-| 10-이벤트기획안승인 | 최종 확인 및 승인 | - | 승인/수정 |
-
-**🔄 특이사항:**
-- **06-1-AI이벤트유형추천**: 최근 추가된 화면으로 localStorage 저장 로직 포함
-- **07-AI이벤트상품추천**: localStorage에서 선택한 이벤트 유형 불러옴
-- **순환 가능**: 경품 추천(07), 홍보문구(09)는 수정 가능
-
----
-
-### 3️⃣ 콘텐츠 생성 여정 (Content Generation)
-
-```mermaid
-graph TD
- A[10-이벤트기획안승인] --> B[11-AI이미지생성]
- B --> C[12-SNS콘텐츠생성]
- C --> D[13-QR포스터생성선택]
- D -->|생성 안함| F
- D -->|생성| E[14-QR포스터상세설정]
- E --> F[15-콘텐츠편집]
- F --> G[16-콘텐츠최종승인]
-```
-
-**화면별 주요 기능:**
-
-| 화면 | 주요 기능 | 출력물 | 사용자 액션 |
-|-----|----------|--------|-----------|
-| 11-AI이미지생성 | 3종 이미지 생성 | 정사각형/세로/가로 | 선택/재생성 |
-| 12-SNS콘텐츠생성 | SNS별 최적화 콘텐츠 | Instagram, Blog, Kakao | 채널 선택 |
-| 13-QR포스터생성선택 | QR 포스터 생성 여부 | - | 생성 여부 선택 |
-| 14-QR포스터상세설정 | 크기/형식 설정 | A4/A3 PDF | 옵션 선택 |
-| 15-콘텐츠편집 | 간단한 수정 | - | 텍스트/이미지 수정 |
-| 16-콘텐츠최종승인 | 최종 확인 | - | 승인/수정 |
-
-**⏳ TODO:**
-- 14번 화면 분리: 13번에서 QR 포스터 상세 설정 기능 분리
-
----
-
-### 4️⃣ 배포 여정 (Distribution)
-
-```mermaid
-graph TD
- A[16-콘텐츠최종승인] --> B[17-배포채널선택]
- B --> C[18-배포진행상태]
- C --> D{오프라인 자료?}
- D -->|Yes| E[19-오프라인자료다운로드]
- D -->|No| F[02-홈화면]
- E --> F
-```
-
-**화면별 주요 기능:**
-
-| 화면 | 주요 기능 | 배포 채널 | 실시간 상태 |
-|-----|----------|----------|-----------|
-| 17-배포채널선택 | 다중 채널 선택 (최소 1개) | Instagram, 우리동네TV, 지니TV, 링고비즈 | - |
-| 18-배포진행상태 | 채널별 배포 상태 모니터링 | 전체 채널 | 5분 갱신 |
-| 19-오프라인자료다운로드 | QR/PDF 다운로드 | - | - |
-
----
-
-### 5️⃣ 모니터링 & 분석 여정 (Analytics)
-
-```mermaid
-graph TD
- A[02-홈화면] --> B[23-실시간대시보드]
- B --> C[24-채널별성과분석]
- C --> D[25-광고수익률분석]
- D --> E[22-당첨자명단관리]
- E --> F{리포트 필요?}
- F -->|Yes| G[26-분석리포트]
- F -->|No| H[02-홈화면]
- G --> H
-```
-
-**화면별 주요 기능:**
-
-| 화면 | 주요 기능 | 갱신 주기 | 주요 지표 |
-|-----|----------|----------|----------|
-| 23-실시간대시보드 | 종합 성과 한눈에 보기 | 5분 | 참여수, 조회수, 전환율 |
-| 24-채널별성과분석 | 채널별 비교 분석 | 실시간 | 채널별 ROI, 전환율 |
-| 25-광고수익률분석 | 투자 대비 효과 분석 | 일별 | ROI, 순수익, 비용 |
-| 22-당첨자명단관리 | 경품 지급 관리 | 수동 | 당첨자 명단, 지급 상태 |
-| 26-분석리포트 | PDF 리포트 생성 | 수동 | 종합 분석 |
-
----
-
-## 👥 고객 여정 (Customer Journey)
-
-### 6️⃣ 이벤트 참여 여정
-
-```mermaid
-graph TD
- A[이벤트 발견] --> B[20-이벤트참여]
- B --> C[21-참여완료]
- C --> D[응모번호 발급]
- D --> E[당첨 발표 대기]
- E --> F[당첨 알림 수신]
-```
-
-**발견 채널:**
-- QR코드 (오프라인 매장)
-- SNS (Instagram, Blog, Kakao)
-- 우리동네TV
-- 지니TV
-- 링고비즈
-
-**⏳ TODO:**
-- **20-이벤트참여**: 고객용 참여 화면 제작
-- **21-참여완료**: 응모번호 발급 화면 제작
-
----
-
-## 🧭 네비게이션 구조
-
-### 바텀 네비게이션 (소상공인용)
-
-| 아이콘 | 메뉴명 | 이동 화면 | 기능 |
-|-------|--------|----------|------|
-| 🏠 | 홈 | 23-실시간대시보드 | 실시간 현황 |
-| 📋 | 이벤트 | 26-이벤트목록 | 이벤트 관리 + 새 이벤트 |
-| 📊 | 분석 | 24-채널별성과분석 | 성과 분석 |
-| 👤 | 마이페이지 | 25-마이페이지 | 설정, 매장정보 |
-
-### 상단 앱바
-
-- **제목**: 컨텍스트별 화면명
-- **뒤로가기**: 이전 화면 (하위 화면만)
-- **액션 버튼**: 저장, 공유, 필터 등
-
----
-
-## 📂 Backup 파일 (향후 검토)
-
-다음 파일들이 `backup/` 폴더로 이동되었습니다:
-
-| 파일명 | 이유 | 검토 사항 |
-|--------|------|----------|
-| 04-1-AI이벤트유형추천.html | 설계서 미포함 | 06-1과 통합 검토 |
-| 04-2-이벤트상세정보.html | 설계서 미포함 | 기능 통합 검토 |
-| 05-이벤트목적선택.html | 중복 파일 | 삭제 |
-| 06-1-AI트렌드분석결과.html | 버전 파일 | 06번과 통합 검토 |
-| 06-2-이벤트상세정보.html | 버전 파일 | 기능 통합 검토 |
-| 10-AI영상제작.html | 설계서에서 삭제됨 | 향후 재사용 가능성 |
-
----
-
-## 🔄 최근 수정 내역
-
-### 2025-01-20 (파일명 정리)
-
-1. **파일명 재번호**: 설계서 기준으로 모든 화면 번호 재정렬
-2. **용어 통일**:
- - `AI경품추천` → `AI이벤트상품추천`
- - `ROI분석` → `광고수익률분석`
-3. **추가 화면 식별**:
- - `06-1-AI이벤트유형추천` (최근 작업, localStorage 로직 포함)
- - `25-마이페이지`, `26-이벤트목록` (네비게이션용)
-4. **중복 파일 정리**: backup 폴더로 이동
-
-### 버그 수정 (06-1-AI이벤트유형추천.html)
-
-**문제**: 이벤트 유형 선택 후 07번 화면에서 자동 리다이렉트 발생
-
-**원인**: `selectedEventType`이 localStorage에 저장되지 않음
-
-**해결**: `proceedToNext` 함수에서 localStorage 직접 저장 로직 추가 (560-562줄)
-
-```javascript
-// 수정 전
-window.AppState.selectedEventType = selectedEvent;
-window.AppState.save();
-
-// 수정 후
-localStorage.setItem('kt_selected_event_type', JSON.stringify(selectedEvent));
-window.AppState.save();
-```
-
----
-
-## 📊 통계
-
-- **총 화면 수**: 26개 (설계서 기준) + 3개 (추가 화면)
-- **구현 완료**: 24개 ✅
-- **작성 필요**: 3개 ⏳
-- **Backup 파일**: 6개
-
----
-
-## ✅ Next Steps
-
-1. **14-QR포스터상세설정**: 13번 화면에서 기능 분리
-2. **20-이벤트참여**: 고객용 참여 화면 제작
-3. **21-참여완료**: 응모번호 발급 화면 제작
-4. **06-1-AI이벤트유형추천**: 설계서에 정식 추가 여부 검토
-5. **Backup 파일 검토**: 통합 또는 삭제 결정
diff --git a/TEMP_BACKUP/prototype/파일명변경계획.md b/TEMP_BACKUP/prototype/파일명변경계획.md
deleted file mode 100644
index d212d30..0000000
--- a/TEMP_BACKUP/prototype/파일명변경계획.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# 프로토타입 파일명 변경 계획
-
-## 변경 대상 (설계서 기준으로 정리)
-
-### 1단계: 번호 재정렬 (역순으로 변경하여 충돌 방지)
-
-| 현재 파일명 | 변경 파일명 | 비고 |
-|------------|------------|------|
-| 24-분석리포트.html | 26-분석리포트.html | |
-| 23-ROI분석.html | 25-광고수익률분석.html | 이름도 변경 |
-| 22-채널별성과분석.html | 24-채널별성과분석.html | |
-| 21-실시간대시보드.html | 23-실시간대시보드.html | |
-| 20-당첨자명단관리.html | 22-당첨자명단관리.html | |
-| 17-오프라인자료다운로드.html | 19-오프라인자료다운로드.html | |
-| 16-배포진행상태.html | 18-배포진행상태.html | |
-| 15-배포채널선택.html | 17-배포채널선택.html | |
-| 14-콘텐츠최종승인.html | 16-콘텐츠최종승인.html | |
-| 13-콘텐츠편집.html | 15-콘텐츠편집.html | |
-| 12-QR포스터생성.html | 13-QR포스터생성선택.html | 이름도 변경 |
-| 11-SNS콘텐츠생성.html | 12-SNS콘텐츠생성.html | |
-| 09-AI이미지생성.html | 11-AI이미지생성.html | |
-| 08-이벤트기획안승인.html | 10-이벤트기획안승인.html | |
-| 07-AI홍보문구생성.html | 09-AI홍보문구생성.html | |
-| 06-AI참여방법설계.html | 08-AI참여방법설계.html | |
-| 05-AI경품추천.html | 07-AI이벤트상품추천.html | 이름도 변경 |
-| 04-AI트렌드분석결과.html | 06-AI트렌드분석결과.html | |
-| 03-이벤트목적선택.html | 05-이벤트목적선택.html | |
-| 02-매장정보등록.html | 04-매장정보등록.html | |
-| 01-회원가입.html | 03-회원가입.html | |
-| 21.5-홈.html | 02-홈화면.html | 이름도 변경 |
-| 00-로그인.html | 01-로그인.html | |
-
-### 2단계: 중복/삭제 파일 처리
-
-| 파일명 | 처리 방법 | 사유 |
-|--------|----------|------|
-| 04-1-AI이벤트유형추천.html | backup 폴더로 이동 | 설계서에 없음, 추후 통합 검토 |
-| 04-2-이벤트상세정보.html | backup 폴더로 이동 | 설계서에 없음, 추후 통합 검토 |
-| 05-이벤트목적선택.html | 삭제 (03-과 중복) | 중복 파일 |
-| 06-1-AI트렌드분석결과.html | backup 폴더로 이동 | 버전 파일, 추후 검토 |
-| 06-2-이벤트상세정보.html | backup 폴더로 이동 | 버전 파일, 추후 검토 |
-| 06-AI이벤트유형추천.html | 현재 사용 중 | 이벤트 유형 선택 화면 |
-| 10-AI영상제작.html | backup 폴더로 이동 | 설계서에서 삭제됨 |
-
-### 3단계: 추가 화면 정리 (유지)
-
-| 파일명 | 비고 |
-|--------|------|
-| 25-마이페이지.html | 네비게이션용 추가 화면 |
-| 26-이벤트목록.html | 네비게이션용 추가 화면 |
-
-### 4단계: 누락 화면 (향후 작성 필요)
-
-| 화면번호 | 화면명 | 비고 |
-|---------|--------|------|
-| 14 | QR포스터상세설정 | 13번에서 분리 필요 |
-| 20 | 이벤트참여 | 고객용 화면 |
-| 21 | 참여완료 | 고객용 화면 |
-
-## 특이사항
-
-1. **06-AI이벤트유형추천.html**: 이 파일이 최근 수정되었고 localStorage 저장 로직이 추가됨. 설계서의 어느 단계에 해당하는지 확인 필요.
-2. **07-AI이벤트상품추천.html**: "AI경품추천"에서 "AI이벤트상품추천"으로 용어 통일 필요.
-3. **13-QR포스터생성선택.html + 14-QR포스터상세설정.html**: 현재 하나의 파일(12-QR포스터생성.html)을 두 개로 분리 필요.
diff --git a/TEMP_BACKUP/uiux.md b/TEMP_BACKUP/uiux.md
deleted file mode 100644
index 3f443bc..0000000
--- a/TEMP_BACKUP/uiux.md
+++ /dev/null
@@ -1,3312 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - UI/UX 설계서
-
-## 문서 정보
-- **작성일**: 2025-01-20
-- **버전**: 1.0
-- **작성자**: UI/UX Designer (박민지 "픽셀")
-- **참조 문서**: design/userstory.md
-
-## 1. 설계 개요
-
-### 1.1 설계 목적
-소상공인이 이벤트 기획부터 배포, 분석까지 모바일 환경에서 손쉽게 수행할 수 있는 직관적이고 효율적인 사용자 경험 제공
-
-### 1.2 설계 원칙
-
-#### Mobile First 디자인 철학
-1. **우선순위 중심 설계**: 작은 화면에서 가장 중요한 기능과 콘텐츠에 집중
-2. **점진적 향상**: 모바일 기본 경험 먼저 구축 후, 화면이 커질수록 추가 기능 제공
-3. **성능 최적화**: 모바일 환경의 제약(느린 네트워크, 제한된 처리 능력)을 먼저 고려
-
-#### 핵심 UX 원칙
-- **단순성**: 복잡한 AI 기능을 단순한 인터페이스로 제공
-- **피드백**: 모든 AI 처리 과정에 대한 명확한 진행 상황 표시
-- **일관성**: 전체 플로우에서 일관된 패턴과 컴포넌트 사용
-- **효율성**: 최소한의 입력으로 최대한의 결과 제공 (AI 자동화)
-- **신뢰성**: AI 추천에 대한 투명성과 수정 가능성 제공
-
-### 1.3 참조 사이트 분석
-
-#### KT 사장님Easy
-- 깔끔한 현대적 인터페이스, 대형 타이포그래피
-- 단계별 기능 소개를 시각적 예시로 제시
-- QR 코드 다운로드 강조
-- 캐러셀을 통한 프로모션 전달
-
-#### wwit.design 닷슬래시대시
-- 미니멀 모바일 우선 디자인
-- 바텀 시트를 통한 보조 액션
-- 탭 네비게이션으로 섹션 구분
-- 명확한 빈 상태(Empty State) 처리
-- 점진적 정보 공개
-
-## 2. 프로토타입 화면 목록
-
-### 2.1 화면 분류 및 우선순위
-
-| 화면번호 | 화면명 | 관련 유저스토리 | 비즈니스 중요도 | 비고 |
-|---------|--------|----------------|----------------|------|
-| **User Service** |
-| 01 | 로그인 | UFR-USER-001 | Must (M/5) | JWT 인증 |
-| 02 | 홈화면 | UFR-USER-002 | Must (M/8) | 대시보드 요약 |
-| 03 | 회원가입 | UFR-USER-010 | Must (M/5) | 이메일/비밀번호 |
-| 04 | 매장정보등록 | UFR-USER-020 | Must (M/13) | 사업자번호 검증 |
-| **Event Planning Service** |
-| 05 | 이벤트목적선택 | UFR-PLAN-010 | Must (M/3) | 기획 시작점 |
-| 06 | AI트렌드분석결과 | UFR-PLAN-020 | Must (M/13) | AI 분석 결과 |
-| 07 | AI이벤트상품추천 | UFR-PLAN-030 | Must (M/21) | 이벤트상품 수정 가능, 진행방법 선택 |
-| 08 | AI참여방법설계 | UFR-PLAN-040 | Must (M/21) | 3가지 옵션 |
-| 09 | AI홍보문구생성 | UFR-PLAN-050 | Must (M/13) | 5개 버전 |
-| 10 | 이벤트기획안승인 | UFR-PLAN-060 | Must (M/5) | 최종 확인 |
-| **Content Generation Service** |
-| 11 | AI이미지생성 | UFR-CONT-010 | Must (M/34) | 3종 이미지 |
-| 12 | SNS콘텐츠생성 | UFR-CONT-030 | Must (M/21) | Instagram(선택), Blog, Kakao |
-| 13 | QR포스터생성선택 | UFR-CONT-040 | Must (M/8) | 생성 여부 선택 |
-| 14 | QR포스터상세설정 | UFR-CONT-040 | Must (M/8) | A4/A3 PDF |
-| 15 | 콘텐츠편집 | UFR-CONT-050 | Should (S/13) | 간단한 수정 |
-| 16 | 콘텐츠최종승인 | UFR-CONT-060 | Must (M/3) | 최종 확인 |
-| **Distribution Service** |
-| 17 | 배포채널선택 | UFR-DIST-010 | Must (M/13) | 다중 채널, 최소 1개 |
-| 18 | 배포진행상태 | UFR-DIST-020~050 | Must (M/47) | 실시간 상태 |
-| 19 | 오프라인자료다운로드 | UFR-DIST-060 | Should (S/5) | QR/PDF |
-| **Participation Service** |
-| 20 | 이벤트참여 | UFR-PART-010 | Must (M/8) | 고객용 |
-| 21 | 참여완료 | UFR-PART-010 | Must (M/8) | 응모번호 발급 |
-| **Analytics & Management Service** |
-| 22 | 당첨자명단관리 | UFR-PART-050 | Must (M/5) | 이벤트상품 지급 관리 |
-| 23 | 실시간대시보드 | UFR-ANAL-010 | Must (M/21) | 5분 갱신 |
-| 24 | 채널별성과분석 | UFR-ANAL-020 | Must (M/13) | 비교 분석 |
-| 25 | 광고수익률분석 | UFR-ANAL-030 | Must (M/13) | 투자 대비 효과 |
-| 26 | 분석리포트 | UFR-ANAL-040 | Should (S/8) | PDF 다운로드 |
-
-**총 26개 화면** (Must: 23개, Should: 3개)
-- 추가: 로그인, 홈화면, QR포스터생성선택
-- 삭제: AI영상제작
-- 변경: AI경품추천→AI이벤트상품추천, ROI분석→광고수익률분석
-
-## 3. 화면 간 사용자 플로우
-
-### 3.1 메인 플로우 (소상공인)
-
-```
-[시작]
- ↓
-[01-로그인] ←─ 기존 회원
- ↓
-[02-홈화면] (대시보드)
- ↓
-┌──────────────────────────┐
-│ 신규 회원 가입 (최초 1회) │
-├──────────────────────────┤
-[03-회원가입] → [04-매장정보등록]
-└──────────────────────────┘
- ↓
-┌─────────────────────┐
-│ 이벤트 생성 플로우 │
-├─────────────────────┤
-[05-이벤트목적선택]
- ↓
-[06-AI트렌드분석결과]
- ↓
-[07-AI이벤트상품추천] ←→ (수정 가능, 진행방법 선택)
- ↓
-[08-AI참여방법설계]
- ↓
-[09-AI홍보문구생성] ←→ (편집 가능)
- ↓
-[10-이벤트기획안승인]
-└─────────────────────┘
- ↓
-┌─────────────────────┐
-│ 콘텐츠 생성 플로우 │
-├─────────────────────┤
-[11-AI이미지생성]
- ↓
-[12-SNS콘텐츠생성]
- ↓
-[13-QR포스터생성선택] ─→ [생성 안 함] → [15-콘텐츠편집]
- ↓ [QR 포스터 생성]
-[14-QR포스터상세설정]
- ↓
-[15-콘텐츠편집] (선택)
- ↓
-[16-콘텐츠최종승인]
-└─────────────────────┘
- ↓
-┌─────────────────────┐
-│ 배포 플로우 │
-├─────────────────────┤
-[17-배포채널선택] (최소 1개)
- ↓
-[18-배포진행상태]
- ↓
-[19-오프라인자료다운로드] (선택)
-└─────────────────────┘
- ↓
-┌─────────────────────┐
-│ 모니터링 & 관리 │
-├─────────────────────┤
-[23-실시간대시보드]
- ↓
-[24-채널별성과분석]
- ↓
-[25-광고수익률분석]
- ↓
-[22-당첨자명단관리]
- ↓
-[26-분석리포트] (선택)
-└─────────────────────┘
-```
-
-### 3.2 고객 플로우
-
-```
-[이벤트 발견]
-(QR코드/SNS/우리동네TV/지니TV/링고비즈)
- ↓
-[18-이벤트참여]
- ↓
-[19-참여완료]
- ↓
-(당첨 발표 대기)
- ↓
-[당첨 알림 수신] (SMS/알림톡)
-```
-
-### 3.3 네비게이션 구조
-
-#### 바텀 네비게이션 (소상공인용)
-1. **홈** → 21-실시간대시보드
-2. **이벤트** → 이벤트 목록 + 새 이벤트 생성 버튼
-3. **분석** → 22-채널별성과분석
-4. **마이페이지** → 설정, 매장정보, 로그아웃
-
-#### 상단 앱바
-- 컨텍스트별 제목
-- 뒤로가기 (하위 화면)
-- 액션 버튼 (저장, 공유 등)
-
-## 4. 화면별 상세 설계
-
-### 4.1 User Service
-
----
-
-#### 01-로그인
-
-**개요**
-- **목적**: 기존 회원의 서비스 접근 인증
-- **관련 유저스토리**: UFR-USER-001
-- **비즈니스 중요도**: Must (M/5)
-
-**주요 기능**
-1. 이메일/비밀번호 로그인
-2. 자동 로그인 옵션
-3. 비밀번호 찾기
-4. 회원가입 링크
-
-**UI 구성요소**
-
-**모바일 (320px~767px)**
-```
-┌─────────────────────────┐
-│ │
-│ KT 이벤트 마케팅 │
-│ 로고 🎯 │
-│ │
-│ 소상공인 이벤트 자동 생성│
-│ │
-│ ┌──────────────────┐ │
-│ │ 이메일 │ │
-│ │ [example@xxx.com]│ │
-│ └──────────────────┘ │
-│ │
-│ ┌──────────────────┐ │
-│ │ 비밀번호 │ │
-│ │ [••••••••] 👁 │ │
-│ └──────────────────┘ │
-│ │
-│ ☐ 자동 로그인 │
-│ │
-│ [비밀번호 찾기] │
-│ │
-├─────────────────────────┤
-│ [ 로그인 ] │
-│ │
-│ 계정이 없으신가요? │
-│ [회원가입] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 입력 필드 포커스 시 테두리 강조
-- 비밀번호 보기/숨기기 토글
-- 로그인 실패 시 에러 메시지 표시
- - "이메일 또는 비밀번호가 일치하지 않습니다"
- - "존재하지 않는 계정입니다"
-- 로그인 성공 시 홈화면(02)으로 이동
-
-**반응형 처리**
-- 태블릿(768px~): 입력 필드 최대 너비 400px 중앙 정렬
-- 데스크톱(1024px~): 좌측에 서비스 소개 영상/이미지, 우측에 로그인 폼
-
-**접근성**
-- 모든 입력 필드에 명확한 label
-- 에러 메시지는 aria-live="polite"로 전달
-- Enter 키로 로그인 가능
-
----
-
-#### 02-홈화면
-
-**개요**
-- **목적**: 로그인 후 이벤트 현황 확인 및 빠른 액션 제공
-- **관련 유저스토리**: UFR-USER-002
-- **비즈니스 중요도**: Must (M/8)
-
-**주요 기능**
-1. 대시보드 요약 (진행 중인 이벤트, 참여자, 광고수익률)
-2. 진행 중인 이벤트 목록
-3. 새 이벤트 생성 버튼
-4. 빠른 네비게이션
-
-**UI 구성요소**
-
-**모바일 (320px~767px)**
-```
-┌─────────────────────────┐
-│ ☰ 메뉴 KT 이벤트 🔔 │
-├─────────────────────────┤
-│ │
-│ 안녕하세요, │
-│ [김사장님] 매장 👋 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 📊 이번 달 요약 ││
-│ │ ││
-│ │ 진행중 이벤트: 2개 ││
-│ │ 총 참여자: 145명 ││
-│ │ 광고수익률: +35% ││
-│ └─────────────────────┘│
-│ │
-│ 진행 중인 이벤트 │
-│ ┌─────────────────────┐│
-│ │ 🎁 신년 특별 이벤트 ││
-│ │ 참여: 78명 ││
-│ │ 남은기간: D-5 ││
-│ │ [상세보기] ││
-│ └─────────────────────┘│
-│ ┌─────────────────────┐│
-│ │ 🍕 재방문 쿠폰 ││
-│ │ 참여: 67명 ││
-│ │ 남은기간: D-12 ││
-│ │ [상세보기] ││
-│ └─────────────────────┘│
-│ │
-│ [모든 이벤트 보기 >] │
-│ │
-├─────────────────────────┤
-│ [ ➕ 새 이벤트 생성 ] │
-│ │
-│ ┌──────┬──────┬───────┐│
-│ │ 홈 │ 분석 │ 관리 ││
-│ └──────┴──────┴───────┘│
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 대시보드 카드 스와이프로 더 많은 정보 확인
-- 이벤트 카드 클릭 시 상세 대시보드(23번 화면)로 이동
-- "새 이벤트 생성" 버튼 클릭 시 이벤트 기획 시작(05번 화면)
-- 하단 탭 네비게이션으로 주요 섹션 이동
-
-**반응형 처리**
-- 태블릿(768px~): 이벤트 카드 2열 그리드
-- 데스크톱(1024px~): 좌측 사이드바 네비게이션, 우측에 대시보드 3열 레이아웃
-
-**접근성**
-- 모든 카드에 명확한 제목과 설명
-- 버튼은 최소 44x44px 터치 영역
-- 화면 로드 시 환영 메시지 읽어주기
-
----
-
-#### 03-회원가입
-
-**개요**
-- **목적**: 신규 소상공인의 간편한 회원가입 처리
-- **관련 유저스토리**: UFR-USER-010
-- **비즈니스 중요도**: Must (M/5)
-
-**주요 기능**
-1. 기본 정보 입력 (이름, 전화번호, 이메일)
-2. 비밀번호 설정
-3. 개인정보 수집 동의
-4. 중복 가입 방지
-
-**UI 구성요소**
-
-**모바일 (320px~767px)**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 회원가입 │
-├─────────────────────────┤
-│ │
-│ KT 이벤트 마케팅 │
-│ 환영합니다 🎉 │
-│ │
-│ ┌──────────────────┐ │
-│ │ 이름 * │ │
-│ │ [2자 이상 입력] │ │
-│ └──────────────────┘ │
-│ │
-│ ┌──────────────────┐ │
-│ │ 전화번호 * │ │
-│ │ [010-XXXX-XXXX] │ │
-│ └──────────────────┘ │
-│ │
-│ ┌──────────────────┐ │
-│ │ 이메일 * │ │
-│ │ [example@xx.com] │ │
-│ └──────────────────┘ │
-│ │
-│ ┌──────────────────┐ │
-│ │ 비밀번호 * │ │
-│ │ [••••••••] 👁 │ │
-│ │ 최소 8자, 영문/숫자│ │
-│ │ /특수문자 조합 │ │
-│ └──────────────────┘ │
-│ │
-│ ┌──────────────────┐ │
-│ │ 비밀번호 확인 * │ │
-│ │ [••••••••] 👁 │ │
-│ └──────────────────┘ │
-│ │
-│ ☑ 개인정보 수집 동의 │
-│ (필수) [자세히보기] │
-│ │
-├─────────────────────────┤
-│ [ 매장 정보 등록 ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 입력 필드 포커스 시 라벨 상단 이동 (Material Design)
-- 실시간 형식 검증
- - 이름: 2자 이상
- - 전화번호: 010-XXXX-XXXX 형식
- - 이메일: example@domain.com 형식
- - 비밀번호: 최소 8자, 영문/숫자/특수문자 조합
- - 비밀번호 확인: 비밀번호와 일치 여부
-- 중복 가입 체크 (이메일, 전화번호 기준)
-- 비밀번호 보기/숨기기 토글
-- 모든 필드 입력 및 동의 완료 시 버튼 활성화
-- 회원가입 완료 시 매장정보등록(04번 화면)으로 이동
-
-**검증 에러 메시지**
-- 이름: "이름을 2자 이상 입력해주세요"
-- 전화번호: "올바른 전화번호 형식이 아닙니다 (010-XXXX-XXXX)"
-- 이메일: "올바른 이메일 형식이 아닙니다"
-- 비밀번호: "최소 8자 이상, 영문/숫자/특수문자를 조합해주세요"
-- 비밀번호 확인: "비밀번호가 일치하지 않습니다"
-- 중복: "이미 가입된 이메일입니다" / "이미 가입된 전화번호입니다"
-
-**반응형 처리**
-- 태블릿(768px~): 입력 필드 최대 너비 500px 중앙 정렬
-- 데스크톱(1024px~): 좌측에 서비스 소개 이미지, 우측에 폼 배치
-
-**접근성**
-- 모든 입력 필드에 적절한 label과 placeholder
-- 필수 필드는 asterisk(*)로 표시
-- 에러 메시지는 aria-live로 스크린 리더에 즉시 전달
-- Tab 키 순서 논리적으로 설정
-
----
-
-#### 04-매장정보등록
-
-**개요**
-- **목적**: 맞춤형 이벤트 생성을 위한 매장 정보 수집 및 검증
-- **관련 유저스토리**: UFR-USER-020
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 매장 기본 정보 입력 (매장명, 업종, 주소)
-2. 사업자번호 검증 (국세청 API 연동)
-3. 메뉴/상품 정보 입력 (선택)
-4. 매장 이미지 업로드 (선택)
-5. 검증 완료 후 대시보드로 이동
-
-**UI 구성요소**
-
-**모바일 (320px~767px)**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 매장정보등록 │
-├─────────────────────────┤
-│ 진행상황: ━━━━━━━━━ 2/2 │
-├─────────────────────────┤
-│ │
-│ 필수 정보 │
-│ │
-│ [매장명 입력] │
-│ (최대 50자) │
-│ │
-│ [업종 선택 ▼] │
-│ 음식점/카페/소매업... │
-│ │
-│ [주소 검색 🔍] │
-│ (도로명 주소 API 연동) │
-│ │
-│ [사업자번호 *] │
-│ XXX-XX-XXXXX │
-│ [검증하기] ← 자동 검증 │
-│ │
-│ ───────────────────── │
-│ 선택 정보 (이벤트 맞춤화)│
-│ │
-│ 메뉴/상품 (최대 10개) │
-│ + [메뉴 추가] │
-│ ┌────────────────────┐ │
-│ │ • 치킨 세트 │ │
-│ │ 15,000원 │ │
-│ │ 바삭한 황금 치킨 │ │
-│ └────────────────────┘ │
-│ │
-│ 매장 특징/강점 │
-│ [텍스트 입력 영역] │
-│ (최대 200자) │
-│ │
-│ 대표 이미지 (최대 3장) │
-│ [📷] [📷] [📷] │
-│ │
-├─────────────────────────┤
-│ [ 등록 완료하기 ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **주소 검색**: 바텀 시트로 주소 검색 UI 표시 (카카오 주소 API)
-2. **사업자번호 검증**:
- - 입력 완료 시 자동 검증 시작
- - 로딩 인디케이터 표시: "사업자번호 확인 중..."
- - 검증 성공: ✅ "확인됨" 표시 (녹색 배지)
- - 검증 실패: ❌ 구체적인 오류 메시지 표시
- - **형식 오류**: "사업자번호 형식이 올바르지 않습니다. (XXX-XX-XXXXX 형식으로 입력해주세요)"
- - **유효성 오류**: "등록되지 않은 사업자번호입니다. 번호를 다시 확인해주세요."
- - **휴폐업**: "휴업 또는 폐업된 사업자입니다. 현재 운영 중인 사업자번호를 입력해주세요."
- - **정보 불일치**: "입력하신 매장명과 사업자 정보가 일치하지 않습니다."
- - **API 연동 오류**: "사업자번호 확인 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요."
- - 오류 발생 시 입력 필드 빨간색 테두리 강조 및 포커스 이동
- - 재시도 버튼 제공
-3. **메뉴 추가**: 바텀 시트로 메뉴명(최대 30자), 가격, 설명(최대 100자) 입력
-4. **이미지 업로드**:
- - 카메라 또는 갤러리 선택
- - 업로드 진행률 표시
- - 미리보기 제공 (최대 5MB)
-
-**반응형 처리**
-- 태블릿: 2단 레이아웃 (필수정보 | 선택정보)
-- 데스크톱: 3단 레이아웃 + 우측에 진행 상황 및 안내
-
-**검증 및 피드백**
-- 매장명: 최대 50자 필수
-- 업종: 카테고리 리스트 중 필수 선택
-- 주소: 도로명 주소 API 연동 필수
-- 사업자번호: 형식 검증 (XXX-XX-XXXXX) → 국세청 API 검증
- - 유효성 확인
- - 휴폐업 여부 확인
- - 매장명과 사업자 정보 일치 확인
-- 검증 실패 시 구체적인 오류 메시지와 함께 재입력 유도
-- 이전 입력값 유지하여 사용자 편의성 제공
-- 오류 로그 자동 기록 (감사 추적용)
-
----
-
-### 4.2 Event Planning Service
-
----
-
-#### 05-이벤트목적선택
-
-**개요**
-- **목적**: 이벤트 기획의 방향성 설정
-- **관련 유저스토리**: UFR-PLAN-010
-- **비즈니스 중요도**: Must (M/3)
-
-**주요 기능**
-1. 4가지 목적 중 하나 선택 (카드형 라디오 버튼)
-2. 각 목적별 아이콘, 설명, 예상 효과 제시
-3. 목적별 상세 정보 바텀 시트 제공 (주요 혜택, 추천 전략, 성공률)
-4. 선택 시 다음 단계(AI 분석) 자동 진행
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [닫기] 새 이벤트 기획 │
-├─────────────────────────┤
-│ 단계 1/6 ●○○○○○ │
-│ │
-│ 이벤트 목적을 선택하세요 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 👤 ││
-│ │ 신규고객 유치 ││
-│ │ 새로운 고객 확보 ││
-│ │ 예상효과: +30% ││
-│ │ [ℹ️] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 🔄 ││
-│ │ 재방문 유도 ││
-│ │ 기존 고객 재방문 ││
-│ │ 예상효과: +25% ││
-│ │ [ℹ️] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 💰 ││
-│ │ 매출 증대 ││
-│ │ 단기 매출 향상 ││
-│ │ 예상효과: +40% ││
-│ │ [ℹ️] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 📢 ││
-│ │ 인지도 향상 ││
-│ │ 브랜드 인지도 제고 ││
-│ │ 예상효과: +50% ││
-│ │ [ℹ️] ││
-│ └─────────────────────┘│
-│ │
-└─────────────────────────┘
-```
-
-**목적별 상세 정보 (바텀 시트)**
-```
-┌─────────────────────────┐
-│ [━━] 신규고객 유치 │
-├─────────────────────────┤
-│ 👤 예상효과: 신규 고객 +30% │
-│ 📊 성공률: 85% │
-│ │
-│ 💡 주요 혜택 │
-│ • 새로운 잠재고객 발굴 │
-│ • 고객 기반 확대 │
-│ • 시장 점유율 증가 │
-│ │
-│ 🎯 추천 전략 │
-│ • 할인 쿠폰 제공 │
-│ • SNS 바이럴 마케팅 │
-│ • 신규 고객 전용 특전 │
-│ │
-│ [ 이 목적으로 진행 ] │
-└─────────────────────────┘
-```
-
-**목적별 세부 정보**
-
-**1. 신규고객 유치**
-- 예상효과: +30%
-- 성공률: 85%
-- 주요 혜택:
- - 새로운 잠재고객 발굴
- - 고객 기반 확대
- - 시장 점유율 증가
-- 추천 전략:
- - 할인 쿠폰 제공
- - SNS 바이럴 마케팅
- - 신규 고객 전용 특전
-
-**2. 재방문 유도**
-- 예상효과: +25%
-- 성공률: 80%
-- 주요 혜택:
- - 고객 충성도 향상
- - 재구매율 증가
- - 고객 생애 가치(LTV) 상승
-- 추천 전략:
- - 재방문 쿠폰 증정
- - 포인트 적립 이벤트
- - VIP 고객 우대 프로그램
-
-**3. 매출 증대**
-- 예상효과: +40%
-- 성공률: 75%
-- 주요 혜택:
- - 단기 매출 급증
- - 재고 소진 효과
- - 객단가 상승
-- 추천 전략:
- - 한정 수량 프로모션
- - 세트 상품 할인
- - 시간대별 특가 이벤트
-
-**4. 인지도 향상**
-- 예상효과: +50%
-- 성공률: 90%
-- 주요 혜택:
- - 브랜드 노출 극대화
- - 입소문 효과
- - 잠재 고객층 확대
-- 추천 전략:
- - SNS 공유 이벤트
- - 해시태그 챌린지
- - 인플루언서 협업
-
-**인터랙션**
-1. **카드 선택**:
- - 카드 탭 시 선택 상태 전환 (배경색 변경, 체크 표시)
- - 호버/롱프레스 시 카드 약간 확대 애니메이션
- - 선택된 카드는 Primary Color 배경, 미선택 카드는 회색 배경
-
-2. **상세 정보 보기** (ℹ️ 버튼):
- - 각 카드 우측 하단 ℹ️ 아이콘 탭
- - 바텀 시트 슬라이드업 애니메이션 (0.3초)
- - 상세 정보 표시 (주요 혜택, 추천 전략, 성공률)
- - 바텀 시트 내 "이 목적으로 진행" 버튼 탭 시:
- - 해당 목적 자동 선택
- - 바텀 시트 닫힘
- - 다음 단계(AI 트렌드 분석) 자동 진행
-
-3. **다음 단계 진행**:
- - 카드 직접 선택 시 즉시 다음 화면(06-AI트렌드분석결과)으로 자동 이동
- - 트랜지션: 페이드아웃 → 페이드인 (0.5초)
- - 선택한 목적 정보는 다음 단계로 전달
-
-4. **뒤로가기**:
- - 좌측 상단 X 버튼 또는 디바이스 뒤로가기
- - 확인 다이얼로그: "기획을 취소하시겠습니까?"
- - 확인 시 홈 화면(02)으로 이동
-
-**접근성**
-- 각 카드에 role="radio" 속성
-- aria-label: "신규고객 유치, 예상효과 30% 증가"
-- 키보드 네비게이션: Tab/Shift+Tab으로 카드 이동, Enter/Space로 선택
-- 스크린 리더: 목적명, 설명, 예상효과 순서로 읽기
-
-**성능**
-- 초기 로딩 < 1초
-- 카드 선택 후 다음 화면 프리페치 (0.5초 이내)
-- 바텀 시트 애니메이션 60fps 유지
-- 이미지 아이콘 대신 유니코드 이모지 사용 (로딩 시간 절감)
-
----
-
-#### 06-AI이벤트유형추천
-
-**개요**
-- **목적**: AI 기반 이벤트 유형 추천 및 선택
-- **관련 유저스토리**: UFR-PLAN-020
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. 선택한 목적에 맞는 7가지 이벤트 유형 AI 추천
-2. 가성비 등급 표시 (S/A/B/C/D)
-3. 정렬 기능 (가성비순, 추천순, 난이도순, ROI순)
-4. 태그 필터링 (디지털/오프라인, SNS, 저예산 등)
-5. 각 이벤트 유형별 상세 정보 확인
-6. 이벤트 유형 선택 → 상세 정보 화면으로 이동
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 이벤트 추천 │
-├─────────────────────────┤
-│ 단계 2/6 ●●○○○○ │
-│ │
-│ 매장 유형에 맞는 │
-│ 이벤트를 추천해드려요 │
-│ │
-│ [정렬: 가성비순 ▼] │
-│ #전체 #디지털 #오프라인 │
-│ │
-│ ┌─────────────────────┐│
-│ │ SNS 해시태그 이벤트 ││
-│ │ 가성비 [S] 난이도 ⭐ ││
-│ │ 💰 5만원~10만원 ││
-│ │ 📊 ROI: 1,700% ││
-│ │ ││
-│ │ 예상효과 ││
-│ │ • SNS 노출 +400% ││
-│ │ • 신규 고객 +70% ││
-│ │ • 인지도 +120% ││
-│ │ ││
-│ │ #디지털 #SNS #바이럴││
-│ │ [자세히 보기]││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 명함형 쿠폰 배포 ││
-│ │ 가성비 [S] 난이도 ⭐ ││
-│ │ 💰 3만원~8만원 ││
-│ │ 📊 ROI: 2,592% ││
-│ │ ││
-│ │ 예상효과 ││
-│ │ • 재방문율 +350% ││
-│ │ • 객단가 +45% ││
-│ │ • 신규고객 +120% ││
-│ │ ││
-│ │ #오프라인 #쿠폰 ││
-│ │ #최고가성비 ││
-│ │ [자세히 보기]││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 출석체크 이벤트 ││
-│ │ 가성비 [A] 난이도 ⭐⭐││
-│ │ 💰 8만원~15만원 ││
-│ │ 📊 ROI: 1,875% ││
-│ │ [자세히 보기]││
-│ └─────────────────────┘│
-│ │
-│ ... (스크롤로 더보기) │
-│ │
-└─────────────────────────┘
-```
-
-**7가지 추천 이벤트 유형**
-
-**1. SNS 해시태그 이벤트**
-- 예산: 5만원 ~ 10만원
-- 가성비 등급: S (17.0점)
-- 난이도: ⭐ (1/5)
-- 추천점수: 8.3/10
-- 예상 ROI: 1,700%
-- 예상 효과:
- - SNS 노출 +400%
- - 신규 고객 +70%
- - 브랜드 인지도 +120%
-- 태그: #디지털 #SNS #바이럴 #저예산
-
-**2. 명함형 쿠폰 배포**
-- 예산: 3만원 ~ 8만원
-- 가성비 등급: S (25.9점)
-- 난이도: ⭐ (1/5)
-- 추천점수: 9.1/10
-- 예상 ROI: 2,592%
-- 예상 효과:
- - 재방문율 +350%
- - 객단가 +45%
- - 신규 고객 +120%
-- 태그: #오프라인 #쿠폰 #지역마케팅 #최고가성비
-
-**3. 출석체크 이벤트**
-- 예산: 8만원 ~ 15만원
-- 가성비 등급: A (15.0점)
-- 난이도: ⭐⭐ (2/5)
-- 추천점수: 7.8/10
-- 예상 ROI: 1,875%
-- 예상 효과:
- - 재방문율 +280%
- - 고객 충성도 +150%
- - 참여율 +65%
-- 태그: #디지털 #앱필요 #중기간
-
-**4. 룰렛 이벤트**
-- 예산: 10만원 ~ 20만원
-- 가성비 등급: B (12.5점)
-- 난이도: ⭐⭐ (2/5)
-- 추천점수: 7.5/10
-- 예상 ROI: 1,250%
-- 예상 효과:
- - 참여율 +200%
- - 재미 요소로 공유율 +180%
- - 신규 고객 +90%
-- 태그: #디지털 #게이미피케이션 #재미
-
-**5. 친구 초대 이벤트**
-- 예산: 15만원 ~ 30만원
-- 가성비 등급: B (10.0점)
-- 난이도: ⭐⭐⭐ (3/5)
-- 추천점수: 7.2/10
-- 예상 ROI: 1,000%
-- 예상 효과:
- - 신규 고객 +250%
- - 바이럴 효과 +300%
- - 고객 확보 비용 -40%
-- 태그: #디지털 #바이럴 #신규고객
-
-**6. 리뷰 작성 이벤트**
-- 예산: 12만원 ~ 25만원
-- 가성비 등급: C (8.3점)
-- 난이도: ⭐⭐⭐ (3/5)
-- 추천점수: 6.9/10
-- 예상 ROI: 833%
-- 예상 효과:
- - 리뷰 수 +400%
- - 신뢰도 +120%
- - 검색 노출 +80%
-- 태그: #디지털 #신뢰구축 #장기전략
-
-**7. 포토 콘테스트**
-- 예산: 20만원 ~ 50만원
-- 가성비 등급: C (5.0점)
-- 난이도: ⭐⭐⭐⭐ (4/5)
-- 추천점수: 6.5/10
-- 예상 ROI: 500%
-- 예상 효과:
- - UGC 콘텐츠 +500%
- - SNS 노출 +250%
- - 브랜드 이미지 +150%
-- 태그: #디지털 #SNS #고예산 #장기전략
-
-**가성비 등급 기준**
-- **S등급**: 20점 이상 (최고 가성비)
-- **A등급**: 15~19점 (매우 높은 가성비)
-- **B등급**: 10~14점 (높은 가성비)
-- **C등급**: 5~9점 (보통 가성비)
-- **D등급**: 5점 미만 (낮은 가성비)
-
-**인터랙션**
-1. **정렬 기능**:
- - 드롭다운 메뉴: 가성비순, 추천순, 난이도순, ROI순
- - 선택 시 카드 순서 즉시 재정렬 (애니메이션 0.3초)
- - 현재 정렬 기준 헤더에 표시
-
-2. **태그 필터링**:
- - 태그 칩 탭으로 필터 활성화/비활성화
- - 선택된 태그는 Primary Color 배경
- - 여러 태그 동시 선택 가능 (OR 조건)
- - 필터링 시 매칭되는 카드만 표시 (페이드 애니메이션)
-
-3. **카드 인터랙션**:
- - 카드 전체 탭 시 해당 이벤트 유형의 상세 정보 화면(06-2)으로 이동
- - "자세히 보기" 버튼 탭 시 상세 정보 화면으로 이동
- - 호버 시 카드 살짝 확대 효과 (스케일 1.02)
- - 스크롤 시 무한 스크롤 (7개 전체 로드)
-
-4. **AI 분석 프로세스**:
- - 이전 화면(05)에서 선택한 목적 기반 추천
- - 매장 업종, 지역, 시즌 정보 반영
- - 로딩: 스켈레톤 UI 표시 (1-2초)
- - 분석 완료 후 카드 순차 페이드인 (각 0.1초 간격)
-
-5. **트렌드 분석 보기** (옵션):
- - 우측 상단 "📊 트렌드 분석" 버튼
- - 탭 시 AI 트렌드 분석 결과 모달/바텀 시트 표시
- - 현재 계절, 업종별 트렌드 정보 제공
-
-**접근성**
-- 각 카드에 role="article" 속성
-- aria-label: "SNS 해시태그 이벤트, 가성비 S등급, 예상 ROI 1700%"
-- 키보드: Tab으로 카드 탐색, Enter로 상세 보기
-- 스크린 리더: 이벤트명, 가성비, 예산, 효과 순서로 읽기
-- 색맹 고려: 등급 표시에 색상 + 문자 병행 (S/A/B/C/D)
-
-**성능**
-- 초기 로딩 < 2초 (AI 추천 포함)
-- 카드 렌더링: 가상 스크롤 적용 (메모리 효율화)
-- 이미지 없이 아이콘/이모지만 사용 (빠른 렌더링)
-- 정렬/필터링 즉시 반영 (< 0.3초)
-- 다음 화면(상세 정보) 프리페치
-
-**AI 추천 로직**
-- 입력: 선택한 목적, 매장 업종, 지역, 계절, 예산 범위
-- Claude API 활용: 7가지 이벤트 유형 추천
-- 가성비 점수 계산: (예상 효과 / 예상 비용) × 가중치
-- 난이도 평가: 준비 시간, 기술 요구사항, 복잡도
-- ROI 예측: 동일 업종 과거 데이터 기반
-
----
-
-#### 06-1-AI트렌드분석결과
-
-**개요**
-- **목적**: AI가 분석한 업종/지역/시즌 트렌드 제시
-- **관련 유저스토리**: UFR-PLAN-020
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 5단계 AI 분석 프로세스 시각화 (로딩 애니메이션)
-2. 업종, 지역, 시즌 기반 맞춤형 트렌드 분석
-3. 주요 트렌드 3-5가지 카드 형태로 제시
-4. 트렌드별 추천 이벤트 전략 제시
-5. 분석 완료 후 자동으로 다음 단계 진행
-
-**UI 구성요소**
-
-**모바일 - 분석 진행 중**
-```
-┌─────────────────────────┐
-│ AI 트렌드 분석 │
-├─────────────────────────┤
-│ │
-│ 🤖 │
-│ AI가 분석중입니다 │
-│ │
-│ ━━━━━━━━●━━━━━━━━━━━ │
-│ 60% │
-│ │
-│ 시즌 패턴 학습 중... │
-│ │
-│ 분석 단계: │
-│ ✅ 업종 데이터 수집 │
-│ ✅ 지역 트렌드 분석 │
-│ 🔄 시즌 패턴 학습 │
-│ ⏳ 최적 전략 계산 │
-│ ⏳ 분석 완료 │
-│ │
-└─────────────────────────┘
-```
-
-**모바일 - 분석 완료 후**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 트렌드 분석 │
-├─────────────────────────┤
-│ │
-│ 📊 분석 결과 │
-│ │
-│ 매장: 수원 왕갈비통닭 │
-│ 업종: 치킨 전문점 │
-│ 지역: 수원시 팔달구 │
-│ 시즌: 겨울 (12월) │
-│ │
-│ 주요 트렌드 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 1️⃣ 연말 모임 증가 ││
-│ │ ││
-│ │ 💡 추천 전략 ││
-│ │ 단체 할인 이벤트 효과││
-│ │ 적, 회식/송년회 수요││
-│ │ 급증으로 단체 예약 ││
-│ │ 고객 공략 필요 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 2️⃣ 배달 주문 급증 ││
-│ │ ││
-│ │ 💡 추천 전략 ││
-│ │ 배달 경품 추천, 배달││
-│ │ 전용 할인 쿠폰 이벤트││
-│ │ 효과적 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 3️⃣ SNS 공유 활발 ││
-│ │ ││
-│ │ 💡 추천 전략 ││
-│ │ 바이럴 참여방법 권장,││
-│ │ 해시태그 이벤트로 ││
-│ │ 노출 극대화 ││
-│ └─────────────────────┘│
-│ │
-│ 예상 성공률: 78% 🎯 │
-│ (동일 업종 평균 대비) │
-│ │
-├─────────────────────────┤
-│ [이벤트 유형 선택하기] │
-└─────────────────────────┘
-```
-
-**5단계 AI 분석 프로세스**
-
-**1단계: 업종 데이터 수집 (0-20%)**
-- 진행 메시지: "업종 데이터 수집 중..."
-- 처리 내용: 선택한 업종의 과거 이벤트 데이터 수집
-- 예상 시간: 0.5-1초
-
-**2단계: 지역 트렌드 분석 (20-40%)**
-- 진행 메시지: "지역 트렌드 분석 중..."
-- 처리 내용: 매장 지역의 인구통계 및 소비 패턴 분석
-- 예상 시간: 0.5-1초
-
-**3단계: 시즌 패턴 학습 (40-60%)**
-- 진행 메시지: "시즌 패턴 학습 중..."
-- 처리 내용: 현재 계절/월의 소비 트렌드 패턴 분석
-- 예상 시간: 1-2초
-
-**4단계: 최적 전략 계산 (60-80%)**
-- 진행 메시지: "최적 전략 계산 중..."
-- 처리 내용: AI가 최적의 이벤트 전략 도출
-- 예상 시간: 1-2초
-
-**5단계: 분석 완료 (80-100%)**
-- 진행 메시지: "분석 완료!"
-- 처리 내용: 결과 데이터 구조화 및 UI 렌더링 준비
-- 예상 시간: 0.5초
-
-**업종별 트렌드 예시**
-
-**치킨 전문점 (겨울)**
-1. 연말 모임 증가 → 단체 할인 이벤트 효과적
-2. 배달 주문 급증 → 배달 경품 추천
-3. SNS 공유 활발 → 바이럴 참여방법 권장
-
-**카페 (여름)**
-1. 아이스 음료 선호 → 시즌 메뉴 할인
-2. 학생 고객 증가 → 학생 할인 이벤트
-3. 포토존 수요 → 인스타그램 해시태그 이벤트
-
-**미용실 (봄)**
-1. 졸업/입학 시즌 → 패키지 할인
-2. 웨딩 성수기 → 신부 메이크업 특가
-3. 새학기 이미지 변신 → SNS 공유 이벤트
-
-**인터랙션**
-1. **AI 분석 진행 중**:
- - 5단계 프로그레스 바 애니메이션 (0% → 100%)
- - 각 단계별 진행 메시지 실시간 업데이트
- - 체크마크(✅)/진행중(🔄)/대기중(⏳) 아이콘 변경
- - 부드러운 로딩 애니메이션 (펄스 효과)
- - 총 소요 시간: 3-7초
-
-2. **분석 완료 후**:
- - 결과 카드 순차 페이드인 애니메이션 (각 0.2초 간격)
- - 매장 정보 먼저 표시 → 트렌드 카드 순차 표시
- - 각 트렌드 카드에 슬라이드업 애니메이션
-
-3. **트렌드 카드 인터랙션**:
- - 각 카드 탭 시 확장되어 상세 설명 표시
- - 호버 시 카드 살짝 확대 (스케일 1.02)
- - 추천 전략 텍스트 강조 표시
-
-4. **다음 단계 진행**:
- - "이벤트 유형 선택하기" 버튼 탭
- - 화면 06(AI이벤트유형추천)으로 이동
- - 분석된 트렌드 정보는 다음 단계로 전달
-
-5. **에러 처리**:
- - 분석 실패 시: "분석에 실패했습니다" 메시지 + [재시도] 버튼
- - 타임아웃 (15초 초과): "분석 시간이 초과되었습니다" + [재시도] 버튼
-
-**접근성**
-- 로딩 진행 상태 aria-live="polite" 속성으로 스크린 리더 알림
-- 프로그레스 바 role="progressbar", aria-valuenow 동적 업데이트
-- 각 트렌드 카드 role="article", aria-label로 내용 요약
-- 키보드: Tab으로 트렌드 카드 탐색, Enter로 확장/축소
-
-**성능**
-- AI 분석 시간: 목표 3-7초 (Claude API 응답 시간 포함)
-- 로딩 애니메이션 60fps 유지
-- 타임아웃 설정: 15초 (초과 시 재시도 옵션)
-- 결과 캐싱: 동일 조건 재분석 시 즉시 표시
-- 다음 화면(이벤트 유형) 프리페치
-
-**AI 분석 로직**
-- 입력: 매장 업종, 지역, 현재 계절/월
-- Claude API 활용: 맞춤형 트렌드 분석 및 전략 추천
-- 분석 범위:
- - 동일 업종 과거 3년 이벤트 데이터
- - 지역 인구통계 및 소비 패턴
- - 계절별/월별 소비 트렌드
- - SNS 언급량 및 키워드 분석
-- 출력: 3-5개 주요 트렌드 + 각 트렌드별 추천 전략
-
----
-
-#### 06-2-이벤트상세정보
-
-**개요**
-- **목적**: 선택한 이벤트 유형의 상세 정보 제공
-- **관련 유저스토리**: UFR-PLAN-020
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. 4개 탭으로 구성된 상세 정보 제공
- - 개요: 이벤트 핵심 정보 및 예상 효과
- - 실행 가이드: 5단계 구현 타임라인
- - 비용 구조: 상세 비용 내역 및 예산 계획
- - 성공 사례: 실제 사례 및 성과 데이터
-2. 탭 전환으로 정보 탐색
-3. 이벤트 유형 선택 또는 돌아가기 기능
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] SNS 해시태그 이벤트│
-├─────────────────────────┤
-│ ┌─────┬─────┬─────┬───┐│
-│ │개요 │실행│비용│성공││
-│ │ │가이드│구조│사례││
-│ └─────┴─────┴─────┴───┘│
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ [탭 1: 개요] │
-│ │
-│ 🎯 이벤트 핵심 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 가성비 [S] ││
-│ │ 난이도 ⭐ (매우 쉬움)││
-│ │ 예산 5만원~10만원 ││
-│ │ 준비기간 1-2일 ││
-│ └─────────────────────┘│
-│ │
-│ 📈 예상 효과 │
-│ • SNS 노출 +400% │
-│ • 신규 고객 +70% │
-│ • 브랜드 인지도 +120% │
-│ │
-│ 💡 이런 분들에게 추천 │
-│ • SNS 마케팅 중요 매장 │
-│ • 저예산 고효율 원하는 │
-│ • 빠른 시작 원하는 │
-│ │
-├─────────────────────────┤
-│ [ 이 이벤트로 진행 ] │
-│ [ 다른 유형 보기 ] │
-└─────────────────────────┘
-```
-
-**탭 1: 개요**
-```
-│ 🎯 이벤트 핵심 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 가성비 등급 [S] ││
-│ │ 난이도 ⭐ (매우 쉬움)││
-│ │ 예상 예산 5만~10만원││
-│ │ 준비 기간 1-2일 ││
-│ │ 운영 기간 1-2주 ││
-│ │ 예상 ROI 1,700% ││
-│ └─────────────────────┘│
-│ │
-│ 📈 예상 효과 │
-│ • SNS 노출 +400% │
-│ • 신규 고객 +70% │
-│ • 브랜드 인지도 +120% │
-│ • 참여율 15-25% │
-│ │
-│ 💡 이런 분들에게 추천 │
-│ • SNS 마케팅이 중요한 │
-│ 매장 │
-│ • 저예산으로 고효율을 │
-│ 원하는 사장님 │
-│ • 빠르게 시작하고 싶은 │
-│ 사장님 │
-│ • 바이럴 효과를 원하는 │
-│ 사장님 │
-│ │
-│ ⚠️ 주의사항 │
-│ • 해시태그 관리 필요 │
-│ • SNS 계정 준비 필수 │
-│ • 참여 검증 시간 소요 │
-```
-
-**탭 2: 실행 가이드**
-```
-│ 📋 5단계 실행 가이드 │
-│ │
-│ ┌─────────────────────┐│
-│ │ [1] 준비 단계 (1-2일)││
-│ │ ││
-│ │ ✓ 이벤트 이미지 제작││
-│ │ (Canva 무료 활용) ││
-│ │ ✓ 해시태그 선정 ││
-│ │ (매장명+이벤트명 ││
-│ │ +지역명) ││
-│ │ ✓ SNS 계정 준비 ││
-│ │ (Instagram/Facebook)││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [2] 런칭 단계 (1일) ││
-│ │ ││
-│ │ ✓ SNS에 이벤트 공지││
-│ │ ✓ 매장 내 포스터 ││
-│ │ 부착 ││
-│ │ ✓ 직원 교육 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [3] 운영 단계 (1-2주)││
-│ │ ││
-│ │ ✓ 참여자 모니터링 ││
-│ │ ✓ 댓글/DM 응답 ││
-│ │ ✓ 중간 결과 공유 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [4] 추첨 단계 (1일) ││
-│ │ ││
-│ │ ✓ 참여자 검증 ││
-│ │ ✓ 랜덤 추첨 ││
-│ │ ✓ 당첨자 발표 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [5] 마무리 (2-3일) ││
-│ │ ││
-│ │ ✓ 경품 지급 ││
-│ │ ✓ 감사 인사 포스팅 ││
-│ │ ✓ 결과 분석 ││
-│ └─────────────────────┘│
-```
-
-**탭 3: 비용 구조**
-```
-│ 💰 상세 비용 내역 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 이벤트 상품 비용 ││
-│ │ 50,000원 (예시) ││
-│ │ ││
-│ │ • 치킨 세트 5개 ││
-│ │ @ 10,000원 ││
-│ │ ││
-│ │ 또는 ││
-│ │ ││
-│ │ • 5,000원 쿠폰 10개││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 홍보 비용 (선택) ││
-│ │ 0 ~ 30,000원 ││
-│ │ ││
-│ │ • SNS 광고 (선택) ││
-│ │ • 포스터 인쇄 (선택)││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 예상 총 비용 ││
-│ │ 50,000 ~ 80,000원 ││
-│ │ ││
-│ │ 예상 참여자 50-100명││
-│ │ 1인당 비용 500-1,600원││
-│ └─────────────────────┘│
-│ │
-│ 💡 비용 절감 팁 │
-│ • Canva로 무료 디자인 │
-│ • 자사 SNS 활용 │
-│ • 고객 태그로 무료 홍보│
-```
-
-**탭 4: 성공 사례**
-```
-│ 🏆 실제 성공 사례 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 수원 왕갈비통닭 ││
-│ │ 치킨 전문점 ││
-│ │ ││
-│ │ 📊 성과 ││
-│ │ • 참여자 127명 ││
-│ │ • 신규 고객 89명 ││
-│ │ • 매출 +43% ││
-│ │ • 팔로워 +312명 ││
-│ │ ││
-│ │ 💬 후기 ││
-│ │ "예산 7만원으로 신규││
-│ │ 고객 89명 확보했어요!││
-│ │ SNS 팔로워도 3배 ││
-│ │ 늘었습니다." ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 부산 떡볶이 천국 ││
-│ │ 분식점 ││
-│ │ ││
-│ │ 📊 성과 ││
-│ │ • 참여자 203명 ││
-│ │ • 신규 고객 145명 ││
-│ │ • 매출 +67% ││
-│ │ • 재방문율 +35% ││
-│ │ ││
-│ │ 💬 후기 ││
-│ │ "학생들 사이에서 입소││
-│ │ 문 나면서 대박났어요!││
-│ │ 비용 대비 효과 최고"││
-│ └─────────────────────┘│
-```
-
-**인터랙션**
-1. **탭 전환**:
- - 탭 버튼 탭 시 해당 컨텐츠로 전환
- - 활성 탭은 하단 언더라인 표시 (Primary Color)
- - 탭 전환 애니메이션: 슬라이드 (0.3초)
- - 스와이프 제스처로도 탭 전환 가능
-
-2. **스크롤 인터랙션**:
- - 각 탭 내용은 독립적으로 스크롤
- - 스크롤 위치는 탭별로 유지
- - 긴 컨텐츠는 페이드 인디케이터로 더보기 힌트
-
-3. **액션 버튼**:
- - "이 이벤트로 진행" 버튼:
- - Primary 버튼 스타일
- - 탭 시 선택한 이벤트 유형 저장
- - 다음 화면(07-AI이벤트상품추천)으로 이동
- - "다른 유형 보기" 버튼:
- - Secondary 버튼 스타일
- - 탭 시 이전 화면(06-AI이벤트유형추천)으로 돌아가기
-
-4. **뒤로가기**:
- - 좌측 상단 뒤로가기 버튼
- - 이전 화면(06-AI이벤트유형추천)으로 이동
- - 선택 상태 유지 (동일 이벤트 하이라이트)
-
-5. **타임라인 인터랙션** (실행 가이드 탭):
- - 각 단계 카드 탭 시 확장되어 추가 상세 정보 표시
- - 완료 체크박스 제공 (준비 진행도 추적)
-
-**접근성**
-- 탭 role="tablist", 각 탭 버튼 role="tab"
-- 탭 패널 role="tabpanel", aria-labelledby로 탭 연결
-- 키보드: 좌우 화살표로 탭 전환, Tab으로 패널 내 탐색
-- 스크린 리더: 현재 탭 위치 알림 (예: "개요 탭, 4개 중 1번째")
-- 고대비 모드: 탭 언더라인 및 버튼 명확히 구분
-
-**성능**
-- 탭 컨텐츠 지연 로딩 (최초 개요 탭만 로드)
-- 탭 전환 시 다음 탭 프리페치
-- 이미지 없이 텍스트 기반 (빠른 렌더링)
-- 애니메이션 하드웨어 가속 (GPU 사용)
-
-**콘텐츠 커스터마이징**
-- 이벤트 유형별로 4개 탭 모두 커스터마이징
-- Claude API 활용: 매장 업종 맞춤형 콘텐츠 생성
-- 성공 사례는 동일 업종 우선 표시
-- 비용 구조는 예산 범위 기반 자동 계산
-
-**7가지 이벤트 유형별 핵심 정보**
-
-모든 이벤트 유형에 대해 동일한 4개 탭 구조로 정보 제공:
-1. SNS 해시태그 이벤트
-2. 명함형 쿠폰 배포
-3. 출석체크 이벤트
-4. 룰렛 이벤트
-5. 친구 초대 이벤트
-6. 리뷰 작성 이벤트
-7. 포토 콘테스트
-
-각 유형별 차별화 정보:
-- 준비 기간 및 난이도
-- 필요한 도구/플랫폼
-- 예상 참여율 및 효과
-- 비용 구조 및 절감 방법
-- 실제 성공 사례 (동일 업종 우선)
-
----
-
-#### 07-AI이벤트상품추천
-
-**개요**
-- **목적**: 예산 대비 최적 이벤트상품 AI 추천 및 진행 방법 선택
-- **관련 유저스토리**: UFR-PLAN-030
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. 예산 입력
-2. 이벤트 진행 방법 선택 (추첨형 / 선착순형)
-3. AI가 Top 5 이벤트상품 추천
-4. 이벤트상품 선택 및 수정 가능
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 이벤트상품 추천│
-├─────────────────────────┤
-│ 단계 3/6: 이벤트상품 선택 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 예산 설정 │
-│ ┌─────────────────────┐│
-│ │ 100,000원 ││
-│ │ [슬라이더] ││
-│ │ 1만원 ━━●━━ 500만원││
-│ └─────────────────────┘│
-│ │
-│ 이벤트 진행 방법 * │
-│ ┌─────────────────────┐│
-│ │ ○ 추첨형 ││
-│ │ 기간 내 참여 후 ││
-│ │ 종료 시 자동 추첨 ││
-│ └─────────────────────┘│
-│ ┌─────────────────────┐│
-│ │ ○ 선착순형 ││
-│ │ 선착순 쿠폰 소진 방식││
-│ │ (소진 시 자동 종료) ││
-│ └─────────────────────┘│
-│ │
-│ 🤖 AI 추천 이벤트상품 │
-│ (Top 5) │
-│ │
-│ ┌─────────────────────┐│
-│ │ 1. 치킨세트 무료교환 ││
-│ │ 매력도: ⭐⭐⭐⭐⭐││
-│ │ 예상참여율: 45% ││
-│ │ [선택] [수정] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 2. 5천원 할인쿠폰 ││
-│ │ 매력도: ⭐⭐⭐⭐ ││
-│ │ 예상참여율: 38% ││
-│ │ [선택] [수정] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 3. KT 멤버십 포인트 ││
-│ │ 매력도: ⭐⭐⭐ ││
-│ │ 예상참여율: 32% ││
-│ │ [선택] [수정] ││
-│ └─────────────────────┘│
-│ │
-│ ... (스크롤) │
-│ │
-│ [+ 직접 입력하기] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (참여방법) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **예산 슬라이더**: 실시간 이벤트상품 추천 업데이트
-2. **진행 방법 선택**: 라디오 버튼으로 추첨형/선착순형 선택
- - 추첨형: 이벤트 종료 시 자동 추첨 안내 툴팁
- - 선착순형: 쿠폰 소진 시 자동 종료 안내 툴팁
-3. **이벤트상품 수정**: 바텀 시트로 이벤트상품명, 수량, 가격 수정
-4. **직접 입력**: 새 이벤트상품 추가 폼 표시
-5. **선택 시**: 카드 하이라이트, 예상 효과 재계산
-
-**검증**
-- 진행 방법 미선택 시 경고: "이벤트 진행 방법을 선택해주세요"
-- 예산 초과 시 경고 메시지
-- 이벤트상품 수정 시 실시간 예상참여율 재계산
-- 선착순형 선택 시 쿠폰 소진 시점 자동 종료 안내
-
-**진행 방법별 차이점**
-- **추첨형**: 기간 내 참여한 고객 중 이벤트 종료 시 상품 수량 내에서 당첨자 랜덤 추첨
-- **선착순형**: 선착순 쿠폰 소진 방식 (예: 50명 한정, 소진 시 자동 종료)
-
----
-
-#### 06-AI참여방법설계
-
-**개요**
-- **목적**: 간단하면서도 재방문을 유도하는 참여 방법 AI 제안
-- **관련 유저스토리**: UFR-PLAN-040
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. 3가지 참여 방법 옵션 제시
-2. 각 옵션별 난이도 및 예상 참여율 표시
-3. 1개 선택
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 참여방법 설계│
-├─────────────────────────┤
-│ 단계 4/6: 참여방법 선택 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 🤖 AI 추천 참여방법 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 옵션 1: 간편형 ││
-│ │ 📱 QR 코드 스캔 ││
-│ │ ││
-│ │ 난이도: ⭐ (쉬움) ││
-│ │ 예상참여율: 60% ││
-│ │ 재방문율: 20% ││
-│ │ ││
-│ │ ✓ 빠른 참여 ││
-│ │ ✓ 매장 방문 불필요 ││
-│ │ [선택하기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 옵션 2: 재방문 유도형││
-│ │ 🏪 매장 방문 + 리뷰 ││
-│ │ ││
-│ │ 난이도: ⭐⭐ (보통) ││
-│ │ 예상참여율: 35% ││
-│ │ 재방문율: 80% ││
-│ │ ││
-│ │ ✓ 높은 재방문율 ││
-│ │ ✓ 리뷰 축적 ││
-│ │ [선택하기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 옵션 3: 바이럴형 ││
-│ │ 📢 SNS 공유 + 태그 ││
-│ │ ││
-│ │ 난이도: ⭐⭐⭐ ││
-│ │ 예상참여율: 25% ││
-│ │ 바이럴 확산: 150% ││
-│ │ ││
-│ │ ✓ 입소문 효과 ││
-│ │ ✓ 신규고객 유입 ││
-│ │ [선택하기] ││
-│ └─────────────────────┘│
-│ │
-├─────────────────────────┤
-│ [ 다음 (홍보문구) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 옵션 카드 탭 시 상세 설명 확장
-- 선택 시 카드 하이라이트 및 체크마크 표시
-- 옵션 간 비교를 위한 나란히 보기 모드 제공
-
----
-
-#### 07-AI홍보문구생성
-
-**개요**
-- **목적**: GPT-4 기반 홍보 문구 및 해시태그 자동 생성
-- **관련 유저스토리**: UFR-PLAN-050
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 5개 버전 홍보 문구 생성
-2. SNS 해시태그 자동 생성
-3. 플랫폼별 최적화 (Instagram, Blog, Kakao)
-4. 선택 및 편집 가능
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 홍보문구 생성│
-├─────────────────────────┤
-│ 단계 5/6: 홍보문구 선택 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 🤖 AI가 생성중입니다... │
-│ [프로그레스 바] │
-│ │
-│ (생성 완료 후) │
-│ │
-│ 📝 생성된 홍보 문구 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 버전 1: 친근한 톤 ││
-│ │ ─────────────────── ││
-│ │ "🎉 연말 대박 이벤트!││
-│ │ 수원 왕갈비통닭에서 ││
-│ │ 치킨세트를 공짜로! ││
-│ │ 지금 바로 참여하세요"││
-│ │ ││
-│ │ 해시태그: #수원맛집 ││
-│ │ #치킨이벤트 #연말특가││
-│ │ ││
-│ │ [선택] [편집] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 버전 2: 공식적인 톤 ││
-│ │ ─────────────────── ││
-│ │ "왕갈비통닭 12월 ││
-│ │ 프로모션을 시작합니다││
-│ │ 선착순 100명에게 ││
-│ │ 치킨세트 무료 증정" ││
-│ │ ││
-│ │ [선택] [편집] ││
-│ └─────────────────────┘│
-│ │
-│ ... (스크롤로 5개) │
-│ │
-│ [🔄 다시 생성하기] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (최종확인) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **생성 과정**: 로딩 애니메이션 + 진행 상태 (13초 이내)
-2. **편집**: 바텀 시트로 텍스트 편집기 표시
-3. **미리보기**: 플랫폼별 미리보기 (Instagram 피드, 블로그 등)
-4. **다시 생성**: 새로운 5개 문구 생성 (다른 톤앤매너)
-
-**성능**
-- AI 생성 시간: 목표 13초 이내
-- 편집 실시간 반영
-
----
-
-#### 08-이벤트기획안승인
-
-**개요**
-- **목적**: 완성된 기획안 최종 검토 및 승인
-- **관련 유저스토리**: UFR-PLAN-060
-- **비즈니스 중요도**: Must (M/5)
-
-**주요 기능**
-1. 전체 기획안 요약 제시
-2. 예상 예산 및 효과 표시
-3. 승인 또는 이전 단계 수정
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 기획안 최종확인 │
-├─────────────────────────┤
-│ 단계 6/6: 기획안 승인 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ ✅ 기획 완료! │
-│ │
-│ ┌─────────────────────┐│
-│ │ 📋 기획안 요약 ││
-│ │ ││
-│ │ 목적: 신규고객 유치 ││
-│ │ 경품: 치킨세트 무료 ││
-│ │ 참여: QR코드 스캔 ││
-│ │ 홍보: "🎉 연말..." ││
-│ │ ││
-│ │ [수정하기 ✏️] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 💰 예상 비용 ││
-│ │ ││
-│ │ 경품 비용: 100,000원││
-│ │ 플랫폼 비용: 무료 ││
-│ │ ────────────────── ││
-│ │ 총 예산: 100,000원 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 📈 예상 효과 ││
-│ │ ││
-│ │ 참여율: 60% ││
-│ │ 예상참여자: ~180명 ││
-│ │ 광고수익률: 240% ││
-│ └─────────────────────┘│
-│ │
-│ ⏱ 전체 소요시간: 8초 │
-│ │
-├─────────────────────────┤
-│ [← 이전] [승인하기 ✓] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 각 섹션 탭 시 해당 단계로 이동하여 수정 가능
-- 승인 시 확인 다이얼로그 표시
-- 승인 완료 후 콘텐츠 생성 단계로 자동 이동
-
-**성능**
-- 전체 기획 과정: 목표 10초 이내 완료 (AI 처리 포함)
-
----
-
-### 4.3 Content Generation Service
-
----
-
-#### 09-AI이미지생성
-
-**개요**
-- **목적**: 브랜드 컬러/로고 반영한 이미지 3종 AI 생성
-- **관련 유저스토리**: UFR-CONT-010
-- **비즈니스 중요도**: Must (M/34)
-
-**주요 기능**
-1. 브랜드 컬러 선택 또는 입력
-2. 로고 이미지 업로드
-3. Stable Diffusion으로 3가지 스타일 이미지 생성
-4. 미리보기 및 다운로드
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 이미지 생성 │
-├─────────────────────────┤
-│ 콘텐츠 1/5: 이미지 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 브랜드 설정 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 브랜드 컬러 ││
-│ │ [🎨] #FF5733 ││
-│ │ (컬러 피커) ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 로고 업로드 ││
-│ │ [📷 이미지 선택] ││
-│ │ (미리보기) ││
-│ └─────────────────────┘│
-│ │
-│ [AI 이미지 생성 시작] │
-│ │
-│ (생성 중) │
-│ 🤖 AI가 이미지 생성중...│
-│ ▓▓▓▓░░░░░░ 40% │
-│ 예상 소요: 2분 30초 │
-│ │
-│ (생성 완료 후) │
-│ │
-│ 생성된 이미지 (3종) │
-│ │
-│ ┌────┐ ┌────┐ ┌────┐ │
-│ │심플││화려││트렌││ │
-│ │ ││ ││디 ││ │
-│ │ ○ ││ ● ││ ○ ││ │
-│ └────┘ └────┘ └────┘ │
-│ │
-│ [다운로드] [다시생성] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (영상제작) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **브랜드 컬러**: 컬러 피커 또는 HEX 코드 직접 입력
-2. **로고 업로드**: 카메라/갤러리 선택, 최대 5MB
-3. **생성 진행**: 실시간 진행률 표시 (2-3분)
-4. **이미지 선택**: 탭하여 확대, 스와이프로 비교
-5. **다운로드**: 선택한 이미지 저장
-
-**성능**
-- AI 이미지 생성: 목표 2-3분 이내
-- 백그라운드 처리로 다른 작업 가능 (알림으로 완료 통지)
-
----
-
-#### 10-AI영상제작
-
-**개요**
-- **목적**: 15초 분량의 홍보 영상 AI 제작 (SNS 및 우리동네TV용)
-- **관련 유저스토리**: UFR-CONT-020
-- **비즈니스 중요도**: Must (M/34)
-
-**주요 기능**
-1. 배경 음악 선택
-2. 텍스트 오버레이 편집
-3. 우리동네TV용 해상도 선택 (1920x1080, 16:9)
-4. 15초 영상 자동 제작
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] AI 영상 제작 │
-├─────────────────────────┤
-│ 콘텐츠 2/5: 영상 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 영상 설정 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 배경 음악 ││
-│ │ [▶️ 경쾌한 음악 1] ││
-│ │ [ 신나는 음악 2] ││
-│ │ [ 차분한 음악 3] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 텍스트 오버레이 ││
-│ │ "🎉 연말 대박..." ││
-│ │ [편집하기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 해상도 선택 ││
-│ │ ☑ SNS용 (1080x1080) ││
-│ │ ☑ 우리동네TV ││
-│ │ (1920x1080, 16:9) ││
-│ └─────────────────────┘│
-│ │
-│ [AI 영상 제작 시작] │
-│ │
-│ (제작 중) │
-│ 🎬 AI가 영상 제작중... │
-│ ▓▓▓▓▓░░░░░ 50% │
-│ 예상 소요: 3분 │
-│ │
-│ (완료 후) │
-│ ┌─────────────────────┐│
-│ │ [▶️ 15초 미리보기] ││
-│ │ ─────────────────── ││
-│ │ SNS용, 우리동네TV용 ││
-│ │ 영상 각 1개 생성완료 ││
-│ └─────────────────────┘│
-│ │
-│ [다운로드] [다시제작] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (SNS콘텐츠) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **배경 음악**: 재생 버튼으로 미리듣기
-2. **텍스트 편집**: 바텀 시트로 텍스트, 폰트, 위치 조정
-3. **제작 진행**: 실시간 진행률 + 예상 소요 시간 (3-5분)
-4. **미리보기**: 전체 화면으로 재생, 재생/일시정지 컨트롤
-
-**성능**
-- AI 영상 제작: 목표 3-5분 이내
-- 백그라운드 처리 + 푸시 알림
-
----
-
-#### 12-SNS콘텐츠생성
-
-**개요**
-- **목적**: Instagram, Naver Blog, Kakao Channel용 최적화 콘텐츠 생성
-- **관련 유저스토리**: UFR-CONT-030
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. SNS 플랫폼 선택 (최소 1개 이상 선택 필수)
-2. 플랫폼별 해상도 자동 조정
-3. 해시태그 자동 삽입
-4. 일괄 다운로드
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] SNS 콘텐츠 생성 │
-├─────────────────────────┤
-│ 콘텐츠 3/5: SNS │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 플랫폼 선택 * │
-│ (최소 1개 이상 선택) │
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ Instagram ││
-│ │ 1080x1080 (정사각형) ││
-│ │ [미리보기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ Naver Blog ││
-│ │ 800x600 (가로형) ││
-│ │ [미리보기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ Kakao Channel ││
-│ │ 800x800 (정사각형) ││
-│ │ [미리보기] ││
-│ └─────────────────────┘│
-│ │
-│ [콘텐츠 생성하기] │
-│ │
-│ (생성 완료 후) │
-│ │
-│ 생성된 콘텐츠 │
-│ │
-│ ┌────┐ ┌────┐ │
-│ │Inst││Blog│ │
-│ │agram││ │ │
-│ └────┘ └────┘ │
-│ │
-│ 게시 텍스트: │
-│ "🎉 연말 대박 이벤트! │
-│ #수원맛집 #치킨이벤트" │
-│ │
-│ [📦 일괄 다운로드] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (QR포스터) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **플랫폼 선택**:
- - 체크박스로 다중 선택 가능 (Instagram, Naver Blog, Kakao Channel 모두 선택 가능)
- - 최소 1개 이상 선택 필수
- - 미선택 시 "콘텐츠 생성하기" 버튼 비활성화 (회색 처리)
-2. **미리보기**: 바텀 시트로 플랫폼별 미리보기 (실제 피드 모습)
-3. **생성**: 선택한 플랫폼 수만큼 최적화 콘텐츠 생성 (30초 이내)
-4. **다운로드**: ZIP 파일로 일괄 다운로드
-
-**검증 규칙**
-- 플랫폼 미선택 시 경고: "최소 1개 이상의 SNS 플랫폼을 선택해주세요"
-- 선택된 플랫폼 개수 표시: "선택됨: 2개 플랫폼"
-
-**성능**
-- SNS 콘텐츠 생성: 30초 이내
-- 미리보기 즉시 로딩
-
----
-
-#### 13-QR포스터생성선택
-
-**개요**
-- **목적**: QR 포스터 생성 여부 선택
-- **관련 유저스토리**: UFR-CONT-040
-- **비즈니스 중요도**: Must (M/8)
-
-**주요 기능**
-1. QR 포스터 생성 여부 선택 (예/아니오)
-2. 선택에 따른 플로우 분기
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] QR 포스터 │
-├─────────────────────────┤
-│ 콘텐츠 4/5: QR 포스터 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ QR 포스터를 생성하시겠습니까? │
-│ │
-│ ┌─────────────────────┐│
-│ │ 📄 ││
-│ │ QR 코드 포함 ││
-│ │ 인쇄용 포스터 ││
-│ │ ││
-│ │ • A4/A3 크기 선택 ││
-│ │ • PDF 다운로드 ││
-│ │ • 즉시 인쇄 가능 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [ 예, 생성합니다 ] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ [ 아니오, 건너뜁니다 ] ││
-│ └─────────────────────┘│
-│ │
-├─────────────────────────┤
-│ "건너뜁니다" 선택 시: │
-│ [ 다음 (콘텐츠편집) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **예 선택**: Screen 14 (QR포스터상세설정) 화면으로 이동
-2. **아니오 선택**: QR 포스터 단계 건너뛰고 Screen 15 (콘텐츠편집)로 이동
-3. **뒤로 가기**: 이전 화면(SNS콘텐츠생성)으로 복귀
-
-**검증 규칙**
-- 선택 없이 다음 진행 불가
-- 기본 선택값 없음 (사용자 명시적 선택 필요)
-
----
-
-#### 14-QR포스터상세설정
-
-**개요**
-- **목적**: QR 코드 포함 인쇄용 포스터 상세 설정 및 생성
-- **관련 유저스토리**: UFR-CONT-040
-- **비즈니스 중요도**: Must (M/8)
-
-**주요 기능**
-1. QR 연결 URL 자동 설정
-2. 포스터 크기 선택 (A4/A3)
-3. QR 포스터 PDF 생성
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] QR 포스터 설정 │
-├─────────────────────────┤
-│ 콘텐츠 4/5: QR 포스터 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ QR 코드 설정 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 연결 URL (자동생성) ││
-│ │ ktevnt.co/abc123 ││
-│ │ [📋 복사] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ QR 코드 미리보기 ││
-│ │ ┌────────────────┐ ││
-│ │ │ [QR 이미지] │ ││
-│ │ └────────────────┘ ││
-│ └─────────────────────┘│
-│ │
-│ 포스터 크기 * │
-│ ○ A4 (210x297mm) │
-│ ○ A3 (297x420mm) │
-│ │
-│ [포스터 생성하기] │
-│ │
-│ (생성 완료 후) │
-│ │
-│ ┌─────────────────────┐│
-│ │ 📄 생성된 포스터 ││
-│ │ ││
-│ │ [미리보기 이미지] ││
-│ │ ││
-│ │ A4 PDF: 2.1MB ││
-│ │ QR 이미지: 150KB ││
-│ └─────────────────────┘│
-│ │
-│ [다운로드] [인쇄하기] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (콘텐츠편집) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **URL 복사**: 클립보드 복사 + 토스트 메시지 "URL이 복사되었습니다"
-2. **크기 선택**: 라디오 버튼, 선택 시 미리보기 즉시 업데이트
-3. **생성**: 20초 이내 완료, 진행률 표시
-4. **인쇄**: 시스템 인쇄 다이얼로그 호출
-
-**검증 규칙**
-- 포스터 크기 미선택 시 경고: "포스터 크기를 선택해주세요"
-- 기본값: A4 선택
-
-**성능**
-- QR 포스터 생성: 20초 이내
-- PDF 파일 크기 최적화 (<5MB)
-- QR 코드 자동 생성: 즉시
-
----
-
-#### 15-콘텐츠편집
-
-**개요**
-- **목적**: 생성된 콘텐츠 간단 수정
-- **관련 유저스토리**: UFR-CONT-050
-- **비즈니스 중요도**: Should (S/13)
-
-**주요 기능**
-1. 이미지/영상 텍스트 수정
-2. 색상 조정
-3. 편집 이력 관리 (최대 3개 버전)
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 콘텐츠 편집 │
-├─────────────────────────┤
-│ 콘텐츠 편집 (선택) │
-│ │
-│ 편집할 콘텐츠 선택 │
-│ │
-│ ┌────┐ ┌────┐ ┌────┐ │
-│ │이미││영상││SNS ││ │
-│ │지 ││ ││ ││ │
-│ └────┘ └────┘ └────┘ │
-│ │
-│ (이미지 편집 예시) │
-│ │
-│ ┌─────────────────────┐│
-│ │ [이미지 미리보기] ││
-│ │ ││
-│ │ 텍스트: "🎉..." ││
-│ │ [편집] ││
-│ └─────────────────────┘│
-│ │
-│ 편집 도구 │
-│ [T 텍스트] [🎨 색상] │
-│ [↔️ 크기] [📐 위치] │
-│ │
-│ 편집 이력 │
-│ • 원본 │
-│ • 버전 1 (현재) │
-│ [원본으로 되돌리기] │
-│ │
-├─────────────────────────┤
-│ [취소] [저장하기] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **콘텐츠 선택**: 카드 탭으로 선택
-2. **텍스트 편집**: 바텀 시트로 텍스트 에디터
-3. **색상 조정**: 컬러 피커
-4. **실시간 미리보기**: 편집 사항 즉시 반영
-5. **되돌리기**: 이전 버전으로 복원
-
-**성능**
-- 편집 실시간 반영
-- 최대 3개 버전 관리
-
----
-
-#### 14-콘텐츠최종승인
-
-**개요**
-- **목적**: 완성된 콘텐츠 최종 검토 및 승인
-- **관련 유저스토리**: UFR-CONT-060
-- **비즈니스 중요도**: Must (M/3)
-
-**주요 기능**
-1. 전체 콘텐츠 미리보기
-2. 승인 또는 이전 단계 수정
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 콘텐츠 최종확인 │
-├─────────────────────────┤
-│ 콘텐츠 5/5: 최종 승인 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ ✅ 콘텐츠 생성 완료! │
-│ │
-│ 생성된 콘텐츠 (갤러리) │
-│ │
-│ ┌────┐ ┌────┐ ┌────┐ │
-│ │이미││이미││이미││ │
-│ │지1 ││지2 ││지3 ││ │
-│ └────┘ └────┘ └────┘ │
-│ │
-│ ┌────┐ ┌────┐ │
-│ │15초││SNS ││ │
-│ │영상││세트││ │
-│ └────┘ └────┘ │
-│ │
-│ ┌────┐ │
-│ │QR ││ │
-│ │포스││ │
-│ │터 ││ │
-│ └────┘ │
-│ │
-│ [📦 전체 다운로드] │
-│ │
-│ ⏱ 콘텐츠 생성시간: 7분 │
-│ (목표: 5-8분 이내) │
-│ │
-├─────────────────────────┤
-│ [← 수정] [승인하기 ✓] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 각 콘텐츠 탭 시 전체 화면 미리보기
-- 승인 시 확인 다이얼로그
-- 승인 완료 후 배포 단계로 자동 이동
-
-**성능**
-- 전체 콘텐츠 생성: 목표 5-8분 이내
-
----
-
-### 4.4 Distribution Service
-
----
-
-#### 15-배포채널선택
-
-**개요**
-- **목적**: 다중 채널 배포 설정
-- **관련 유저스토리**: UFR-DIST-010
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 배포 채널 선택 (다중 선택)
-2. 즉시 배포 또는 예약 배포
-3. 채널별 개별 설정
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 배포 채널 선택 │
-├─────────────────────────┤
-│ 배포 1/3: 채널 선택 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ KT 채널 │
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ 우리동네TV ││
-│ │ 지역 주변 노출 ││
-│ │ [설정 >] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ 링고비즈 연결음 ││
-│ │ 매장 전화 연결음 ││
-│ │ [설정 >] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ 지니TV 광고 ││
-│ │ TV 광고 송출 ││
-│ │ [설정 >] ││
-│ └─────────────────────┘│
-│ │
-│ SNS 채널 │
-│ │
-│ ┌─────────────────────┐│
-│ │ ✅ Instagram (필수) ││
-│ │ [계정 연동 ✓] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ Naver Blog ││
-│ │ [계정 연동하기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ☐ Kakao Channel ││
-│ │ [계정 연동하기] ││
-│ └─────────────────────┘│
-│ │
-│ 배포 시간 │
-│ ○ 즉시 배포 │
-│ ○ 예약 배포 │
-│ [날짜/시간 선택] │
-│ │
-├─────────────────────────┤
-│ [ 다음 (배포 시작) ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **채널 선택**: 체크박스로 다중 선택
-2. **설정**: 바텀 시트로 채널별 세부 설정 (반경, 시간대, 예산 등)
-3. **계정 연동**: OAuth 인증 플로우
-4. **예약 배포**: 날짜/시간 피커
-
-**성능**
-- 채널 설정 즉시 저장
-- 배포 준비 완료 시 다음 단계 활성화
-
----
-
-#### 16-배포진행상태
-
-**개요**
-- **목적**: 실시간 배포 진행 상황 모니터링
-- **관련 유저스토리**: UFR-DIST-020~050
-- **비즈니스 중요도**: Must (M/47)
-
-**주요 기능**
-1. 채널별 배포 상태 실시간 표시
-2. 배포 실패 시 자동 재시도 (3회)
-3. 실패 시 알림 및 수동 재시도 옵션
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 배포 진행 중 │
-├─────────────────────────┤
-│ 배포 2/3: 진행 상태 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ 배포 진행 중... 🚀 │
-│ │
-│ ┌─────────────────────┐│
-│ │ ✅ Instagram ││
-│ │ 배포 완료 (3초) ││
-│ │ [게시물 보기] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 🔄 우리동네TV ││
-│ │ 배포 중... (15초) ││
-│ │ ▓▓▓▓░░░░░░ 40% ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ⏳ 지니TV ││
-│ │ 대기 중... ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ ❌ Naver Blog ││
-│ │ 배포 실패 (재시도중) ││
-│ │ 1/3 재시도 ││
-│ │ [수동 재시도] ││
-│ └─────────────────────┘│
-│ │
-│ 전체 진행률: 50% │
-│ 예상 소요: 45초 남음 │
-│ │
-│ [취소] [새로고침] │
-│ │
-├─────────────────────────┤
-│ (배포 완료 시) │
-│ [다음 (완료 화면) ✓] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **실시간 업데이트**: 5초 간격 자동 새로고침
-2. **게시물 보기**: 외부 링크로 실제 게시물 확인
-3. **수동 재시도**: 실패한 채널 개별 재시도
-4. **취소**: 진행 중인 배포 중단 (확인 다이얼로그)
-
-**성능**
-- 전체 배포: 목표 1분 이내
-- 병렬 배포로 시간 단축
-
----
-
-#### 17-오프라인자료다운로드
-
-**개요**
-- **목적**: QR 포스터 및 인쇄용 자료 다운로드
-- **관련 유저스토리**: UFR-DIST-060
-- **비즈니스 중요도**: Should (S/5)
-
-**주요 기능**
-1. QR 포스터 (A4/A3 PDF)
-2. QR 코드 이미지 (PNG)
-3. 고해상도 이미지
-4. 일괄 다운로드 (ZIP)
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 오프라인 자료 │
-├─────────────────────────┤
-│ 배포 3/3: 자료 다운로드 │
-│ ━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ ✅ 배포 완료! │
-│ │
-│ 오프라인 홍보 자료 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 📄 QR 포스터 (A4) ││
-│ │ 2.1MB PDF ││
-│ │ [다운로드] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 📄 QR 포스터 (A3) ││
-│ │ 4.5MB PDF ││
-│ │ [다운로드] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 📷 QR 코드 이미지 ││
-│ │ 150KB PNG ││
-│ │ [다운로드] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 🖼️ 고해상도 이미지 ││
-│ │ 5.2MB (300dpi) ││
-│ │ [다운로드] ││
-│ └─────────────────────┘│
-│ │
-│ [📦 전체 다운로드 (ZIP)]│
-│ │
-│ 다운로드 이력 │
-│ • 2025-01-20 15:30 │
-│ │
-├─────────────────────────┤
-│ [ 홈으로 이동하기 ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 개별 다운로드: 파일 저장 다이얼로그
-- 전체 다운로드: ZIP 파일로 압축 다운로드
-- 다운로드 이력: 이전 다운로드 기록 표시
-
----
-
-### 4.5 Participation Service (고객용)
-
----
-
-#### 18-이벤트참여
-
-**개요**
-- **목적**: 고객의 간편한 이벤트 참여
-- **관련 유저스토리**: UFR-PART-010
-- **비즈니스 중요도**: Must (M/8)
-
-**주요 기능**
-1. 이름, 전화번호 입력
-2. 참여 경로 자동 추적
-3. 개인정보 수집 동의
-4. 중복 참여 방지
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ 🎉 수원 왕갈비통닭 │
-│ 연말 대박 이벤트! │
-├─────────────────────────┤
-│ │
-│ 경품: 치킨세트 무료교환 │
-│ 당첨인원: 100명 │
-│ 기간: ~2025-12-31 │
-│ │
-│ 참여방법 │
-│ 1. 매장 방문 │
-│ 2. QR 코드 스캔 │
-│ 3. 정보 입력 │
-│ │
-│ ───────────────────── │
-│ │
-│ 참여 신청 │
-│ │
-│ [이름 입력] │
-│ │
-│ [전화번호] │
-│ 010-XXXX-XXXX │
-│ │
-│ 참여 경로 (자동 감지) │
-│ 📍 QR 코드 스캔 │
-│ │
-│ ☑ 개인정보 수집 동의 │
-│ (필수) [자세히] │
-│ │
-│ ───────────────────── │
-│ │
-│ 💡 매장 방문 고객은 │
-│ 당첨 확률 UP! 🎁 │
-│ │
-├─────────────────────────┤
-│ [ 참여하기 ] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **자동 입력**: 참여 경로 자동 감지 (QR/SNS/TV)
-2. **실시간 검증**: 전화번호 형식 체크
-3. **중복 체크**: 제출 시 중복 참여 확인
-4. **에러 처리**:
- - 중복: "이미 참여하셨습니다 (참여일시 표시)"
- - 기타: 명확한 오류 메시지
-
-**접근성**
-- 큰 터치 영역 (44x44px 이상)
-- 명확한 라벨과 에러 메시지
-- 고대비 색상
-
----
-
-#### 19-참여완료
-
-**개요**
-- **목적**: 참여 완료 확인 및 응모번호 발급
-- **관련 유저스토리**: UFR-PART-010
-- **비즈니스 중요도**: Must (M/8)
-
-**주요 기능**
-1. 응모번호 자동 발급
-2. 당첨 발표일 안내
-3. 매장 정보 표시
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ✅ 참여 완료! │
-├─────────────────────────┤
-│ │
-│ 🎉 🎁 🎉 │
-│ │
-│ 이벤트 참여가 완료 │
-│ 되었습니다! │
-│ │
-│ ┌─────────────────────┐│
-│ │ 응모번호 ││
-│ │ ││
-│ │ A-12345678 ││
-│ │ ││
-│ │ [📋 복사하기] ││
-│ └─────────────────────┘│
-│ │
-│ 당첨 발표일 │
-│ 📅 2025-12-31 │
-│ │
-│ 당첨 시 입력하신 전화번호│
-│ 로 SMS/알림톡 발송됩니다│
-│ │
-│ ───────────────────── │
-│ │
-│ 매장 정보 │
-│ 📍 수원 왕갈비통닭 │
-│ 🏪 경기도 수원시... │
-│ ☎️ 031-XXX-XXXX │
-│ │
-│ [매장 위치 보기] │
-│ │
-│ ───────────────────── │
-│ │
-│ 💬 친구에게 공유하기 │
-│ [Instagram] [Kakao] │
-│ │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 응모번호 복사: 클립보드 복사 + 토스트
-- 위치 보기: 지도 앱 연동
-- 공유하기: SNS 공유 기능
-
----
-
-### 4.6 Analytics & Management Service
-
----
-
-#### 22-당첨자명단관리
-
-**개요**
-- **목적**: 당첨자 명단 조회 및 이벤트상품 지급 관리
-- **관련 유저스토리**: UFR-PART-050
-- **비즈니스 중요도**: Must (M/5)
-
-**주요 기능**
-1. 이벤트별 당첨자 목록
-2. 이벤트상품 지급 상태 업데이트
-3. 엑셀 다운로드
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 당첨자 명단 │
-├─────────────────────────┤
-│ 이벤트: 연말 대박 이벤트 │
-│ 당첨인원: 100명 │
-├─────────────────────────┤
-│ │
-│ 검색 [🔍 이름/전화번호] │
-│ │
-│ 지급 상태 필터 │
-│ [전체] [미지급] [완료] │
-│ │
-│ ┌─────────────────────┐│
-│ │ 김철수 ││
-│ │ 010-1234-5678 ││
-│ │ 응모: A-12345678 ││
-│ │ 참여일: 2025-12-15 ││
-│ │ 경로: QR코드 ││
-│ │ ││
-│ │ ☐ 이벤트상품 지급 완료 ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 이영희 ││
-│ │ 010-2345-6789 ││
-│ │ 응모: A-23456789 ││
-│ │ 참여일: 2025-12-16 ││
-│ │ 경로: Instagram ││
-│ │ ││
-│ │ ✅ 이벤트상품 지급 완료 ││
-│ │ 지급일: 2025-12-20 ││
-│ └─────────────────────┘│
-│ │
-│ ... (스크롤) │
-│ │
-│ ───────────────────── │
-│ │
-│ [📊 참여자 전체 명단] │
-│ [📥 엑셀 다운로드] │
-│ │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **검색**: 실시간 검색 필터링
-2. **상태 필터**: 미지급/완료 필터
-3. **체크박스**: 지급 완료 시 체크, 자동으로 지급일 기록
-4. **다운로드**: 엑셀 파일 다운로드
-
-**반응형**
-- 태블릿: 테이블 레이아웃
-- 데스크톱: 페이지네이션 + 대량 작업
-
----
-
-#### 23-실시간대시보드
-
-**개요**
-- **목적**: 이벤트 성과 실시간 모니터링
-- **관련 유저스토리**: UFR-ANAL-010
-- **비즈니스 중요도**: Must (M/21)
-
-**주요 기능**
-1. 총 참여자 수, 노출 수, 매출 증가율 실시간 표시
-2. 5분 간격 자동 업데이트
-3. 채널별 성과 요약
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ☰ 실시간 대시보드 🔔 │
-├─────────────────────────┤
-│ 마지막 업데이트: 15:35 │
-│ [🔄 새로고침] │
-├─────────────────────────┤
-│ │
-│ 진행 중인 이벤트 │
-│ "연말 대박 이벤트" │
-│ D-5 (2025-12-31까지) │
-│ │
-│ ┌─────────────────────┐│
-│ │ 총 참여자 ││
-│ │ 1,234명 👥 ││
-│ │ +45 (오늘) ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 총 노출 수 ││
-│ │ 15,678회 👁️ ││
-│ │ +230 (최근 1시간) ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 매출 증가율 ││
-│ │ +42% 💰 ││
-│ │ (이벤트 전 대비) ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ 예상 광고수익률 ││
-│ │ 245% 📈 ││
-│ │ (투자 대비 수익) ││
-│ └─────────────────────┘│
-│ │
-│ 채널별 참여 현황 │
-│ ┌───────────────────┐ │
-│ │ QR코드 45% │ │
-│ │ Instagram 30% │ │
-│ │ 우리동네TV 15% │ │
-│ │ Naver Blog 10% │ │
-│ └───────────────────┘ │
-│ │
-│ [📊 상세 분석 보기] │
-│ │
-├─────────────────────────┤
-│ [홈][이벤트][분석][MY] │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **자동 새로고침**: 5분 간격
-2. **수동 새로고침**: 버튼 탭
-3. **상세 보기**: 각 지표 탭 시 상세 분석 화면으로 이동
-4. **푸시 알림**: 주요 이벤트 발생 시 (목표 달성 등)
-
-**성능**
-- 데이터 로딩: 5분 간격 자동 업데이트
-- 캐싱으로 빠른 초기 로딩
-
-**반응형**
-- 태블릿: 2x2 그리드
-- 데스크톱: 대시보드 전체 한눈에 표시
-
----
-
-#### 24-채널별성과분석
-
-**개요**
-- **목적**: 채널별 노출 수, 참여율, 전환율 비교
-- **관련 유저스토리**: UFR-ANAL-020
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 채널별 성과 지표
-2. 비교 분석 시각화
-3. 가장 효과적인 채널 강조
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 채널별 성과분석 │
-├─────────────────────────┤
-│ │
-│ 📊 채널별 성과 비교 │
-│ │
-│ 기간: 2025-12-01~현재 │
-│ [기간 선택 ▼] │
-│ │
-│ 종합 순위 │
-│ 🥇 QR코드 (가장 효과적) │
-│ 🥈 Instagram │
-│ 🥉 우리동네TV │
-│ │
-│ ┌─────────────────────┐│
-│ │ QR코드 ││
-│ │ ─────────────────── ││
-│ │ 노출: 5,678회 ││
-│ │ 참여: 556명 (9.8%) ││
-│ │ 전환: 223명 (40%) ││
-│ │ CPA: 180원 ││
-│ │ ││
-│ │ [상세 보기 >] ││
-│ └─────────────────────┘│
-│ │
-│ ┌─────────────────────┐│
-│ │ Instagram ││
-│ │ ─────────────────── ││
-│ │ 노출: 4,523회 ││
-│ │ 참여: 370명 (8.2%) ││
-│ │ 전환: 148명 (40%) ││
-│ │ CPA: 270원 ││
-│ │ ││
-│ │ [상세 보기 >] ││
-│ └─────────────────────┘│
-│ │
-│ ... (스크롤) │
-│ │
-│ ───────────────────── │
-│ │
-│ 비교 차트 (막대 그래프) │
-│ ┌───────────────────┐ │
-│ │ QR ▓▓▓▓▓▓▓▓▓▓│ │
-│ │ Insta ▓▓▓▓▓▓▓ │ │
-│ │ TV ▓▓▓▓ │ │
-│ │ Blog ▓▓ │ │
-│ └───────────────────┘ │
-│ │
-│ 💡 인사이트: │
-│ QR코드가 가장 높은 │
-│ 전환율을 보입니다. │
-│ 오프라인 홍보를 강화하면│
-│ 효과가 더 좋을 것 같아요│
-│ │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **기간 선택**: 드롭다운으로 기간 변경
-2. **상세 보기**: 채널별 상세 분석 페이지
-3. **차트 인터랙션**: 탭하여 수치 확인
-
-**반응형**
-- 태블릿: 2열 레이아웃
-- 데스크톱: 차트 확대 + 비교 테이블
-
----
-
-#### 25-광고수익률분석
-
-**개요**
-- **목적**: 투자 대비 효과 자동 계산
-- **관련 유저스토리**: UFR-ANAL-030
-- **비즈니스 중요도**: Must (M/13)
-
-**주요 기능**
-1. 총 비용 자동 집계
-2. 수익 데이터 수집 (POS 연동)
-3. 광고수익률 자동 계산 및 시각화
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 광고수익률 분석 │
-├─────────────────────────┤
-│ │
-│ 💰 투자 대비 효과 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 광고수익률 ││
-│ │ ││
-│ │ 245% ││
-│ │ ││
-│ │ 투자한 금액 대비 ││
-│ │ 2.45배 수익! ││
-│ └─────────────────────┘│
-│ │
-│ 비용 내역 │
-│ ┌─────────────────────┐│
-│ │ 이벤트상품 비용 ││
-│ │ 100,000원 ││
-│ │ ││
-│ │ 플랫폼 이용료 ││
-│ │ • 우리동네TV: 무료 ││
-│ │ • 지니TV: 무료 ││
-│ │ • SNS: 무료 ││
-│ │ ││
-│ │ ────────────────── ││
-│ │ 총 투자: 100,000원 ││
-│ └─────────────────────┘│
-│ │
-│ 수익 내역 │
-│ ┌─────────────────────┐│
-│ │ 매출 증가액 ││
-│ │ 180,000원 ││
-│ │ (이벤트 기간 vs 평균)││
-│ │ ││
-│ │ 신규 고객 가치 ││
-│ │ 65,000원 ││
-│ │ (78명 × 예상 LTV) ││
-│ │ ││
-│ │ ────────────────── ││
-│ │ 총 수익: 245,000원 ││
-│ └─────────────────────┘│
-│ │
-│ 손익 분기점 │
-│ ✅ 달성 (3일차) │
-│ │
-│ 회수 기간 예상 │
-│ 📅 약 1.5개월 │
-│ │
-│ ───────────────────── │
-│ │
-│ 광고수익률 추이 그래프 │
-│ ┌───────────────────┐ │
-│ │ ╱╲ │ │
-│ │ ╱ ╲ │ │
-│ │ ╱ ╲ │ │
-│ └───────────────────┘ │
-│ 12/1 12/10 12/20 │
-│ │
-└─────────────────────────┘
-```
-
-**인터랙션**
-- 비용/수익 항목 탭 시 상세 내역
-- 그래프 인터랙션으로 일별 광고수익률 확인
-
-**성능**
-- POS 데이터 5분 간격 동기화
-- 광고수익률 실시간 재계산
-
----
-
-#### 26-분석리포트
-
-**개요**
-- **목적**: 종합 분석 리포트 PDF 생성
-- **관련 유저스토리**: UFR-ANAL-040
-- **비즈니스 중요도**: Should (S/8)
-
-**주요 기능**
-1. 전체 성과 요약
-2. 그래프 및 차트 시각화
-3. 업종 평균 벤치마킹
-4. PDF 다운로드 및 이메일 발송
-
-**UI 구성요소**
-
-**모바일**
-```
-┌─────────────────────────┐
-│ ← [뒤로] 분석 리포트 │
-├─────────────────────────┤
-│ │
-│ 📊 종합 분석 리포트 │
-│ │
-│ 이벤트: 연말 대박 이벤트 │
-│ 기간: 2025-12-01~12-31 │
-│ │
-│ ┌─────────────────────┐│
-│ │ 리포트 미리보기 ││
-│ │ ││
-│ │ [PDF 썸네일 이미지] ││
-│ │ ││
-│ │ 10페이지 ││
-│ │ 5.2MB ││
-│ └─────────────────────┘│
-│ │
-│ 포함 내용 │
-│ ✅ 이벤트 개요 │
-│ ✅ 참여 통계 │
-│ ✅ 노출 통계 │
-│ ✅ 매출 분석 │
-│ ✅ 광고수익률 분석 │
-│ ✅ 채널별 성과 비교 │
-│ ✅ 업종 평균 벤치마킹 │
-│ ✅ 그래프 시각화 │
-│ │
-│ [📥 PDF 다운로드] │
-│ [✉️ 이메일로 받기] │
-│ │
-│ ───────────────────── │
-│ │
-│ 생성 이력 │
-│ • 2025-12-31 16:00 │
-│ [다운로드] │
-│ │
-└─────────────────────────┘
-```
-
-**인터랙션**
-1. **PDF 생성**: 데이터 집계 → 그래프 생성 → PDF 레이아웃 → 파일 생성 (30초 이내)
-2. **이메일 발송**: 등록된 이메일로 자동 발송
-3. **미리보기**: 썸네일 탭 시 전체 화면 미리보기
-
-**성능**
-- 리포트 생성: 30초 이내
-- PDF 파일 크기 최적화 (<10MB)
-
----
-
-## 5. 화면 간 전환 및 네비게이션
-
-### 5.1 네비게이션 패턴
-
-#### 바텀 네비게이션 (소상공인용)
-```
-┌───────────────────────────────┐
-│ [홈] [이벤트] [분석] [MY] │
-└───────────────────────────────┘
-
-홈: 21-실시간대시보드
-이벤트: 이벤트 목록 + [+ 새 이벤트] FAB
-분석: 22-채널별성과분석
-MY: 매장정보, 설정, 로그아웃
-```
-
-**특징**:
-- 4개 주요 섹션
-- 현재 선택된 탭 강조 (아이콘 + 라벨)
-- 고정 위치 (항상 표시)
-
-#### 상단 앱바
-```
-┌─────────────────────────────┐
-│ [←] 화면 제목 [액션] │
-└─────────────────────────────┘
-```
-
-**패턴**:
-- 하위 화면: 뒤로가기 버튼
-- 최상위 화면: 메뉴 버튼 (☰)
-- 컨텍스트별 액션 (저장, 공유, 편집 등)
-
-#### 마법사 (Wizard) 패턴
-이벤트 기획 및 콘텐츠 생성 단계에서 사용:
-```
-┌─────────────────────────────┐
-│ 단계 3/6: 경품 선택 │
-│ ━━━━━━━━━━━━━━━━━━━━━━━━━ │
-│ │
-│ [콘텐츠] │
-│ │
-│ [← 이전] [다음 →] │
-└─────────────────────────────┘
-```
-
-**특징**:
-- 진행률 표시
-- 이전/다음 버튼
-- 중간 저장 가능
-
-### 5.2 전환 애니메이션
-
-#### 화면 전환
-- **앞으로 이동**: 슬라이드 인 (우→좌)
-- **뒤로 이동**: 슬라이드 아웃 (좌→우)
-- **바텀 네비게이션**: 페이드 전환
-- **모달/바텀 시트**: 슬라이드 업
-
-#### 요소 전환
-- **리스트 아이템**: 페이드 인 (순차적)
-- **카드 선택**: 스케일 + 하이라이트
-- **로딩**: 스켈레톤 스크린 → 실제 콘텐츠
-
-### 5.3 제스처
-
-- **스와이프**:
- - 좌우: 이미지 갤러리, 탭 전환
- - 아래: 바텀 시트 닫기, 당겨서 새로고침
-- **롱프레스**: 툴팁 표시, 컨텍스트 메뉴
-- **핀치 줌**: 이미지 확대/축소
-
-## 6. 반응형 설계 전략
-
-### 6.1 브레이크포인트
-
-| 디바이스 | 해상도 | 레이아웃 | 주요 변경사항 |
-|---------|--------|---------|--------------|
-| Mobile | 320px~767px | 단일 컬럼 | 세로 스택, 바텀 네비게이션 |
-| Tablet | 768px~1023px | 2컬럼 | 사이드 패널, 그리드 레이아웃 |
-| Desktop | 1024px+ | 다중 컬럼 | 대시보드 전체 표시, 사이드바 |
-
-### 6.2 Mobile First 적용
-
-#### 우선순위 정의
-**1순위 (모바일)**:
-- 핵심 액션 (이벤트 생성, 참여, 승인)
-- 실시간 지표 (참여자 수, 광고수익률)
-- 주요 알림
-
-**2순위 (태블릿)**:
-- 상세 통계
-- 비교 분석
-- 추가 설정 옵션
-
-**3순위 (데스크톱)**:
-- 전체 대시보드
-- 벤치마킹 데이터
-- 고급 필터
-
-#### 점진적 향상 예시
-
-**대시보드 화면**:
-
-**Mobile (320px)**:
-```
-┌──────────┐
-│ 참여자 │
-│ 1,234명 │
-├──────────┤
-│ 노출수 │
-│ 15,678회 │
-├──────────┤
-│ 매출증가 │
-│ +42% │
-├──────────┤
-│광고수익률│
-│ 245% │
-└──────────┘
-```
-
-**Tablet (768px)**:
-```
-┌──────────┬──────────┐
-│ 참여자 │ 노출수 │
-│ 1,234명 │15,678회 │
-├──────────┼──────────┤
-│ 매출증가 │광고수익률│
-│ +42% │ 245% │
-├──────────┴──────────┤
-│ 채널별 성과 차트 │
-└─────────────────────┘
-```
-
-**Desktop (1024px+)**:
-```
-┌──────────────────────────────────┐
-│ ┌────────┬────────┬────────────┐ │
-│ │참여자 │노출수 │매출 +42% │ │
-│ │1,234명 │15,678회│광고수익률 245%│ │
-│ └────────┴────────┴────────────┘ │
-│ │
-│ ┌────────────────────────────┐ │
-│ │ 채널별 성과 상세 차트 │ │
-│ │ [대형 그래프] │ │
-│ └────────────────────────────┘ │
-│ │
-│ ┌────────────┬────────────────┐ │
-│ │진행중 이벤트│ 최근 활동 │ │
-│ └────────────┴────────────────┘ │
-└──────────────────────────────────┘
-```
-
-### 6.3 터치 타겟 최적화
-
-**최소 크기**: 44x44px (Apple HIG, Material Design 권장)
-
-**적용 예시**:
-- 버튼: 48dp 높이
-- 체크박스/라디오: 44x44px 터치 영역
-- 리스트 아이템: 56dp 높이
-- FAB: 56x56dp
-
-## 7. 접근성 보장 방안
-
-### 7.1 WCAG 2.1 AA 준수
-
-#### 색상 대비
-- **일반 텍스트**: 최소 4.5:1
-- **대형 텍스트**: 최소 3:1
-- **UI 컴포넌트**: 최소 3:1
-
-**예시**:
-- 주요 버튼: 진한 파란색 (#0066CC) on 흰색 (6.3:1) ✅
-- 경고 메시지: 빨간색 (#CC0000) on 흰색 (5.8:1) ✅
-
-#### 키보드 네비게이션
-- Tab 순서 논리적 설정
-- 포커스 인디케이터 명확히 표시
-- 모든 인터랙티브 요소 키보드 접근 가능
-
-#### 스크린 리더 지원
-- 의미 있는 대체 텍스트 (alt text)
-- ARIA 레이블 적절히 사용
-- 동적 콘텐츠 변경 시 aria-live 사용
-
-**예시**:
-```html
-
- + 새 이벤트
-
-
-
- AI가 분석 중입니다...
-
-```
-
-### 7.2 접근성 체크리스트
-
-- [ ] 모든 이미지에 대체 텍스트
-- [ ] 폼 요소에 명확한 라벨
-- [ ] 에러 메시지 명확하고 구체적
-- [ ] 색상만으로 정보 전달하지 않음
-- [ ] 터치 타겟 최소 44x44px
-- [ ] 자동 재생 영상/음악 없음 (또는 컨트롤 제공)
-- [ ] 타임아웃 있는 작업에 충분한 시간 제공
-
-## 8. 성능 최적화 방안
-
-### 8.1 로딩 전략
-
-#### 초기 로딩
-- **Critical CSS**: 인라인 삽입 (above-the-fold)
-- **코드 스플리팅**: 라우트별 번들 분리
-- **이미지 최적화**: WebP 포맷, 반응형 이미지
-
-**목표**:
-- First Contentful Paint (FCP): <1.8초
-- Largest Contentful Paint (LCP): <2.5초
-- Time to Interactive (TTI): <3.8초
-
-#### Lazy Loading
-- 이미지: Intersection Observer 사용
-- 컴포넌트: React.lazy() 또는 동적 import
-- 데이터: 무한 스크롤 페이지네이션
-
-### 8.2 AI 처리 피드백
-
-AI 작업은 시간이 걸리므로 명확한 피드백 필수:
-
-**패턴**:
-1. **즉각적 피드백**: "AI가 분석 시작했습니다"
-2. **진행률 표시**: 프로그레스 바 + 예상 소요 시간
-3. **백그라운드 처리**: 다른 작업 가능
-4. **완료 알림**: 푸시 알림 + 인앱 알림
-
-**예시**:
-```
-🤖 AI가 이미지 생성중...
-▓▓▓▓▓░░░░░ 50%
-예상 소요: 1분 30초 남음
-
-✅ 백그라운드에서 계속 진행됩니다.
- 완료되면 알려드릴게요!
-```
-
-### 8.3 캐싱 전략
-
-| 데이터 유형 | 캐싱 전략 | 갱신 주기 |
-|------------|----------|----------|
-| 정적 자산 (이미지, CSS, JS) | Service Worker | 앱 업데이트 시 |
-| 트렌드 분석 결과 | Redis | 1시간 |
-| 경품 추천 | Redis | 5분 |
-| 실시간 대시보드 | 클라이언트 메모리 | 5분 |
-| 사용자 정보 | LocalStorage | 세션 유지 |
-
-### 8.4 성능 목표
-
-| 기능 | 성능 목표 | 측정 방법 |
-|-----|----------|----------|
-| 이벤트 기획 | 10초 이내 | AI 처리 시간 합계 |
-| 콘텐츠 생성 | 5-8분 이내 | 병렬 처리 시간 |
-| 배포 | 1분 이내 | 채널별 병렬 배포 |
-| 대시보드 로딩 | 1초 이내 | LCP |
-| 화면 전환 | 300ms 이내 | 애니메이션 완료 시간 |
-
-## 9. 변경 이력
-
-| 버전 | 날짜 | 변경 내용 | 작성자 |
-|-----|------|----------|--------|
-| 1.0 | 2025-01-20 | 초기 UI/UX 설계서 작성 | 박민지 |
-
----
-
-## 부록
-
-### A. 디자인 시스템 가이드라인
-
-#### 색상 팔레트
-```
-Primary: #0066CC (KT Blue)
-Secondary: #FF6B00 (KT Orange)
-Success: #00C853
-Warning: #FFA000
-Error: #D32F2F
-Background: #FFFFFF
-Surface: #F5F5F5
-Text Primary: #212121
-Text Secondary: #757575
-```
-
-#### 타이포그래피
-```
-H1: 24px/32px Bold (모바일)
-H2: 20px/28px Bold
-H3: 18px/24px SemiBold
-Body: 16px/24px Regular
-Caption: 14px/20px Regular
-Small: 12px/16px Regular
-```
-
-#### 간격 시스템
-```
-XXS: 4px
-XS: 8px
-S: 12px
-M: 16px
-L: 24px
-XL: 32px
-XXL: 48px
-```
-
-#### 그림자
-```
-Elevation 1: 0 2px 4px rgba(0,0,0,0.1)
-Elevation 2: 0 4px 8px rgba(0,0,0,0.12)
-Elevation 3: 0 8px 16px rgba(0,0,0,0.14)
-```
-
-### B. 컴포넌트 라이브러리
-
-주요 재사용 컴포넌트:
-- Button (Primary, Secondary, Text, Outlined)
-- Card (기본, 선택 가능, 호버)
-- Input (Text, Number, Select, Checkbox, Radio)
-- ProgressBar (Determinate, Indeterminate)
-- BottomSheet
-- Dialog
-- Skeleton Screen
-- Empty State
-- Error State
-
-### C. 참조 자료
-
-1. **KT 사장님Easy**: https://product.kt.com/wDic/soho/marketing.do?itemCode=sajangeasy
-2. **wwit.design 닷슬래시대시**: https://wwit.design/2023/09/30/dotslashdash/
-3. **Material Design**: https://material.io/design
-4. **Apple Human Interface Guidelines**: https://developer.apple.com/design/human-interface-guidelines/
-5. **WCAG 2.1**: https://www.w3.org/WAI/WCAG21/quickref/
-
----
-
-**문서 종료**
\ No newline at end of file
diff --git a/TEMP_BACKUP/userstory-table.md b/TEMP_BACKUP/userstory-table.md
deleted file mode 100644
index 9784c81..0000000
--- a/TEMP_BACKUP/userstory-table.md
+++ /dev/null
@@ -1,358 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 유저스토리 목록
-
-## 전체 유저스토리 요약
-
-| 서비스 | ID | 유저스토리 | 우선순위 | 복잡도 |
-|--------|-----|-----------|----------|--------|
-| **User** | UFR-USER-001 | [로그인] 소상공인으로서 등록된 계정으로 로그인하고 싶다 | M | 5 |
-| | UFR-USER-002 | [홈화면] 소상공인으로서 로그인 후 내 이벤트 현황을 한눈에 보고 새 이벤트를 시작하고 싶다 | M | 8 |
-| | UFR-USER-010 | [회원가입] 소상공인으로서 간편하게 회원가입하고 싶다 | M | 5 |
-| | UFR-USER-020 | [매장정보등록] 맞춤형 이벤트를 위해 매장 정보를 등록하고 싶다 | M | 13 |
-| **Event Planning** | UFR-PLAN-010 | [이벤트목적선택] 효과적인 이벤트를 위해 목적을 선택하고 싶다 | M | 3 |
-| | UFR-PLAN-020 | [AI업종트렌드분석] 성공률 높은 이벤트를 위해 AI 트렌드 분석을 원한다 | M | 13 |
-| | UFR-PLAN-030 | [AI이벤트상품추천] 예산 내 최적 이벤트상품을 AI가 추천하고 이벤트 진행 방법을 선택하고 싶다 | M | 21 |
-| | UFR-PLAN-040 | [AI참여방법설계] 재방문 유도하는 참여 방법을 AI가 설계해주기를 원한다 | M | 21 |
-| | UFR-PLAN-050 | [AI홍보문구생성] 매력적인 홍보 문구를 AI가 자동 생성해주기를 원한다 | M | 13 |
-| | UFR-PLAN-060 | [이벤트기획안승인] 완성된 기획안을 검토하고 승인하고 싶다 | M | 5 |
-| **Content Generation** | UFR-CONT-010 | [AI이미지생성] 브랜드 컬러와 로고를 반영한 이미지를 AI가 생성해주기를 원한다 | M | 34 |
-| | UFR-CONT-030 | [SNS콘텐츠생성] 플랫폼별 최적화된 콘텐츠를 자동 생성해주기를 원한다 | M | 21 |
-| | UFR-CONT-040 | [QR포스터생성] 오프라인 홍보용 QR 포스터를 생성하고 싶다 | M | 8 |
-| | UFR-CONT-050 | [콘텐츠편집] 생성된 콘텐츠를 개인화하기 위해 수정하고 싶다 | S | 13 |
-| | UFR-CONT-060 | [콘텐츠최종승인] 완성된 콘텐츠를 검토하고 승인하고 싶다 | M | 3 |
-| **Distribution** | UFR-DIST-010 | [다중채널배포설정] 여러 채널에 한 번에 배포하고 싶다 | M | 13 |
-| | UFR-DIST-020 | [우리동네TV배포] 주변 지역 고객에게 우리동네TV로 도달하고 싶다 | M | 21 |
-| | UFR-DIST-030 | [링고비즈연결음업데이트] 매장 전화 연결음을 이벤트 내용으로 업데이트하고 싶다 | S | 13 |
-| | UFR-DIST-040 | [지니TV광고배포] 가정의 TV를 통해 지니TV 광고를 배포하고 싶다 | M | 21 |
-| | UFR-DIST-050 | [SNS자동포스팅] Instagram, Naver Blog, Kakao에 자동 포스팅하고 싶다 | M | 13 |
-| | UFR-DIST-060 | [오프라인자료다운로드] QR 포스터와 인쇄용 PDF를 다운로드하고 싶다 | S | 5 |
-| **Participation** | UFR-PART-010 | [이벤트참여신청] 고객이 간편하게 이벤트에 참여하고 싶다 | M | 8 |
-| | UFR-PART-020 | [중복참여방지] 공정한 이벤트 운영을 위해 1인 1회만 참여 허용하고 싶다 | M | 8 |
-| | UFR-PART-030 | [자동당첨자추첨] 추첨형 이벤트 종료 시 자동으로 당첨자가 추첨되기를 원한다 | M | 13 |
-| | UFR-PART-040 | [당첨알림발송] 고객이 SMS나 카카오 알림톡으로 당첨 알림을 받고 싶다 | M | 8 |
-| | UFR-PART-050 | [당첨자명단관리] 당첨자 명단을 확인하고 관리하고 싶다 | M | 5 |
-| **Analytics** | UFR-ANAL-010 | [실시간대시보드조회] 실시간으로 참여자 수, 노출 수, 매출 증가율을 확인하고 싶다 | M | 21 |
-| | UFR-ANAL-020 | [채널별성과분석] 채널별 노출 수와 참여율을 비교하고 싶다 | M | 13 |
-| | UFR-ANAL-030 | [광고수익률자동계산] 총비용 대비 수익(광고 수익률)이 자동으로 계산되기를 원한다 | M | 13 |
-| | UFR-ANAL-040 | [분석리포트생성] 종합 분석 리포트를 PDF로 다운로드하고 싶다 | S | 8 |
-| **AI Learning** | UFR-AIMPR-010 | [AI개선안생성] AI가 분석 결과를 바탕으로 구체적인 개선안을 제안해주기를 원한다 | M | 21 |
-| | UFR-AIMPR-020 | [다음이벤트아이디어제안] AI가 시즌별 성공 이벤트 아이디어를 제안해주기를 원한다 | S | 13 |
-| | UFR-AIMPR-030 | [성공패턴학습] AI 시스템이 이벤트 결과를 학습하여 성공 패턴을 축적하고 싶다 | M | 34 |
-| **비기능 요구사항** | NFR-PERF-010 | [AI기획속도] AI 이벤트 기획을 10초 이내에 완료하고 싶다 | M | 21 |
-| | NFR-PERF-020 | [콘텐츠생성속도] 이미지와 영상 생성을 5-8분 내에 완료하고 싶다 | M | 34 |
-| | NFR-PERF-030 | [배포속도] 다중 채널 배포를 1분 이내에 완료하고 싶다 | M | 21 |
-| | NFR-PERF-040 | [실시간데이터수집] 5분 간격으로 실시간 데이터를 수집하고 싶다 | M | 13 |
-| | NFR-SECU-010 | [개인정보보호] 개인정보 보호 규정을 준수하고 암호화를 적용하고 싶다 | M | 13 |
-| | NFR-RELI-010 | [배포실패자동재시도] 배포 실패 시 자동으로 3회까지 재시도하고 싶다 | M | 8 |
-| | NFR-SCAL-010 | [동시이벤트처리] 최소 100개의 이벤트를 동시에 처리할 수 있어야 한다 | S | 21 |
-
----
-
-## 우선순위별 통계
-
-| 우선순위 | 개수 | 비율 |
-|---------|------|------|
-| M (필수) | 35 | 81.4% |
-| S (선택) | 8 | 18.6% |
-| **총계** | **43** | **100%** |
-
----
-
-## 서비스별 통계
-
-| 서비스 | 유저스토리 수 | 평균 복잡도 | 필수(M) | 선택(S) |
-|--------|-------------|-----------|---------|---------|
-| User | 4 | 7.8 | 4 | 0 |
-| Event Planning | 6 | 12.7 | 6 | 0 |
-| Content Generation | 5 | 15.8 | 4 | 1 |
-| Distribution | 6 | 14.3 | 4 | 2 |
-| Participation | 5 | 8.4 | 5 | 0 |
-| Analytics | 4 | 13.8 | 3 | 1 |
-| AI Learning | 3 | 22.7 | 2 | 1 |
-| 비기능 요구사항 | 7 | 18.7 | 6 | 1 |
-| **총계** | **40** | **13.4** | **34** | **6** |
-
----
-
-## 복잡도별 통계
-
-| 복잡도 범위 | 개수 | 유저스토리 |
-|-----------|------|-----------|
-| 1-5 (낮음) | 6 | UFR-USER-001, UFR-USER-010, UFR-PLAN-010, UFR-PLAN-060, UFR-CONT-060, UFR-DIST-060, UFR-PART-050 |
-| 6-13 (중간) | 24 | UFR-USER-002, UFR-USER-020, UFR-PLAN-020, UFR-PLAN-050, UFR-CONT-030, UFR-CONT-040, UFR-CONT-050, UFR-DIST-010, UFR-DIST-030, UFR-DIST-050, UFR-PART-010, UFR-PART-020, UFR-PART-030, UFR-PART-040, UFR-ANAL-020, UFR-ANAL-030, UFR-AIMPR-020, NFR-PERF-040, NFR-SECU-010, NFR-RELI-010 |
-| 14-21 (높음) | 10 | UFR-PLAN-030, UFR-PLAN-040, UFR-DIST-020, UFR-DIST-040, UFR-ANAL-010, UFR-AIMPR-010, NFR-PERF-010, NFR-PERF-030, NFR-SCAL-010 |
-| 22+ (매우 높음) | 3 | UFR-CONT-010, UFR-AIMPR-030, NFR-PERF-020 |
-
----
-
-## 주요 기능별 상세 목록
-
-### 1. User 서비스 (회원 인증 및 매장 정보 관리)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 |
-|----|------|----------|--------|-------------|
-| UFR-USER-001 | 로그인 | M | 5 | 이메일/비밀번호 입력, JWT 토큰 발급, 세션 생성, 자동 로그인 |
-| UFR-USER-002 | 홈화면 | M | 8 | 진행 중인 이벤트 목록, 대시보드 요약, 새 이벤트 생성 버튼 |
-| UFR-USER-010 | 회원가입 | M | 5 | 이름, 전화번호, 이메일, 비밀번호, 중복 가입 방지 |
-| UFR-USER-020 | 매장정보등록 | M | 13 | 매장명, 업종, 주소, 사업자번호 검증, 메뉴/상품 정보 |
-
-**검증 로직:**
-- 사업자번호 형식 검증 (XXX-XX-XXXXX)
-- 사업자번호 유효성 확인 및 휴폐업 여부 확인
-- 매장명과 사업자 정보 일치 확인
-
-**주요 흐름:**
-1. UFR-USER-001 (로그인) → UFR-USER-002 (홈화면)
-2. 신규 사용자: 회원가입(UFR-USER-010) → 매장정보등록(UFR-USER-020) → 홈화면(UFR-USER-002)
-3. 홈화면에서 "새 이벤트 생성" → UFR-PLAN-010
-
----
-
-### 2. Event Planning 서비스 (AI 기반 이벤트 자동 기획)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 | AI 모델 |
-|----|------|----------|--------|-------------|---------|
-| UFR-PLAN-010 | 이벤트목적선택 | M | 3 | 신규고객 유치/재방문 유도/매출 증대/인지도 향상 선택 | - |
-| UFR-PLAN-020 | AI업종트렌드분석 | M | 13 | 업종, 지역, 시즌 기반 트렌드 분석, 성공 사례 분석 | Claude API |
-| UFR-PLAN-030 | AI이벤트상품추천 | M | 21 | 예산, 타겟 고객층 기반 이벤트상품 Top 5 추천, 이벤트 진행 방법 선택 (추첨형/선착순형) | Claude API |
-| UFR-PLAN-040 | AI참여방법설계 | M | 21 | 간단한 참여 방법 + 재방문 유도 + 바이럴 확산 3가지 옵션 | Claude API |
-| UFR-PLAN-050 | AI홍보문구생성 | M | 13 | 5개 버전 홍보 문구 + SNS 해시태그 + 플랫폼별 최적화 | GPT-4 API |
-| UFR-PLAN-060 | 이벤트기획안승인 | M | 5 | 기획안 요약 제공, 승인 처리, 수정 기능 | - |
-
-**이벤트 진행 방법:**
-- **추첨형**: 기간 내 참여한 고객 중 이벤트 종료 후 당첨자 랜덤 추첨
-- **선착순형**: 선착순 쿠폰 소진 방식, 소진 시 자동 이벤트 종료
-
-**성능 목표:** 전체 기획 과정 10초 이내 완료
-
----
-
-### 3. Content Generation 서비스 (AI 기반 콘텐츠 자동 생성)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 | AI 모델 |
-|----|------|----------|--------|-------------|---------|
-| UFR-CONT-010 | AI이미지생성 | M | 34 | 브랜드 컬러, 로고 반영, 3가지 스타일 (심플/화려/트렌디), 1080x1080 | Stable Diffusion |
-| UFR-CONT-030 | SNS콘텐츠생성 | M | 21 | Instagram (1080x1080), Naver Blog (800x600), Kakao (800x800) | - |
-| UFR-CONT-040 | QR포스터생성 | M | 8 | QR 코드 포함, A4/A3 PDF, 인쇄 최적화 (300dpi), 생성 선택 옵션 | - |
-| UFR-CONT-050 | 콘텐츠편집 | S | 13 | 텍스트 수정, 색상 조정, 레이아웃 변경, 편집 이력 관리 (최대 3개 버전) | - |
-| UFR-CONT-060 | 콘텐츠최종승인 | M | 3 | 전체 콘텐츠 미리보기, 승인 처리 | - |
-
-**QR 포스터 생성 옵션:**
-- 생성 선택: QR 포스터 생성 화면으로 이동
-- 생성 안 함: 콘텐츠 편집 단계로 바로 이동
-
-**성능 목표:**
-- 이미지 생성: 2-3분 이내
-- SNS 콘텐츠 생성: 30초 이내
-- QR 포스터 생성: 20초 이내
-
----
-
-### 4. Distribution 서비스 (다중 채널 자동 배포)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 | 연동 API |
-|----|------|----------|--------|-------------|---------|
-| UFR-DIST-010 | 다중채널배포설정 | M | 13 | 채널 선택 (우리동네TV, 링고비즈, 지니TV, SNS), 즉시/예약 배포 | - |
-| UFR-DIST-020 | 우리동네TV배포 | M | 21 | 반경 (500m/1km), 송출 시간대, 15초 영상 업로드 | 우리동네TV API |
-| UFR-DIST-030 | 링고비즈연결음업데이트 | S | 13 | 네이버 클로바 TTS 음성 생성, 연결음 업데이트, 미리듣기 | 링고비즈 API, Clova TTS |
-| UFR-DIST-040 | 지니TV광고배포 | M | 21 | 타겟 지역 (1km/3km/5km), 노출 시간대, 예산 기반 노출량 | 지니TV API |
-| UFR-DIST-050 | SNS자동포스팅 | M | 13 | Instagram, Naver Blog, Kakao OAuth 연동, 예약 포스팅 | SNS API (Instagram, Naver, Kakao) |
-| UFR-DIST-060 | 오프라인자료다운로드 | S | 5 | QR 포스터 (A4/A3 PDF), QR 코드 이미지, 인쇄용 이미지 | - |
-
-**성능 목표:** 전체 배포 과정 1분 이내 완료
-
----
-
-### 5. Participation 서비스 (이벤트 참여 및 접수 관리)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 |
-|----|------|----------|--------|-------------|
-| UFR-PART-010 | 이벤트참여신청 | M | 8 | 고객명, 전화번호, 참여 경로 추적, 응모번호 발급 |
-| UFR-PART-020 | 중복참여방지 | M | 8 | 전화번호 기반 중복 체크, 매장 방문 고객 가산점 |
-| UFR-PART-030 | 자동당첨자추첨 | M | 13 | 추첨형: 종료 시 자동 추첨, 선착순형: 쿠폰 소진 시 자동 종료 |
-| UFR-PART-040 | 당첨알림발송 | M | 8 | SMS/카카오 알림톡 발송, 이벤트상품 수령 방법 안내, 실패 시 재발송 (최대 3회) |
-| UFR-PART-050 | 당첨자명단관리 | M | 5 | 당첨자 목록, 이벤트상품 지급 상태 관리, 엑셀 다운로드 |
-
-**이벤트 진행 방법별 프로세스:**
-- **추첨형**: 이벤트 종료 시각 도래 → 자동 추첨 시작 → 당첨자 선정 → 알림 발송
-- **선착순형**: 참여 순서대로 자동 확정 → 쿠폰 소진 시 자동 종료 → 추첨 과정 없음
-
-**정책:**
-- 1인 1회 참여 제한
-- 개인정보 보호 규정 준수
-- 매장 방문 고객 가산점 부여 (추첨형만)
-
----
-
-### 6. Analytics 서비스 (실시간 효과 측정 및 분석)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 | 데이터 소스 |
-|----|------|----------|--------|-------------|------------|
-| UFR-ANAL-010 | 실시간대시보드조회 | M | 21 | 참여자 수, 채널별 노출 수, 매출 증가율, 예상 ROI (5분 간격 업데이트) | KT 채널 API, POS, SNS API |
-| UFR-ANAL-020 | 채널별성과분석 | M | 13 | 노출 수, 참여율, 전환율, 비용 대비 효과 (CPA) 비교 | 각 채널 API |
-| UFR-ANAL-030 | 광고수익률자동계산 | M | 13 | 총 투자 비용 vs 수익, 손익분기점, 회수 기간, ROI 계산 | - |
-| UFR-ANAL-040 | 분석리포트생성 | S | 8 | 종합 리포트 PDF 생성, 업종 평균 대비 벤치마킹 | - |
-
-**데이터 수집:**
-- 실시간 데이터 수집 (5분 간격)
-- Instagram Graph API, Kakao API 활용
-- Naver Blog (조회 수만 수집 가능, 체류 시간 불가)
-- QR 코드 스캔 횟수 자체 추적
-
----
-
-### 7. AI Learning 서비스 (AI 학습 및 개선 제안)
-
-| ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 | AI 모델 |
-|----|------|----------|--------|-------------|---------|
-| UFR-AIMPR-010 | AI개선안생성 | M | 21 | 성공/실패 요인 분석, 3가지 개선안 제시 (이벤트상품 변경, 참여 방법 단순화, 채널 조정) | AI 머신러닝 엔진 |
-| UFR-AIMPR-020 | 다음이벤트아이디어제안 | S | 13 | 시즌별 성공 이벤트 아이디어 5가지, 예상 성과 제공 | 트렌드 DB |
-| UFR-AIMPR-030 | 성공패턴학습 | M | 34 | 이벤트 결과 데이터 학습, 성공 패턴 축적, 추천 정확도 개선 | 빅데이터 분석 시스템 |
-
-**학습 전략:**
-- 성공 패턴 자동 학습 및 재활용
-- 실패 요인 회피 로직 적용
-- 업종별/지역별 데이터 축적
-- 지속적 성능 개선 알고리즘
-
----
-
-### 8. 비기능 요구사항 (성능, 보안, 안정성, 확장성)
-
-| 카테고리 | ID | 기능 | 우선순위 | 복잡도 | 핵심 요구사항 |
-|---------|-----|------|----------|--------|-------------|
-| 성능 | NFR-PERF-010 | AI기획속도 | M | 21 | AI 이벤트 기획 10초 이내 (병렬 호출, 캐싱) |
-| | NFR-PERF-020 | 콘텐츠생성속도 | M | 34 | 이미지 2-3분, 영상 3-5분, 총 5-8분 이내 (병렬 처리, GPU 가속) |
-| | NFR-PERF-030 | 배포속도 | M | 21 | 다중 채널 배포 1분 이내 (채널별 병렬 배포) |
-| | NFR-PERF-040 | 실시간데이터수집 | M | 13 | 5분 간격 자동 데이터 수집 (스케줄러, 재시도 3회) |
-| 보안 | NFR-SECU-010 | 개인정보보호 | M | 13 | 전화번호 AES-256 암호화, GDPR/개인정보보호법 준수, RBAC |
-| 안정성 | NFR-RELI-010 | 배포실패자동재시도 | M | 8 | 배포 실패 시 자동 재시도 (최대 3회, 지수 백오프) |
-| 확장성 | NFR-SCAL-010 | 동시이벤트처리 | S | 21 | 100개 이벤트 동시 처리 (Auto Scaling, 로드 밸런싱, 메시지 큐) |
-
----
-
-## 기술 스택 요약
-
-### AI/ML 모델
-| 모델 | 용도 | 관련 유저스토리 |
-|------|------|----------------|
-| Claude API | 트렌드 분석, 이벤트상품 추천, 참여 방법 설계 | UFR-PLAN-020, UFR-PLAN-030, UFR-PLAN-040 |
-| GPT-4 API | 홍보 문구 생성 | UFR-PLAN-050 |
-| Stable Diffusion | 이미지 생성 | UFR-CONT-010 |
-| 네이버 클로바 TTS | 연결음 음성 합성 | UFR-DIST-030 |
-| AI 머신러닝 엔진 | 개선안 생성, 성공 패턴 학습 | UFR-AIMPR-010, UFR-AIMPR-030 |
-
-### 외부 API 연동
-| API | 용도 | 관련 유저스토리 |
-|-----|------|----------------|
-| 사업자번호 검증 시스템 | 사업자번호 유효성 확인 | UFR-USER-020 |
-| 우리동네TV API | 지역 타겟팅 영상 송출 | UFR-DIST-020 |
-| 링고비즈 API | 연결음 업데이트 | UFR-DIST-030 |
-| 지니TV API | TV 광고 배포 | UFR-DIST-040 |
-| Instagram Graph API | SNS 자동 포스팅, 성과 데이터 수집 | UFR-DIST-050, UFR-ANAL-020 |
-| Naver Blog API | 블로그 자동 포스팅 | UFR-DIST-050 |
-| Kakao Channel API | 카카오 채널 자동 포스팅, 성과 데이터 수집 | UFR-DIST-050, UFR-ANAL-020 |
-| SMS/카카오 알림톡 | 당첨 알림 발송 | UFR-PART-040 |
-| POS 시스템 | 매출 데이터 수집 | UFR-ANAL-010 |
-
----
-
-## 마이크로서비스 아키텍처
-
-```
-┌─────────────────────────────────────────────────────────────┐
-│ API Gateway │
-└─────────────────────────────────────────────────────────────┘
- │
- ┌─────────────────────┼─────────────────────┐
- │ │ │
-┌───────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
-│ User Service │ │ Event Planning │ │ Content │
-│ (UFR-USER) │ │ (UFR-PLAN) │ │ Generation │
-│ │ │ │ │ (UFR-CONT) │
-└────────────────┘ └─────────────────┘ └─────────────────┘
- │ │ │
- │ │ │
-┌───────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
-│ Distribution │ │ Participation │ │ Analytics │
-│ (UFR-DIST) │ │ (UFR-PART) │ │ (UFR-ANAL) │
-└────────────────┘ └─────────────────┘ └─────────────────┘
- │ │ │
- └─────────────────────┼─────────────────────┘
- │
- ┌─────────▼─────────┐
- │ AI Learning │
- │ (UFR-AIMPR) │
- └───────────────────┘
-```
-
----
-
-## 개발 우선순위 로드맵
-
-### Phase 1: MVP (8주)
-**목표:** 기본 이벤트 기획 및 배포 기능
-
-| 순서 | 서비스 | 유저스토리 | 비고 |
-|------|--------|-----------|------|
-| 1 | User | UFR-USER-001, UFR-USER-002, UFR-USER-010, UFR-USER-020 | 로그인, 홈화면, 회원가입, 매장 정보 등록 |
-| 2 | Event Planning | UFR-PLAN-010, UFR-PLAN-030, UFR-PLAN-060 | 목적 선택, 이벤트상품 추천, 승인 |
-| 3 | Content Generation | UFR-CONT-010, UFR-CONT-040, UFR-CONT-060 | 이미지 생성, QR 포스터, 승인 |
-| 4 | Distribution | UFR-DIST-010, UFR-DIST-050 | 다중 채널 설정, SNS 포스팅 |
-| 5 | Participation | UFR-PART-010, UFR-PART-020, UFR-PART-030 | 참여 신청, 중복 방지, 자동 추첨 |
-
-### Phase 2: 고도화 (6주)
-**목표:** AI 기능 강화 및 분석 기능 추가
-
-| 순서 | 서비스 | 유저스토리 | 비고 |
-|------|--------|-----------|------|
-| 6 | Event Planning | UFR-PLAN-020, UFR-PLAN-040, UFR-PLAN-050 | 트렌드 분석, 참여 방법, 홍보 문구 |
-| 7 | Content Generation | UFR-CONT-030 | SNS 콘텐츠 |
-| 8 | Distribution | UFR-DIST-020, UFR-DIST-040 | 우리동네TV, 지니TV |
-| 9 | Participation | UFR-PART-040, UFR-PART-050 | 당첨 알림, 명단 관리 |
-| 10 | Analytics | UFR-ANAL-010, UFR-ANAL-020, UFR-ANAL-030 | 실시간 대시보드, 채널별 분석, ROI |
-
-### Phase 3: 완성 (4주)
-**목표:** AI 학습 및 선택 기능 추가
-
-| 순서 | 서비스 | 유저스토리 | 비고 |
-|------|--------|-----------|------|
-| 11 | Distribution | UFR-DIST-030, UFR-DIST-060 | 링고비즈 연결음, 오프라인 자료 |
-| 12 | Content Generation | UFR-CONT-050 | 콘텐츠 편집 |
-| 13 | Analytics | UFR-ANAL-040 | 분석 리포트 |
-| 14 | AI Learning | UFR-AIMPR-010, UFR-AIMPR-030 | 개선안 생성, 성공 패턴 학습 |
-| 15 | AI Learning | UFR-AIMPR-020 | 다음 이벤트 아이디어 |
-
----
-
-## 성능 요구사항 요약
-
-| 단계 | 목표 시간 | 관련 유저스토리 |
-|------|----------|----------------|
-| AI 이벤트 기획 | 10초 이내 | UFR-PLAN-020~050, NFR-PERF-010 |
-| 콘텐츠 생성 | 5-8분 이내 | UFR-CONT-010~030, NFR-PERF-020 |
-| 다중 채널 배포 | 1분 이내 | UFR-DIST-010~050, NFR-PERF-030 |
-| 실시간 데이터 수집 | 5분 간격 | UFR-ANAL-010, NFR-PERF-040 |
-
----
-
-## 보안 요구사항 요약
-
-| 항목 | 요구사항 | 관련 유저스토리 |
-|------|----------|----------------|
-| 개인정보 암호화 | AES-256 (전화번호, 이름) | NFR-SECU-010 |
-| 전송 보안 | HTTPS/TLS | NFR-SECU-010 |
-| 접근 제어 | RBAC (역할 기반) | NFR-SECU-010 |
-| 개인정보 보호 | GDPR, 개인정보보호법 준수 | NFR-SECU-010 |
-| 보유 기간 | 이벤트 종료 후 3개월 | NFR-SECU-010 |
-
----
-
-## 안정성 및 확장성 요구사항
-
-| 항목 | 요구사항 | 관련 유저스토리 |
-|------|----------|----------------|
-| 자동 재시도 | 배포 실패 시 최대 3회 (지수 백오프) | NFR-RELI-010 |
-| 동시 처리 | 최소 100개 이벤트 동시 처리 | NFR-SCAL-010 |
-| Auto Scaling | 마이크로서비스 수평 확장 | NFR-SCAL-010 |
-| 로드 밸런싱 | 트래픽 분산 | NFR-SCAL-010 |
-| 메시지 큐 | 비동기 처리 (RabbitMQ/Kafka) | NFR-SCAL-010 |
diff --git a/TEMP_BACKUP/userstory.md b/TEMP_BACKUP/userstory.md
deleted file mode 100644
index 81145bf..0000000
--- a/TEMP_BACKUP/userstory.md
+++ /dev/null
@@ -1,1437 +0,0 @@
-# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 유저스토리 (프로토타입 반영)
-
-> 🔄 **업데이트 일자**: 2025-10-21
-> 📋 **프로토타입 기준**: 30개 화면 분석 완료
-> ✅ **주요 변경**: AI 영상 제작 추가, 네비게이션 구조 개선, UI 플로우 최적화
-
----
-
-## 📊 프로토타입 분석 요약
-
-### **주요 발견 사항**
-1. ✅ **AI 영상 제작 화면 추가** - 기존 유저스토리에 누락되어 있던 핵심 기능
-2. ✅ **하단 네비게이션 구조** - 주요 5개 메뉴 (홈/이벤트/만들기/분석/MY)
-3. ✅ **이벤트 기획안 승인** - AI 예상 성과 표시 기능 강화
-4. ✅ **배포 채널 선택** - KT 채널과 SNS 채널 명확히 구분
-5. ✅ **실시간 대시보드** - 채널별 성과 링크 및 최근 활동 표시
-
-### **화면 플로우 (30개)**
-```
-00 로그인
-01 회원가입
-02 매장정보등록
-03 홈화면 ⭐ (하단 네비게이션 시작)
-04 이벤트목적선택
-05 AI트렌드분석결과
-06 AI이벤트상품추천
-07 AI참여방법설계
-08 AI홍보문구생성
-09 AI이미지생성
-10 이벤트기획안승인 ⭐ (AI 예상 성과 표시)
-11 AI영상제작 ⭐ (신규 추가)
-12 SNS콘텐츠생성
-13 QR포스터생성
-14 QR포스터생성선택
-15 QR포스터상세설정
-16 콘텐츠편집
-17 콘텐츠최종승인
-18 배포채널선택 ⭐ (KT/SNS 채널 구분)
-19 배포진행상태
-20 오프라인자료다운로드
-21 이벤트참여
-22 참여완료
-23 당첨자명단관리
-24 실시간대시보드 ⭐ (채널별 성과 링크 추가)
-25 채널별성과분석
-26 ROI분석
-27 분석리포트
-28 이벤트목록
-29 마이페이지
-```
-
----
-
-## 마이크로서비스 구성
-
-1. **User** - 회원 인증 및 매장 정보 관리
-2. **Event Planning** - AI 기반 이벤트 자동 기획
-3. **Content Generation** - AI 기반 콘텐츠 자동 생성 (이미지 + **영상**)
-4. **Distribution** - 다중 채널 자동 배포
-5. **Participation** - 이벤트 참여 및 접수 관리
-6. **Analytics** - 실시간 효과 측정 및 분석
-7. **AI Learning** - AI 학습 및 개선 제안
-
----
-
-## 유저스토리
-
-```
-1. User 서비스
-1) 사용자 인증 및 관리
-UFR-USER-001: [로그인] 소상공인으로서 | 나는, 서비스를 이용하기 위해 | 등록된 계정으로 로그인하고 싶다.
-- 시나리오: 로그인 인증
- 앱 실행 또는 웹 접속 시 | 이메일과 비밀번호를 입력하고 로그인하면 | 인증이 완료되고 홈 화면으로 이동한다.
-
- [입력 요구사항]
- - [ ] 이메일 입력 (필수)
- - [ ] 비밀번호 입력 (필수)
- - [ ] 자동 로그인 체크박스 (선택)
-
- [인증 처리]
- - [ ] 이메일과 비밀번호 검증
- - [ ] JWT 토큰 발급
- - [ ] 세션 생성
- - [ ] 로그인 상태 유지 (자동 로그인 선택 시)
-
- [처리 결과]
- - [ ] 성공: 홈 화면(UFR-USER-002)으로 이동
- - [ ] 실패: 오류 메시지 표시
- - "이메일 또는 비밀번호가 일치하지 않습니다"
- - "존재하지 않는 계정입니다"
-
- [추가 기능]
- - [ ] 비밀번호 찾기 링크
- - [ ] 회원가입 화면으로 이동 링크
-
-- M/5
-
----
-
-UFR-USER-002: [홈화면] 소상공인으로서 | 나는, 로그인 후 | 내 이벤트 현황을 한눈에 보고 새 이벤트를 시작하고 싶다.
-- 시나리오: 홈 화면 조회
- 로그인 완료 후 | 홈 화면에 접속하면 | 진행 중인 이벤트 요약, 최근 성과, 새 이벤트 생성 버튼이 표시된다.
-
- [홈 화면 구성 요소]
- - [ ] 환영 메시지 (사용자명 표시: "안녕하세요!")
- - [ ] 빠른 액션 버튼 (상단)
- - "✨ 새 이벤트" (UFR-PLAN-010으로 이동)
- - "📋 이벤트 목록" (UFR-USER-030으로 이동)
- - "📊 실시간 현황" (UFR-ANAL-010으로 이동)
- - "⚙️ 설정"
- - [ ] 대시보드 요약 카드
- - 진행 중인 이벤트 수
- - 총 참여자 수
- - 전환율 (%)
- - [ ] AI 인사이트 섹션
- - 🤖 AI 인사이트 제목
- - "이벤트를 생성하시면 AI가 맞춤형 인사이트를 제공해드립니다" 안내 메시지
- - [ ] 최근 이벤트 섹션
- - "최근 이벤트" 제목
- - "전체보기" 링크 (UFR-USER-030으로 이동)
- - 최근 이벤트 목록 (최대 3개)
- - [ ] 첫 이벤트 안내 (이벤트 없을 경우)
- - 🎯 아이콘
- - "첫 이벤트를 만들어보세요!" 제목
- - "AI가 업종과 목적에 맞는 최적의 이벤트를 추천해드립니다" 설명
- - "AI 이벤트 만들기" 버튼 (UFR-PLAN-010으로 이동)
-
- [하단 네비게이션 바] ⭐ 신규 추가
- - [ ] 홈 (현재 화면, UFR-USER-002)
- - [ ] 이벤트 (UFR-USER-030)
- - [ ] 만들기 (UFR-PLAN-010)
- - [ ] 분석 (UFR-ANAL-010)
- - [ ] MY (UFR-USER-040)
-
- [처리]
- - [ ] 사용자 정보 조회
- - [ ] 진행 중인 이벤트 목록 조회
- - [ ] 이벤트 통계 집계
-
- [네비게이션]
- - [ ] 새 이벤트 생성 버튼 → UFR-PLAN-010
- - [ ] 이벤트 목록 → UFR-USER-030
- - [ ] 실시간 대시보드 → UFR-ANAL-010
- - [ ] 마이페이지 → UFR-USER-040
-
-- M/13
-
----
-
-UFR-USER-010: [회원가입] 소상공인으로서 | 나는, 이벤트 자동 생성 서비스를 사용하기 위해 | 간편하게 회원가입하고 싶다.
-- 시나리오: 기본 정보 입력
- 미가입 상태에서 | 이름, 전화번호, 이메일, 비밀번호를 입력하고 회원가입을 하면 | 회원가입이 완료되고 매장 정보 등록 화면으로 이동한다.
-
- [입력 요구사항]
- - [ ] 이름 2자 이상 입력 가능 (필수)
- - [ ] 전화번호 형식 검증 (010-XXXX-XXXX) (필수)
- - [ ] 이메일 형식 검증 (example@domain.com) (필수)
- - [ ] 비밀번호 입력 (필수)
- - 최소 8자 이상
- - 영문, 숫자, 특수문자 조합
- - [ ] 비밀번호 확인 (필수, 비밀번호와 일치 검증)
- - [ ] 중복 가입 방지 (이메일과 전화번호 기준)
-
- [처리 결과]
- - [ ] 성공: "회원가입이 완료되었습니다" 메시지 → 매장 정보 등록 화면
- - [ ] 실패: 구체적인 오류 메시지 표시
-
-- M/5
-
----
-
-UFR-USER-020: [매장정보등록] 소상공인으로서 | 나는, 맞춤형 이벤트를 생성하기 위해 | 내 매장 정보를 등록하고 싶다.
-- 시나리오: 매장 정보 입력 및 사업자번호 검증
- 회원가입 완료 후 | 매장명, 업종, 주소, 사업자번호, 메뉴 정보를 입력하면 | 사업자번호 검증 후 매장 정보가 저장되고 홈 화면으로 이동한다.
-
- [입력 요구사항]
- - [ ] 매장명 입력 (최대 50자)
- - [ ] 업종 선택 (카테고리 리스트 제공: 음식점, 카페, 소매업 등)
- - [ ] 주소 입력 (도로명 주소 API 연동)
- - [ ] 메뉴/상품 정보 입력 (선택, 최대 10개)
- - 메뉴명/상품명 (최대 30자)
- - 가격 정보
- - 간단한 설명 (최대 100자)
- - [ ] 매장 특징/강점 입력 (선택, 최대 200자)
- - [ ] 대표 이미지 업로드 (선택, 최대 3장)
-
- [사업자번호 검증]
- - [ ] 사업자번호 형식 검증 (XXX-XX-XXXXX)
- - [ ] 사업자번호 유효성 확인
- - [ ] 휴폐업 여부 확인
- - [ ] 매장명과 사업자 정보 일치 확인
-
- [처리 결과]
- - [ ] 검증 성공 시 매장 정보 DB 저장 → 홈 화면(UFR-USER-002)으로 이동
- - [ ] 검증 실패 시 구체적인 오류 알림 제공
- - 형식 오류: "사업자번호 형식이 올바르지 않습니다. (XXX-XX-XXXXX 형식으로 입력해주세요)"
- - 유효성 오류: "등록되지 않은 사업자번호입니다. 번호를 다시 확인해주세요."
- - 휴폐업: "휴업 또는 폐업된 사업자입니다. 현재 운영 중인 사업자번호를 입력해주세요."
- - 정보 불일치: "입력하신 매장명과 사업자 정보가 일치하지 않습니다."
- - [ ] 오류 발생 시 해당 필드 강조 표시 및 포커스 이동
- - [ ] 재입력 가능하도록 UI 유지
-
-- M/13
-
----
-
-UFR-USER-030: [이벤트목록] 소상공인으로서 | 나는, 이벤트를 관리하기 위해 | 전체 이벤트 목록을 확인하고 상세보기를 할 수 있어야 한다.
-- 시나리오: 이벤트 목록 조회
- 홈 화면 또는 하단 네비게이션에서 | 이벤트 목록을 선택하면 | 진행 중, 종료됨, 전체 이벤트 목록이 표시된다.
-
- [목록 구성 요소]
- - [ ] 필터 탭 (진행 중 / 종료됨 / 전체)
- - [ ] 이벤트 카드 정보
- - 이벤트명
- - 진행 상태 (진행 중 / 종료됨)
- - 참여자 수
- - 남은 기간 또는 종료 일자
- - "상세보기" 버튼
- - [ ] 페이지네이션 (10개씩 표시)
-
- [처리]
- - [ ] 이벤트 목록 조회 (사용자별)
- - [ ] 진행 상태별 필터링
- - [ ] 정렬 (최신순)
-
- [네비게이션]
- - [ ] 이벤트 상세보기 → 실시간 대시보드(UFR-ANAL-010)
- - [ ] 새 이벤트 만들기 → UFR-PLAN-010
-
-- M/8
-
----
-
-UFR-USER-040: [마이페이지] 소상공인으로서 | 나는, 내 정보를 관리하기 위해 | 회원 정보와 매장 정보를 조회하고 수정하고 싶다.
-- 시나리오: 마이페이지 조회 및 수정
- 하단 네비게이션에서 | MY를 선택하면 | 회원 정보, 매장 정보, 설정을 확인하고 수정할 수 있다.
-
- [마이페이지 구성 요소]
- - [ ] 프로필 섹션
- - 사용자명
- - 이메일
- - 전화번호
- - [ ] 매장 정보 섹션
- - 매장명
- - 업종
- - 주소
- - "매장 정보 수정" 버튼
- - [ ] 설정 섹션
- - 알림 설정
- - 비밀번호 변경
- - 로그아웃
- - 회원 탈퇴
-
- [처리]
- - [ ] 사용자 정보 조회
- - [ ] 매장 정보 조회
- - [ ] 정보 수정 시 검증 및 업데이트
-
- [네비게이션]
- - [ ] 매장 정보 수정 → UFR-USER-020 (수정 모드)
- - [ ] 비밀번호 변경 → 비밀번호 변경 화면
-
-- M/8
-
----
-
-2. Event Planning 서비스
-1) AI 이벤트 기획
-UFR-PLAN-010: [이벤트목적선택] 소상공인으로서 | 나는, 효과적인 이벤트를 기획하기 위해 | 이벤트 목적을 선택하고 싶다.
-- 시나리오: 이벤트 기획 시작 및 목적 설정
- 이벤트 기획 화면에 접근한 상황에서 | 6가지 목적 중 하나를 선택하면 | 선택한 목적이 저장되고 AI 트렌드 분석이 시작된다.
-
- [목적 선택 옵션] ⭐ 6가지로 확장
- - [ ] 👥 신규 고객 유치: 신규 고객 확보에 초점 (AI 추천)
- - 예: 첫 방문 할인, 친구 추천 이벤트
- - [ ] 🔄 재방문 유도: 기존 고객의 재방문 촉진
- - 예: 스탬프 적립, 재방문 쿠폰
- - [ ] 💰 매출 증대: 객단가 향상 및 매출 증대
- - 예: 세트 할인, 한정 특가 이벤트
- - [ ] ⭐ 브랜드 인지도: 매장 홍보 및 SNS 화제
- - 예: SNS 인증샷, 바이럴 이벤트
- - [ ] 🎉 고객 참여 활성화: 커뮤니티 구축 및 소통
- - 예: 리뷰 이벤트, 고객 투표
- - [ ] 🎊 시즌/기념일 마케팅: 계절/기념일 이벤트
- - 예: 크리스마스, 창립기념일 이벤트
-
- [UI/UX 요구사항]
- - [ ] AI TIP 정보 제공 ⭐ 신규 추가
- - "선택하신 목적에 맞는 최신 트렌드와 성공 사례를 분석하여 맞춤형 이벤트를 제안해드립니다"
- - [ ] 각 목적별 설명 및 예시 제공
- - [ ] 단일 선택만 가능 (라디오 버튼)
- - [ ] 선택 후 "AI 트렌드 분석 시작" 버튼 활성화
-
-- M/5
-
----
-
-UFR-PLAN-020: [AI업종트렌드분석] 소상공인으로서 | 나는, 성공률 높은 이벤트를 기획하기 위해 | AI가 내 업종과 지역의 트렌드를 분석해주기를 원한다.
-- 시나리오: AI 기반 업종 및 지역 트렌드 분석
- 이벤트 목적 선택 후 | 시스템이 내 매장의 업종, 지역, 현재 시즌을 분석하면 | 업종별 성공 사례와 트렌드 리포트가 생성된다.
-
- [분석 입력 데이터]
- - [ ] 매장 업종 정보 (USER 서비스에서 조회)
- - [ ] 매장 위치 정보 (지역, 상권)
- - [ ] 현재 시즌 정보 (봄/여름/가을/겨울, 명절)
- - [ ] 선택한 이벤트 목적
-
- [트렌드 분석 처리]
- - [ ] 트렌드 분석 시스템 API 호출
- - [ ] 과거 동일 업종 성공 사례 데이터 분석
- - [ ] 지역별 트렌드 반영 (유동인구, 연령대 등)
- - [ ] 시즌 특성 고려 (계절 이벤트, 명절 등)
-
- [분석 결과 제공]
- - [ ] 트렌드 리포트 생성 (주요 트렌드 3-5가지)
- - [ ] Top 트렌드 강조 표시
- - [ ] 예상 참여율 표시
- - [ ] 추천 이벤트 방향 제시
- - [ ] 분석 결과를 다음 단계(경품 추천)에 전달
-
-- M/13
-
----
-
-UFR-PLAN-030: [AI이벤트상품추천] 소상공인으로서 | 나는, 예산 내에서 최적의 이벤트상품을 선정하기 위해 | AI가 타겟 고객층에 맞는 이벤트상품을 추천해주기를 원한다.
-- 시나리오: AI 기반 최적 이벤트상품 추천 및 이벤트 진행 방법 선택
- 트렌드 분석 완료 후 | 예산, 타겟 고객층, 이벤트 목적, 이벤트 진행 방법을 입력하면 | Claude API가 예산 대비 매력도가 높은 이벤트상품 Top 5를 추천한다.
-
- [입력 요구사항]
- - [ ] 예산 입력 (최소 10,000원 ~ 최대 5,000,000원)
- - [ ] 타겟 고객층 자동 설정 (업종 기반)
- - [ ] 이벤트 목적 연동 (PLAN-010에서 선택한 목적)
- - [ ] 이벤트 진행 방법 선택 (필수)
- - [옵션1] 추첨형: 기간 내 참여한 고객 중 이벤트가 끝나면 상품(쿠폰) 수량 안에서 당첨자 랜덤 추첨 진행
- - [옵션2] 선착순형: 선착순 쿠폰 소진 방식
-
- [AI 이벤트상품 추천 처리]
- - [ ] Claude API 연동
- - [ ] 프롬프트: 예산, 타겟 고객층, 이벤트 목적, 이벤트 진행 방법, 업종 정보 포함
- - [ ] 예산 대비 매력도 최대화 알고리즘 적용
- - [ ] 타겟 고객 선호도 분석
- - [ ] 이벤트 진행 방법에 따른 이벤트상품 수량 제안
-
- [추천 결과 제공]
- - [ ] 이벤트상품 목록 Top 5 생성
- - [ ] 각 이벤트상품별 예상 효과 표시 (참여율 예상)
- - [ ] 예산 범위 내 이벤트상품 필터링
- - [ ] 소상공인이 1개 선택 또는 수정 가능
-
- [이벤트상품 수정 기능]
- - [ ] 추천 이벤트상품 내용 수정 가능 (이벤트상품명, 수량, 가격)
- - [ ] 직접 이벤트상품 입력 옵션 제공
- - [ ] 수정된 내용 기반 예상 효과 재계산
- - [ ] 예산 초과 시 경고 메시지 표시
-
-- M/21
-
----
-
-UFR-PLAN-040: [AI참여방법설계] 소상공인으로서 | 나는, 고객 참여를 높이기 위해 | AI가 간단하면서도 재방문을 유도하는 참여 방법을 설계해주기를 원한다.
-- 시나리오: AI 기반 참여 방법 설계
- 이벤트상품 선택 완료 후 | 이벤트 목적, 매장 특성, 선택 이벤트상품을 기반으로 Claude API가 분석하면 | 3가지 참여 방법 옵션이 제시된다.
-
- [설계 입력 데이터]
- - [ ] 이벤트 목적 (PLAN-010)
- - [ ] 매장 특성 (업종, 위치)
- - [ ] 선택한 이벤트상품 정보 (PLAN-030)
-
- [AI 참여 방법 설계]
- - [ ] Claude API 연동
- - [ ] 간단한 참여 방법 우선 설계
- - [ ] 재방문 유도 요소 포함
- - [ ] 바이럴 확산 장치 설계 (SNS 공유 등)
-
- [참여 방법 옵션 제공]
- - [ ] 3가지 옵션 생성
- - 옵션 1: 가장 간단한 방법 (예: QR 코드 스캔)
- - 옵션 2: 재방문 유도형 (예: 매장 방문 후 리뷰 작성)
- - 옵션 3: 바이럴형 (예: SNS 공유 + 친구 태그)
- - [ ] 각 옵션별 예상 참여율 표시
- - [ ] 난이도 표시 (쉬움/보통/어려움)
- - [ ] 소상공인이 1개 선택
-
-- M/21
-
----
-
-UFR-PLAN-050: [AI홍보문구생성] 소상공인으로서 | 나는, 매력적인 홍보를 위해 | AI가 이벤트 개요에 맞는 홍보 문구를 자동으로 생성해주기를 원한다.
-- 시나리오: AI 기반 홍보 문구 자동 생성
- 참여 방법 선택 완료 후 | 이벤트 개요, 이벤트상품 정보, 참여 방법을 GPT-4 AI에 전달하면 | 5개 버전의 홍보 문구와 SNS 해시태그가 생성된다.
-
- [생성 입력 데이터]
- - [ ] 이벤트 개요 (목적, 기간)
- - [ ] 이벤트상품 정보
- - [ ] 참여 방법
- - [ ] 매장 특성
-
- [AI 홍보 문구 생성]
- - [ ] GPT-4 API 연동
- - [ ] 프롬프트: 이벤트 정보, 타겟 고객층, 매장 특성 포함
- - [ ] 5개 버전의 홍보 문구 생성
- - [ ] 각 버전별 톤앤매너 차별화 (친근함/공식적/트렌디 등)
-
- [홍보 문구 결과]
- - [ ] 문구 5개 버전 제공
- - [ ] SNS 해시태그 자동 생성 (5-10개)
- - [ ] 플랫폼별 최적화 문구 제공 (Instagram, Blog, Kakao)
- - [ ] 미리보기 기능
- - [ ] 소상공인이 1개 선택 또는 편집 가능
-
-- M/13
-
----
-
-UFR-PLAN-060: [이벤트기획안승인] 소상공인으로서 | 나는, 이벤트를 실행하기 위해 | 완성된 기획안을 검토하고 승인하고 싶다.
-- 시나리오: 완성된 이벤트 기획안 검토 및 승인
- 모든 기획 단계 완료 후 | 완성된 기획안(목적, 이벤트상품, 참여방법, 홍보문구)을 확인하면 | 승인 버튼 클릭으로 기획안이 저장되고 콘텐츠 생성 단계로 이동한다.
-
- [기획안 완성 안내] ⭐ 신규 추가
- - [ ] "완벽한 이벤트 기획안이 완성되었어요!" 제목
- - [ ] "AI가 분석한 데이터를 바탕으로 최적의 이벤트를 설계했습니다" 설명
-
- [AI 예상 성과] ⭐ 신규 추가
- - [ ] 예상 참여자 수 (예: 1,200명)
- - [ ] 참여율 (예: 75%)
- - [ ] ROI (예: 3.5배)
-
- [이벤트 미리보기] ⭐ 신규 추가
- - [ ] 이벤트 제목
- - [ ] 홍보 문구 미리보기
- - [ ] 해시태그 표시
-
- [기획안 요약 제공]
- - [ ] 🎯 이벤트 목적 (수정 버튼)
- - 선택한 목적 표시
- - [ ] 📊 트렌드 분석 (수정 버튼)
- - Top 트렌드 표시
- - 예상 참여율 표시
- - [ ] 🎁 이벤트 경품 (수정 버튼)
- - 선택한 경품 및 유형 표시
- - [ ] 📱 참여 방법 (수정 버튼)
- - 선택한 방법 및 유형 표시
- - [ ] ✍️ 홍보 문구 (수정 버튼)
- - 헤드라인 표시
- - CTA 표시
-
- [승인 처리]
- - [ ] "📝 임시저장" 버튼
- - [ ] "✅ 승인하고 다음으로" 버튼
- - [ ] 승인 시 이벤트 기획안 DB 저장
- - [ ] 이벤트 ID 생성
- - [ ] 콘텐츠 생성 단계(UFR-CONT-010)로 이동
-
- [수정 기능]
- - [ ] 각 섹션별 "수정" 버튼
- - [ ] 수정 버튼 클릭 시 해당 단계로 이동
-
-- M/8
-
----
-
-3. Content Generation 서비스
-1) 콘텐츠 자동 생성
-UFR-CONT-010: [AI이미지생성] 소상공인으로서 | 나는, 이벤트 홍보를 위해 | AI가 브랜드 컬러와 로고를 반영한 이미지 3종을 자동으로 생성해주기를 원한다.
-- 시나리오: AI 기반 이미지 자동 생성
- 콘텐츠 생성 화면에서 | 이벤트 기획안 ID, 브랜드 컬러, 로고 이미지를 전달하면 | Stable Diffusion이 3가지 스타일의 이미지를 생성한다.
-
- [입력 요구사항]
- - [ ] 이벤트 제목 (기획안에서 자동 연동)
- - [ ] 이벤트상품 이미지
- - [ ] 브랜드 컬러 (HEX 코드 입력 또는 색상 선택기)
- - [ ] 로고 이미지 업로드 (PNG, JPG, 최대 5MB)
-
- [AI 이미지 생성]
- - [ ] Stable Diffusion API 연동
- - [ ] 브랜드 컬러 자동 적용
- - [ ] 로고 자동 배치 (우측 상단 또는 중앙 하단)
- - [ ] 3가지 스타일 생성
- - 심플: 미니멀 디자인
- - 화려: 풍성한 그래픽 요소
- - 트렌디: 최신 디자인 트렌드 반영
-
- [생성 결과]
- - [ ] 이미지 3종 제공 (각각 1080x1080 해상도)
- - [ ] 미리보기 기능
- - [ ] 이미지 다운로드 가능
- - [ ] 1개 선택하여 다음 단계 진행
-
-- M/34
-
----
-
-UFR-CONT-020: [AI영상제작] 소상공인으로서 | 나는, 효과적인 홍보를 위해 | AI가 선택한 이미지를 기반으로 15초 홍보 영상을 자동 제작해주기를 원한다. ⭐ 신규 추가
-- 시나리오: AI 기반 15초 홍보 영상 자동 제작
- 이미지 선택 완료 후 | 선택한 이미지, 홍보 문구, 배경음악을 전달하면 | AI 영상 제작 엔진이 15초 홍보 영상을 생성한다.
-
- [입력 요구사항]
- - [ ] 선택한 이미지 (UFR-CONT-010에서 선택)
- - [ ] 홍보 문구 (기획안에서 자동 연동)
- - [ ] 배경음악 선택 (3가지 옵션 제공)
- - 경쾌한 음악
- - 차분한 음악
- - 트렌디한 음악
-
- [AI 영상 제작]
- - [ ] AI 영상 제작 엔진 API 연동
- - [ ] 이미지 애니메이션 효과 적용
- - [ ] 텍스트 자막 자동 삽입 (홍보 문구)
- - [ ] 배경음악 자동 삽입
- - [ ] 15초 길이로 자동 편집
-
- [영상 생성 결과]
- - [ ] 15초 영상 파일 (MP4, 1080x1920 세로형)
- - [ ] 미리보기 재생 기능
- - [ ] 영상 다운로드 가능
- - [ ] 다음 단계(SNS 콘텐츠 생성)로 진행
-
- [성능 요구사항]
- - [ ] 영상 제작 시간: 3-5분 이내
- - [ ] 진행 상황 실시간 표시 (사용자 경험 개선)
-
-- M/34
-
----
-
-UFR-CONT-030: [SNS콘텐츠생성] 소상공인으로서 | 나는, 다양한 SNS에 게시하기 위해 | 플랫폼별로 최적화된 콘텐츠를 자동으로 생성해주기를 원한다.
-- 시나리오: SNS 플랫폼별 최적화 콘텐츠 생성
- 이미지 및 영상 생성 완료 후 | Instagram, Naver Blog, Kakao Channel을 선택하면 | 각 SNS 플랫폼에 최적화된 해상도와 형식의 콘텐츠가 생성된다.
-
- [SNS 플랫폼 선택]
- - [ ] Instagram (선택)
- - [ ] Naver Blog (선택)
- - [ ] Kakao Channel (선택)
- - [ ] 최소 1개 이상 플랫폼 선택 필수
-
- [플랫폼별 최적화]
- - [ ] Instagram: 1080x1080 (정사각형)
- - [ ] Naver Blog: 800x600 (가로형)
- - [ ] Kakao Channel: 800x800 (정사각형)
-
- [콘텐츠 생성]
- - [ ] 선택한 이미지를 플랫폼별 해상도로 자동 조정
- - [ ] 해시태그 자동 삽입 (기획안의 해시태그 활용)
- - [ ] 플랫폼별 텍스트 최적화 (글자 수 제한 고려)
-
- [생성 결과]
- - [ ] 플랫폼별 최적화 이미지 파일
- - [ ] 각 플랫폼용 게시 텍스트
- - [ ] 미리보기 기능
- - [ ] 일괄 다운로드 가능 (ZIP 파일)
-
-- M/21
-
----
-
-UFR-CONT-040: [QR포스터생성] 소상공인으로서 | 나는, 오프라인 홍보를 위해 | QR 코드가 포함된 인쇄용 포스터를 생성하고 싶다.
-- 시나리오: 콘텐츠 생성 후 QR 코드 포스터 생성 여부 선택
- 콘텐츠 생성 완료 후 | QR 포스터 생성 여부를 묻는 화면에서 "생성" 선택 시 | QR 연결 URL과 포스터 크기를 입력하면 | QR 코드가 포함된 인쇄용 포스터 PDF가 생성된다.
-
- [QR 포스터 생성 여부 선택]
- - [ ] "QR 포스터 생성" 선택 시: QR 포스터 생성 화면으로 이동
- - [ ] "생성 안 함" 선택 시: 콘텐츠 편집 단계(UFR-CONT-050)로 바로 이동
-
- [입력 요구사항] (QR 포스터 생성 선택 시)
- - [ ] QR 연결 URL (이벤트 참여 페이지 URL)
- - [ ] 포스터 크기 선택 (A4 또는 A3)
-
- [QR 포스터 생성]
- - [ ] QR 코드 생성 API 연동
- - [ ] 선택한 이미지를 배경으로 사용
- - [ ] QR 코드 배치 (하단 중앙)
- - [ ] 이벤트 정보 텍스트 삽입 (제목, 기간, 이벤트상품)
- - [ ] 인쇄 최적화 (300dpi 이상)
-
- [생성 결과]
- - [ ] A4 포스터 PDF
- - [ ] A3 포스터 PDF (선택 시)
- - [ ] QR 코드 단독 이미지 (PNG)
- - [ ] 다운로드 가능
-
-- M/8
-
----
-
-UFR-CONT-050: [콘텐츠편집] 소상공인으로서 | 나는, 콘텐츠를 개인화하기 위해 | 생성된 콘텐츠를 수정하고 싶다.
-- 시나리오: 생성된 콘텐츠 편집
- 전체 콘텐츠 미리보기 화면에서 | 수정이 필요한 콘텐츠를 선택하면 | 간단한 편집 도구로 수정할 수 있다.
-
- [편집 가능 항목]
- - [ ] 이미지: 텍스트 수정, 색상 조정
- - [ ] 영상: 자막 수정, 배경음악 변경 ⭐ 신규 추가
- - [ ] SNS 콘텐츠: 게시 텍스트 편집
- - [ ] QR 포스터: 텍스트 수정, 레이아웃 조정 (생성한 경우)
-
- [편집 도구]
- - [ ] 텍스트 편집기 (폰트, 크기, 색상 변경)
- - [ ] 색상 선택기
- - [ ] 레이아웃 템플릿 변경
- - [ ] 미리보기 실시간 반영
-
- [편집 완료]
- - [ ] 저장 버튼으로 수정사항 적용
- - [ ] 편집 이력 관리 (최대 3개 버전)
- - [ ] 원본으로 되돌리기 가능
-
-- S/13
-
----
-
-UFR-CONT-060: [콘텐츠최종승인] 소상공인으로서 | 나는, 배포 전에 | 완성된 콘텐츠를 검토하고 승인하고 싶다.
-- 시나리오: 완성된 콘텐츠 최종 승인
- 모든 콘텐츠 생성 완료 후 | 전체 콘텐츠 미리보기를 확인하면 | 승인 버튼으로 콘텐츠를 저장하고 배포 단계로 이동한다.
-
- [콘텐츠 미리보기]
- - [ ] 이미지 3종
- - [ ] 영상 (15초) ⭐ 신규 추가
- - [ ] SNS 콘텐츠 (플랫폼별)
- - [ ] QR 포스터 (생성한 경우)
-
- [승인 처리]
- - [ ] 승인 버튼 클릭 시 콘텐츠 DB 저장
- - [ ] 콘텐츠 ID 생성
- - [ ] 배포 단계(UFR-DIST-010)로 이동
-
- [성능 기준]
- - [ ] 전체 콘텐츠 생성 5-8분 이내 완료 (영상 포함) ⭐ 업데이트
-
-- M/3
-
----
-
-4. Distribution 서비스
-1) 다중 채널 배포
-UFR-DIST-010: [다중채널배포설정] 소상공인으로서 | 나는, 이벤트를 효과적으로 홍보하기 위해 | 여러 채널에 한 번에 배포할 수 있기를 원한다.
-- 시나리오: 배포 채널 선택 및 설정
- 배포 화면에서 | 원하는 배포 채널을 선택하고 배포 일시를 설정하면 | 선택한 채널 목록이 저장되고 각 채널별 배포가 시작된다.
-
- [배포 진행 단계 표시] ⭐ 신규 추가
- - [ ] "배포 1/3: 채널 선택" 진행 상태 표시
- - [ ] "선택된 채널: N개 채널" 요약 정보 표시
-
- [배포 채널 선택 - KT 채널] ⭐ 섹션 구분 명확화
- - [ ] "KT 채널" 섹션 제목
- - [ ] 우리동네TV (추천 뱃지) (선택)
- - "지역 주변 노출" 설명
- - "설정 ›" 버튼
- - [ ] 링고비즈 연결음 (선택)
- - "매장 전화 연결음" 설명
- - "설정 ›" 버튼
- - [ ] 지니TV 광고 (선택)
- - "TV 광고 송출" 설명
- - "설정 ›" 버튼
-
- [배포 채널 선택 - SNS 채널] ⭐ 섹션 구분 명확화
- - [ ] "SNS 채널" 섹션 제목
- - [ ] Instagram (필수 뱃지) (선택)
- - "인스타그램 게시물" 설명
- - 계정 연동 상태 표시 ("✓ 계정 연동됨" 또는 "계정 연동 필요")
- - 연동되지 않은 경우 "계정 연동하기" 버튼
- - [ ] Naver Blog (선택)
- - "네이버 블로그" 설명
- - 계정 연동 상태 표시
- - 연동되지 않은 경우 "계정 연동하기" 버튼
- - [ ] Kakao Channel (선택)
- - "카카오톡 채널" 설명
- - 계정 연동 상태 표시
- - 연동되지 않은 경우 "계정 연동하기" 버튼
- - [ ] 최소 1개 이상 채널 선택 필수
-
- [배포 시간 설정] ⭐ 섹션 추가
- - [ ] "배포 시간" 섹션 제목
- - [ ] 즉시 배포 (선택)
- - "지금 바로 선택한 채널에 배포" 설명
- - [ ] 예약 배포 (선택)
- - "원하는 날짜와 시간에 배포" 설명
- - 날짜 및 시간 선택 UI
-
- [배포 시작]
- - [ ] "임시저장" 버튼
- - [ ] "다음 (배포 시작)" 버튼
- - [ ] 선택한 채널 목록 저장
- - [ ] 배포 요청 이벤트 발생
- - [ ] 각 채널별 병렬 배포 시작
-
-- M/13
-
----
-
-UFR-DIST-020: [우리동네TV배포] 소상공인으로서 | 나는, 주변 지역 고객에게 도달하기 위해 | 우리동네TV에 반경과 시간대를 설정하여 배포하고 싶다.
-- 시나리오: 우리동네TV 배포 설정 및 송출
- 배포 채널로 우리동네TV 선택 시 | 반경(500m/1km)과 송출 시간대를 설정하면 | 15초 영상이 해당 지역에 송출된다.
-
- [배포 설정]
- - [ ] 반경 선택 (500m 또는 1km)
- - [ ] 송출 시간대 선택 (평일 저녁 6-9시, 주말 점심 12-2시 등)
- - [ ] 15초 영상 파일 전달 (CONT-020)
-
- [우리동네TV API 연동]
- - [ ] 우리동네TV API 호출
- - [ ] 매장 위치 기반 타겟 지역 설정
- - [ ] 송출 시간대 예약
- - [ ] 영상 파일 업로드
-
- [배포 결과]
- - [ ] 배포 ID 발급
- - [ ] 예상 노출 수 제공
- - [ ] 송출 스케줄 확인 가능
-
-- M/21
-
----
-
-UFR-DIST-030: [링고비즈연결음업데이트] 소상공인으로서 | 나는, 전화하는 고객에게도 홍보하기 위해 | 매장 전화번호의 연결음을 이벤트 내용으로 자동 업데이트하고 싶다.
-- 시나리오: 링고비즈 연결음 업데이트
- 배포 채널로 링고비즈 선택 시 | 매장 전화번호와 연결음 파일을 전달하면 | 연결음이 자동으로 업데이트된다.
-
- [연결음 생성]
- - [ ] 홍보 문구 기반 연결음 스크립트 자동 생성
- - [ ] 네이버 클로바(Clova) TTS 엔진을 이용한 음성 파일 생성
- - [ ] 음성 톤 선택 가능 (친근한 톤, 공식적인 톤, 활기찬 톤 등)
- - [ ] 또는 사전 녹음 파일 업로드 (MP3, WAV 형식)
-
- [네이버 클로바 TTS 연동]
- - [ ] 네이버 클로바 TTS API 연동
- - [ ] 음성 합성 옵션 설정 (음색, 속도, 톤)
- - [ ] 고품질 음성 파일 생성 (16kHz 이상)
- - [ ] 생성된 음성 파일 미리듣기 기능
-
- [링고비즈 API 연동]
- - [ ] 링고비즈 API 호출
- - [ ] 매장 전화번호 전달 (USER 서비스에서 조회)
- - [ ] 연결음 파일 업로드
- - [ ] 업데이트 요청
-
- [업데이트 결과]
- - [ ] 업데이트 완료 시각 확인
- - [ ] 연결음 미리듣기 가능
- - [ ] 롤백 기능 (이전 연결음으로 복구)
-
-- S/13
-
----
-
-UFR-DIST-040: [지니TV광고배포] 소상공인으로서 | 나는, 가정의 TV를 통해 홍보하기 위해 | 지니TV에 예산과 타겟 지역을 설정하여 광고를 배포하고 싶다.
-- 시나리오: 지니TV 광고 예약 및 송출
- 배포 채널로 지니TV 선택 시 | 타겟 지역, 노출 시간대, 예산을 설정하면 | 지니TV에 광고가 예약되고 노출된다.
-
- [광고 설정]
- - [ ] 타겟 지역 선택 (매장 주변 반경 1km, 3km, 5km)
- - [ ] 노출 시간대 선택 (아침/점심/저녁/심야)
- - [ ] 예산 입력 (최소 100,000원)
-
- [지니TV API 연동]
- - [ ] 지니TV 광고 플랫폼 API 호출
- - [ ] 타겟 지역 설정
- - [ ] 노출 시간대 및 빈도 설정
- - [ ] 예산 기반 노출량 자동 계산
- - [ ] 영상 파일 업로드 (15초 영상)
-
- [광고 예약 결과]
- - [ ] 광고 ID 발급
- - [ ] 노출 스케줄 확인
- - [ ] 예상 노출 횟수 및 도달 가구 수 제공
-
-- M/21
-
----
-
-UFR-DIST-050: [SNS자동포스팅] 소상공인으로서 | 나는, 온라인 고객에게 도달하기 위해 | Instagram, Naver Blog, Kakao Channel에 자동으로 포스팅하고 싶다.
-- 시나리오: SNS 플랫폼 자동 포스팅
- 배포 채널로 SNS 선택 시 | 플랫폼별 계정 연동 후 예약 시간을 설정하면 | 각 SNS에 자동으로 포스팅된다.
-
- [계정 연동]
- - [ ] Instagram 계정 OAuth 연동
- - [ ] Naver Blog 계정 OAuth 연동
- - [ ] Kakao Channel 계정 OAuth 연동
- - [ ] 연동 상태 확인
-
- [포스팅 설정]
- - [ ] 즉시 포스팅 또는 예약 포스팅
- - [ ] 예약 시간 설정 (플랫폼별 개별 설정 가능)
- - [ ] 게시물 미리보기
-
- [SNS API 연동 (병렬 처리)]
- - [ ] Instagram API 호출
- - [ ] Naver Blog API 호출
- - [ ] Kakao Channel API 호출
- - [ ] 플랫폼별 최적화 콘텐츠 및 텍스트 전달
-
- [포스팅 결과]
- - [ ] 각 플랫폼별 포스팅 완료 확인
- - [ ] 게시물 URL 제공
- - [ ] 포스팅 실패 시 재시도 (최대 3회)
-
-- M/13
-
----
-
-UFR-DIST-060: [오프라인자료다운로드] 소상공인으로서 | 나는, 매장 내 홍보를 위해 | QR 포스터와 인쇄용 PDF를 다운로드하고 싶다.
-- 시나리오: 오프라인 홍보 자료 다운로드
- 배포 완료 화면에서 | 오프라인 자료 다운로드 버튼을 클릭하면 | QR 포스터와 인쇄용 PDF가 다운로드된다.
-
- [다운로드 자료]
- - [ ] QR 코드 포스터 (A4 PDF)
- - [ ] QR 코드 포스터 (A3 PDF)
- - [ ] QR 코드 단독 이미지 (PNG)
- - [ ] 인쇄용 이미지 (고해상도 300dpi 이상)
-
- [다운로드 기능]
- - [ ] 개별 파일 다운로드
- - [ ] 전체 파일 일괄 다운로드 (ZIP)
- - [ ] 다운로드 이력 관리
-
- [성능 기준]
- - [ ] 전체 배포 과정 1분 이내 완료
-
-- S/5
-
----
-
-5. Participation 서비스
-1) 이벤트 참여 관리
-UFR-PART-010: [이벤트참여신청] 고객으로서 | 나는, 이벤트상품을 받기 위해 | 간편하게 이벤트에 참여하고 싶다.
-- 시나리오: 고객의 이벤트 참여 신청
- 고객이 이벤트를 발견한 상황에서 | 이름, 전화번호, 참여 경로를 입력하고 참여 버튼을 클릭하면 | 참여 정보가 접수되고 응모번호가 발급된다.
-
- [이벤트 발견 경로]
- - [ ] 우리동네TV
- - [ ] 지니TV
- - [ ] 링고 비즈 (연결음)
- - [ ] SNS (Instagram, Blog, Kakao)
- - [ ] QR 코드 스캔
-
- [참여 정보 입력]
- - [ ] 고객명 입력 (필수)
- - [ ] 전화번호 입력 (필수, 010-XXXX-XXXX 형식)
- - [ ] 참여 경로 자동 추적 또는 선택
- - [ ] 개인정보 수집 동의 체크 (필수)
-
- [참여 신청 처리]
- - [ ] 입력 정보 검증 (형식 확인)
- - [ ] 중복 참여 체크 (전화번호 기준)
- - [ ] 참여 데이터 저장
-
- [참여 완료]
- - [ ] 응모번호 자동 발급
- - [ ] 참여 완료 메시지 표시
- - [ ] 당첨 발표일 안내
-
- [Policy]
- - 1인 1회 참여 제한
- - 개인정보 보호 규정 준수
-
-- M/8
-
----
-
-UFR-PART-020: [중복참여방지] 시스템으로서 | 나는, 공정한 이벤트 운영을 위해 | 1인 1회 참여만 허용하고 싶다.
-- 시나리오: 중복 참여 방지 및 차단
- 고객이 참여 신청 시 | 전화번호 기반으로 중복 여부를 확인하면 | 중복 참여는 차단하고 정상 참여만 접수한다.
-
- [중복 체크 처리]
- - [ ] 참여자 DB에서 전화번호 조회
- - [ ] 동일 이벤트 ID에 대한 중복 여부 확인
- - [ ] 매장 방문 고객 여부 확인 (가산점 부여용)
-
- [중복 참여 차단]
- - [ ] 중복 참여 시 "이미 참여하셨습니다" 메시지
- - [ ] 이전 참여 일시 표시
- - [ ] 재참여 불가 안내
-
- [정상 참여 처리]
- - [ ] 중복 없음 확인
- - [ ] 참여 정보 DB 저장
- - [ ] 참여 ID 생성
- - [ ] 참여 일시 기록
- - [ ] 참여 채널 기록
- - [ ] 매장 방문 고객인 경우 가산점 부여 플래그
-
- [Policy]
- - 전화번호 기반 중복 체크
- - 매장 방문 고객 가산점 부여
-
-- M/8
-
----
-
-UFR-PART-030: [자동당첨자추첨] 소상공인으로서 | 나는, 수동 관리 부담을 줄이기 위해 | 추첨형 이벤트 종료 시 자동으로 당첨자가 추첨되기를 원한다.
-- 시나리오: 추첨형 이벤트 종료 후 자동 추첨
- 추첨형 이벤트 종료 시각 도래 시 | 시스템이 자동으로 참여자 목록을 조회하면 | 공정한 알고리즘으로 당첨자를 추첨하고 명단을 생성한다.
-
- [추첨 시작 트리거]
- - [ ] 이벤트 진행 방법 확인 (UFR-PLAN-030에서 선택한 방법)
- - [ ] 추첨형 이벤트: 종료 시각 자동 감지하여 추첨 시작
- - [ ] 선착순형 이벤트: 추첨 진행하지 않음 (쿠폰 소진 시 자동 종료)
- - [ ] 스케줄러에 의한 자동 추첨 시작 (추첨형만)
- - [ ] 또는 소상공인의 수동 추첨 요청 (추첨형만)
-
- [당첨자 추첨 처리] (추첨형 이벤트만)
- - [ ] 참여자 목록 조회 (이벤트 ID 기준)
- - [ ] 중복 참여자 제외
- - [ ] 매장 방문 고객 가산점 적용
- - [ ] 난수 기반 무작위 추첨 알고리즘
- - [ ] 당첨 인원만큼 추첨 (기획안에 정의된 인원)
-
- [선착순형 이벤트 처리]
- - [ ] 쿠폰 소진 시 자동으로 이벤트 종료
- - [ ] 참여 순서대로 당첨자 자동 확정
- - [ ] 추첨 과정 없음
-
- [추첨 결과] (추첨형 이벤트)
- - [ ] 당첨자 목록 생성
- - [ ] 추첨 과정 로그 기록 (감사 추적용)
- - [ ] 당첨자 정보 DB 저장
- - [ ] 소상공인에게 당첨자 명단 제공
-
-- M/13
-
----
-
-UFR-PART-040: [당첨알림발송] 고객으로서 | 나는, 당첨 여부를 빠르게 확인하기 위해 | SMS나 카카오 알림톡으로 당첨 알림을 받고 싶다.
-- 시나리오: 당첨자에게 당첨 알림 발송
- 당첨자 추첨 완료 후 | 시스템이 당첨자 목록과 이벤트상품 정보를 전달하면 | SMS 또는 카카오 알림톡이 자동 발송된다.
-
- [알림 발송 준비]
- - [ ] 당첨자 목록 조회
- - [ ] 이벤트상품 정보 조회
- - [ ] 매장 정보 조회 (수령 장소 안내용)
-
- [SMS/알림톡 발송]
- - [ ] SMS/카카오 알림톡 시스템 API 연동
- - [ ] 당첨 축하 메시지 생성
- - [ ] 이벤트상품 정보 포함
- - [ ] 이벤트상품 수령 방법 안내
- - [ ] 수령 기한 안내 (예: 발표일로부터 7일 이내)
- - [ ] 매장 연락처 포함
-
- [발송 결과]
- - [ ] 발송 성공/실패 확인
- - [ ] 발송 이력 저장
- - [ ] 실패 시 재발송 시도 (최대 3회)
-
- [미당첨자 처리]
- - [ ] 미당첨자에게는 별도 알림 미발송
- - [ ] 또는 참여 감사 메시지 발송 (옵션)
-
-- M/8
-
----
-
-UFR-PART-050: [당첨자명단관리] 소상공인으로서 | 나는, 이벤트상품을 지급하기 위해 | 당첨자 명단을 확인하고 관리하고 싶다.
-- 시나리오: 당첨자 명단 조회 및 관리
- 당첨자 추첨 완료 후 | 소상공인이 당첨자 관리 화면에 접근하면 | 당첨자 명단과 이벤트상품 지급 상태를 확인하고 업데이트할 수 있다.
-
- [당첨자 명단 조회]
- - [ ] 이벤트별 당첨자 목록 표시
- - [ ] 당첨자 정보: 이름, 전화번호, 응모번호, 참여일시
- - [ ] 이벤트상품 정보 표시
- - [ ] 이벤트상품 지급 상태 (미지급/지급완료)
-
- [이벤트상품 지급 관리]
- - [ ] 이벤트상품 지급 상태 업데이트 (체크박스)
- - [ ] 지급 일시 자동 기록
- - [ ] 지급 완료 시 당첨자에게 확인 문자 발송 (옵션)
-
- [데이터 다운로드]
- - [ ] 당첨자 명단 엑셀 다운로드
- - [ ] 참여자 전체 명단 다운로드 (분석용)
-
-- M/5
-
----
-
-6. Analytics 서비스
-1) 효과 측정 및 분석
-UFR-ANAL-010: [실시간대시보드조회] 소상공인으로서 | 나는, 이벤트 성과를 즉시 파악하기 위해 | 실시간으로 참여자 수, 노출 수, 전환율을 확인하고 싶다.
-- 시나리오: 실시간 효과 측정 대시보드 조회
- 이벤트 배포 완료 후 | 효과 측정 대시보드에 접근하면 | 5분 간격으로 업데이트되는 실시간 데이터를 확인할 수 있다.
-
- [기간 필터] ⭐ 신규 추가
- - [ ] "오늘" 버튼
- - [ ] "최근 7일" 버튼
- - [ ] "최근 30일" 버튼
- - [ ] "전체" 버튼
-
- [대시보드 주요 지표]
- - [ ] 👥 총 참여자 수 (실시간)
- - 전일 대비 증감율 표시 (예: +23.3%)
- - [ ] 🎁 당첨자 수
- - 전일 대비 증감율 표시
- - [ ] 📊 전환율 (%) ⭐ 명칭 변경 (매장 방문자 증가율 → 전환율)
- - 전일 대비 증감율 표시
- - [ ] 📈 조회수 ⭐ 신규 추가
- - 전일 대비 증감율 표시
-
- [채널별 성과 섹션] ⭐ 신규 추가
- - [ ] "채널별 성과" 제목
- - [ ] "상세보기 →" 링크 (UFR-ANAL-020으로 이동)
- - [ ] 채널별 참여자 수 막대 그래프
- - 📷 Instagram: N명
- - 📺 우리동네TV: N명
- - 📝 Naver 블로그: N명
- - 💬 KakaoTalk: N명
-
- [최근 활동 섹션] ⭐ 신규 추가
- - [ ] "최근 활동" 제목
- - [ ] 활동 타임라인 (최대 5개)
- - 🎉 새로운 당첨자 선정 알림 (시간 표시)
- - 👤 새로운 참여자 알림 (채널별)
- - 📊 조회수 돌파 알림
- - 💰 경품 지급 완료 알림
- - 📱 당첨 알림 발송 알림
-
- [빠른 이동 버튼] ⭐ 신규 추가
- - [ ] 🎯 당첨자 관리 (UFR-PART-050)
- - [ ] 📊 성과 분석 (UFR-ANAL-020)
- - [ ] 💰 ROI 분석 (UFR-ANAL-030)
- - [ ] 📄 리포트 (UFR-ANAL-040)
-
- [실시간 데이터 수집]
- - [ ] 5분 간격 자동 업데이트
- - [ ] KT 채널 데이터 수집 API 연동 (우리동네TV, 지니TV)
- - [ ] POS 시스템 연동 (매장 방문, 매출 데이터)
- - [ ] SNS 플랫폼 데이터 수집 (Instagram, Naver Blog, Kakao Channel)
-
- [대시보드 UI]
- - [ ] 그래프 시각화 (시간대별 추이)
- - [ ] 숫자 대형 표시 (핵심 지표)
- - [ ] 새로고침 버튼
- - [ ] 자동 새로고침 옵션
-
-- M/21
-
----
-
-UFR-ANAL-020: [채널별성과분석] 소상공인으로서 | 나는, 효과적인 채널을 파악하기 위해 | 우리동네TV, 지니TV, SNS 등 채널별 노출 수와 참여율을 비교하고 싶다.
-- 시나리오: 채널별 성과 비교 분석
- 효과 측정 대시보드에서 | 채널별 분석 탭을 선택하면 | 각 채널의 노출 수, 참여율, 전환율이 비교되어 표시된다.
-
- [채널별 데이터 수집]
- - [ ] 우리동네TV: 노출 수, 도달률
- - [ ] 지니TV: 노출 수, 도달 가구 수
- - [ ] Instagram: 조회 수, 좋아요, 저장 수, 공유 수 (Instagram Graph API 활용)
- - [ ] Naver Blog: 방문자 수, 조회 수
- - [ ] Kakao Channel: 조회 수, 클릭 수 (Kakao API 활용)
- - [ ] QR 코드: 스캔 횟수 (자체 QR 코드 추적 시스템)
-
- [성과 지표 계산]
- - [ ] 노출 수 (Impression)
- - [ ] 참여율 (Participation Rate = 참여 수 / 노출 수)
- - [ ] 전환율 (Conversion Rate = 매장 방문 / 참여 수)
- - [ ] 채널별 비용 대비 효과 (Cost per Acquisition)
-
- [비교 분석 시각화]
- - [ ] 채널별 막대 그래프
- - [ ] 파이 차트 (참여 비율)
- - [ ] 효율성 순위표
- - [ ] 가장 효과적인 채널 강조 표시
-
-- M/13
-
----
-
-UFR-ANAL-030: [광고수익률자동계산] 소상공인으로서 | 나는, 투자 대비 효과를 명확히 알기 위해 | 총비용 대비 수익(광고 수익률)이 자동으로 계산되기를 원한다.
-- 시나리오: 광고 수익률 자동 계산 및 분석
- 이벤트 진행 중 또는 종료 후 | 효과 측정 대시보드에서 | 투자 비용 대비 수익이 자동으로 계산되어 표시된다.
-
- [비용 데이터 수집]
- - [ ] 이벤트상품 비용 (기획안에서 자동 조회)
- - [ ] 플랫폼 이용 비용
- - 우리동네TV 광고비
- - 지니TV 광고비
- - SNS 광고비 (있는 경우)
- - [ ] 총 투자 비용 계산
-
- [수익 데이터 수집]
- - [ ] 매출 증가액 (이벤트 기간 매출 - 평균 매출)
- - [ ] 신규 고객 수 × 예상 LTV (Lifetime Value)
- - [ ] 총 수익 계산
-
- [ROI 계산]
- - [ ] ROI = (수익 - 비용) / 비용 × 100
- - [ ] 손익분기점 계산
- - [ ] 회수 기간 예상
-
- [결과 표시]
- - [ ] ROI 퍼센트 대형 표시
- - [ ] 손익 분기 달성 여부
- - [ ] 비용/수익 상세 내역
- - [ ] 그래프 시각화
-
-- M/13
-
----
-
-UFR-ANAL-040: [분석리포트생성] 소상공인으로서 | 나는, 이벤트 결과를 정리하기 위해 | 종합 분석 리포트를 PDF로 다운로드하고 싶다.
-- 시나리오: 종합 분석 리포트 생성 및 다운로드
- 이벤트 종료 후 | 리포트 생성 버튼을 클릭하면 | 전체 성과를 요약한 PDF 리포트가 생성되어 다운로드된다.
-
- [리포트 포함 내용]
- - [ ] 이벤트 개요 (목적, 기간, 이벤트상품)
- - [ ] 참여 통계 (총 참여자 수, 채널별 참여 분포)
- - [ ] 노출 통계 (채널별 노출 수, 도달률)
- - [ ] 매출 분석 (매출 증가율, 객단가 변화)
- - [ ] 광고 수익률 분석 (투자 대비 수익)
- - [ ] 채널별 성과 비교
- - [ ] 업종 평균 대비 벤치마킹
- - [ ] 그래프 및 차트 시각화
-
- [리포트 생성]
- - [ ] 데이터 수집 및 집계
- - [ ] 그래프 이미지 생성
- - [ ] PDF 레이아웃 생성
- - [ ] PDF 파일 생성
-
- [다운로드]
- - [ ] PDF 다운로드 링크 제공
- - [ ] 파일명: "이벤트명_분석리포트_YYYYMMDD.pdf"
- - [ ] 이메일 발송 옵션
-
-- S/8
-
----
-
-7. AI Learning 서비스
-1) AI 학습 및 개선
-UFR-AIMPR-010: [AI개선안생성] 소상공인으로서 | 나는, 더 나은 이벤트를 운영하기 위해 | AI가 분석 결과를 바탕으로 구체적인 개선안을 제안해주기를 원한다.
-- 시나리오: AI 기반 이벤트 개선안 생성
- 이벤트 종료 후 | 시스템이 결과 데이터를 자동 분석하면 | AI가 성공 요인과 실패 요인을 파악하여 3가지 개선안을 제시한다.
-
- [결과 데이터 분석]
- - [ ] 빅데이터 분석 시스템 API 호출
- - [ ] 참여율 vs 목표 비교
- - [ ] 광고 수익률 vs 업종 평균 비교
- - [ ] 채널별 효율성 분석
- - [ ] 시간대별 참여 패턴 분석
- - [ ] 이벤트상품 매력도 평가
-
- [성공/실패 요인 도출]
- - [ ] 성공 요인 식별 (목표 달성 항목)
- - [ ] 실패 요인 식별 (목표 미달 항목)
- - [ ] 개선 포인트 도출
-
- [AI 개선안 생성]
- - [ ] AI 머신러닝 엔진 API 호출
- - [ ] 성공 패턴 학습 및 재활용
- - [ ] 실패 패턴 회피 로직 적용
- - [ ] 최적화 알고리즘 적용
- - [ ] 3가지 개선안 생성
- - 개선안 1: 이벤트상품 변경 (더 매력적인 이벤트상품)
- - 개선안 2: 참여 방법 단순화 (참여율 향상)
- - 개선안 3: 배포 채널 조정 (효율적 채널 집중)
-
- [개선안 제시]
- - [ ] 각 개선안별 우선순위 표시
- - [ ] 예상 효과 제공 (참여율 증가 예상치 등)
- - [ ] 소상공인이 개선안 선택 또는 피드백 제공
-
-- M/21
-
----
-
-UFR-AIMPR-020: [다음이벤트아이디어제안] 소상공인으로서 | 나는, 계절과 트렌드에 맞는 이벤트를 기획하기 위해 | AI가 시즌별 성공 이벤트 아이디어를 제안해주기를 원한다.
-- 시나리오: AI 기반 다음 이벤트 아이디어 제안
- 이벤트 종료 및 개선안 검토 후 | 다음 이벤트 아이디어 요청 버튼을 클릭하면 | AI가 시즌, 학습 결과, 트렌드를 반영한 이벤트 아이디어 5가지를 제안한다.
-
- [입력 데이터]
- - [ ] 현재 시즌 (봄/여름/가을/겨울, 명절)
- - [ ] 이벤트 목표 (신규고객/재방문/매출증대/인지도향상)
- - [ ] 이전 이벤트 학습 결과
-
- [트렌드 데이터베이스 조회]
- - [ ] 트렌드 DB API 호출
- - [ ] 계절별 성공 이벤트 조회
- - [ ] 지역 특성 반영
- - [ ] 트렌드 예측 적용 (최근 인기 이벤트 유형)
-
- [이벤트 아이디어 생성]
- - [ ] 추천 이벤트 5가지 생성
- - [ ] 각 아이디어별 상세 설명
- - [ ] 예상 성과 제공 (참여율, ROI 예상)
- - [ ] 적합한 시기 제안
-
- [아이디어 제시]
- - [ ] 아이디어 목록 표시
- - [ ] 각 아이디어 선택 시 상세 설명 확장
- - [ ] "이 아이디어로 기획 시작" 버튼
- - [ ] 선택 시 이벤트 기획 화면(PLAN-010)으로 이동
-
-- S/13
-
----
-
-UFR-AIMPR-030: [성공패턴학습] AI시스템으로서 | 나는, 추천 정확도를 높이기 위해 | 이벤트 결과 데이터를 학습하여 성공 패턴을 축적하고 싶다.
-- 시나리오: AI 학습 데이터 자동 업데이트
- 이벤트 종료 및 분석 완료 후 | 시스템이 자동으로 학습 데이터를 저장하면 | AI 모델이 성공 패턴을 학습하여 다음 추천 정확도가 향상된다.
-
- [학습 데이터 수집]
- - [ ] 이벤트 결과 데이터 (참여율, ROI, 채널 효율성 등)
- - [ ] 성공 패턴 (목표 달성 항목)
- - [ ] 실패 패턴 (목표 미달 항목)
- - [ ] 업종, 지역, 시즌 정보
-
- [학습 데이터 저장]
- - [ ] 학습 데이터 DB에 저장
- - [ ] 성공 사례 태깅
- - [ ] 실패 사례 태깅
- - [ ] 메타데이터 저장 (업종, 지역, 시즌)
-
- [AI 모델 학습]
- - [ ] 이벤트 결과 누적 데이터 기반 학습
- - [ ] 성공률 향상 학습
- - [ ] 이벤트상품 추천 알고리즘 개선
- - [ ] 참여 방법 설계 알고리즘 개선
- - [ ] 채널 효율성 예측 모델 업데이트
- - [ ] 개인화 추천 강화
-
- [학습 결과 적용]
- - [ ] 다음 이벤트 기획 시 학습된 패턴 적용
- - [ ] 추천 정확도 모니터링
- - [ ] 지속적인 성능 개선
-
-- M/34
-
----
-
-8. 비기능 요구사항
-1) 성능
-NFR-PERF-010: [AI기획속도] 시스템으로서 | 나는, 사용자 대기 시간을 최소화하기 위해 | AI 이벤트 기획을 10초 이내에 완료하고 싶다.
-- 시나리오: AI 이벤트 기획 성능 보장
- 소상공인이 이벤트 기획 시작 후 | 모든 AI 분석 및 추천 단계를 거쳐 | 10초 이내에 완성된 기획안이 제시된다.
-
- [성능 요구사항]
- - [ ] 업종 트렌드 분석: 3초 이내
- - [ ] 경품 추천: 3초 이내
- - [ ] 참여 방법 설계: 2초 이내
- - [ ] 홍보 문구 생성: 2초 이내
- - [ ] 총 처리 시간: 10초 이내
-
- [최적화 방안]
- - [ ] AI API 병렬 호출
- - [ ] 응답 캐싱 (동일 조건 재사용)
- - [ ] 프롬프트 최적화
- - [ ] 네트워크 지연 최소화
-
-- M/21
-
----
-
-NFR-PERF-020: [콘텐츠생성속도] 시스템으로서 | 나는, 효율적인 서비스를 제공하기 위해 | 이미지와 영상 콘텐츠 생성을 현실적인 시간 내에 완료하고 싶다.
-- 시나리오: 콘텐츠 생성 성능 보장
- 소상공인이 콘텐츠 생성 시작 후 | 이미지 3종, 영상 1개, SNS 콘텐츠, QR 포스터까지 | 현실적인 처리 시간 내에 모든 콘텐츠가 생성된다.
-
- [성능 요구사항]
- - [ ] 이미지 생성 (3종): 2-3분 이내 (AI 이미지 생성 특성 고려)
- - [ ] 영상 제작 (15초): 3-5분 이내 (AI 영상 제작 특성 고려) ⭐ 신규 추가
- - [ ] SNS 콘텐츠 생성: 30초 이내
- - [ ] QR 포스터 생성: 20초 이내
- - [ ] 총 처리 시간: 5-8분 이내 (단계별 병렬 처리 시) ⭐ 업데이트
-
- [최적화 방안]
- - [ ] 이미지와 영상 병렬 생성 ⭐ 업데이트
- - [ ] GPU 가속 활용
- - [ ] 콘텐츠 캐싱
- - [ ] 진행 상황 실시간 표시 (사용자 경험 개선)
- - [ ] 백그라운드 처리로 다른 작업 가능
-
- [Policy]
- - AI 생성 모델의 현실적인 처리 시간 반영
- - 품질과 속도의 균형 유지
- - 사용자에게 명확한 진행 상황 피드백 제공
-
-- M/34
-
----
-
-NFR-PERF-030: [배포속도] 시스템으로서 | 나는, 신속한 배포를 위해 | 다중 채널 배포를 1분 이내에 완료하고 싶다.
-- 시나리오: 배포 성능 보장
- 소상공인이 배포 시작 버튼 클릭 후 | 모든 선택 채널에 콘텐츠가 배포되기까지 | 1분 이내에 완료된다.
-
- [성능 요구사항]
- - [ ] 우리동네TV: 15초
- - [ ] 링고비즈: 10초
- - [ ] 지니TV: 20초
- - [ ] SNS (3개 플랫폼 병렬): 20초
- - [ ] 총 처리 시간: 1분 이내
-
- [최적화 방안]
- - [ ] 채널별 병렬 배포
- - [ ] 비동기 API 호출
- - [ ] 배포 상태 실시간 업데이트
-
-- M/21
-
----
-
-NFR-PERF-040: [실시간데이터수집] 시스템으로서 | 나는, 정확한 효과 측정을 위해 | 5분 간격으로 실시간 데이터를 수집하고 업데이트하고 싶다.
-- 시나리오: 실시간 데이터 수집 주기 보장
- 이벤트 배포 후 | 효과 측정 대시보드가 | 5분 간격으로 자동 업데이트된다.
-
- [데이터 수집 주기]
- - [ ] 5분마다 자동 데이터 수집
- - [ ] 스케줄러 기반 자동 실행
- - [ ] 실패 시 재시도 (3회)
-
- [데이터 소스]
- - [ ] KT 채널 API (우리동네TV, 지니TV)
- - [ ] POS 시스템
- - [ ] SNS 플랫폼 API (Instagram, Naver Blog, Kakao Channel)
- - [ ] 참여자 DB
-
-- M/13
-
----
-
-2) 보안
-NFR-SECU-010: [개인정보보호] 시스템으로서 | 나는, 고객 신뢰를 확보하기 위해 | 개인정보 보호 규정을 준수하고 암호화를 적용하고 싶다.
-- 시나리오: 개인정보 보호 및 암호화
- 고객의 개인정보(이름, 전화번호)가 수집될 때 | 암호화되어 저장되고 | GDPR, 개인정보보호법을 준수한다.
-
- [개인정보 암호화]
- - [ ] 전화번호 암호화 (AES-256)
- - [ ] 이름 암호화 (필요 시)
- - [ ] 전송 시 HTTPS/TLS 적용
-
- [개인정보 보호 규정 준수]
- - [ ] 개인정보 수집 동의 획득 (필수)
- - [ ] 수집 목적 명시
- - [ ] 보유 기간 설정 (이벤트 종료 후 3개월)
- - [ ] 파기 절차 자동화
-
- [접근 제어]
- - [ ] 역할 기반 접근 제어 (RBAC)
- - [ ] 소상공인은 자신의 이벤트 데이터만 접근
- - [ ] 관리자 감사 로그 기록
-
-- M/13
-
----
-
-3) 안정성
-NFR-RELI-010: [배포실패자동재시도] 시스템으로서 | 나는, 서비스 안정성을 위해 | 배포 실패 시 자동으로 3회까지 재시도하고 싶다.
-- 시나리오: 배포 실패 시 자동 재시도
- 채널 배포 중 API 오류로 실패 시 | 시스템이 자동으로 재시도하여 | 최대 3회까지 재시도 후 성공 또는 최종 실패 처리한다.
-
- [재시도 로직]
- - [ ] 배포 실패 감지
- - [ ] 1차 재시도 (5초 후)
- - [ ] 2차 재시도 (10초 후)
- - [ ] 3차 재시도 (20초 후)
- - [ ] 3회 실패 시 최종 실패 처리
-
- [실패 알림]
- - [ ] 소상공인에게 실패 알림
- - [ ] 실패 사유 제공
- - [ ] 수동 재시도 옵션 제공
-
-- M/8
-
----
-
-4) 확장성
-NFR-SCAL-010: [동시이벤트처리] 시스템으로서 | 나는, 다수의 소상공인을 지원하기 위해 | 최소 100개의 이벤트를 동시에 처리할 수 있어야 한다.
-- 시나리오: 동시 다발적 이벤트 처리
- 100명의 소상공인이 동시에 이벤트를 기획/배포하는 상황에서 | 시스템이 정상적으로 모든 요청을 처리한다.
-
- [확장성 요구사항]
- - [ ] 동시 이벤트 처리: 최소 100개
- - [ ] AI API 동시 호출: 최소 50개
- - [ ] 배포 API 동시 호출: 최소 100개
-
- [확장 전략]
- - [ ] 마이크로서비스 수평 확장 (Auto Scaling)
- - [ ] 로드 밸런싱
- - [ ] 메시지 큐 활용 (비동기 처리)
- - [ ] 캐싱 전략 (Redis)
-
-- S/21
-```
-
----
-
-## 📈 프로토타입 반영 통계
-
-| 구분 | 기존 | 추가/수정 | 합계 |
-|------|------|-----------|------|
-| User 서비스 | 3개 | 2개 | 5개 |
-| Event Planning 서비스 | 6개 | 1개 | 7개 |
-| Content Generation 서비스 | 5개 | 1개 (영상제작 신규) | 6개 |
-| Distribution 서비스 | 6개 | - | 6개 |
-| Participation 서비스 | 5개 | - | 5개 |
-| Analytics 서비스 | 4개 | - | 4개 |
-| AI Learning 서비스 | 3개 | - | 3개 |
-| 비기능 요구사항 | 5개 | - | 5개 |
-| **총계** | **37개** | **4개** | **41개** |
-
----
-
-## 🔧 기술 검토 업데이트
-
-### **신규 추가 항목**
-
-**UFR-CONT-020: AI영상제작**
-- ⚠️ 높은 기술적 복잡도
-- AI 영상 제작 엔진 연동 필요
-- 예상 처리 시간: 3-5분
-- GPU 가속 활용 권장
-- 진행 상황 실시간 표시 필수
-
-**UFR-USER-030: 이벤트목록**
-- ✅ 실현 가능
-- 표준적인 CRUD 패턴
-- 필터링 및 페이지네이션 구현
-
-**UFR-USER-040: 마이페이지**
-- ✅ 실현 가능
-- 사용자 정보 관리 표준 패턴
-
-### **주요 기술 스택 업데이트**
-
-**AI/ML 추가:**
-- AI 영상 제작 엔진 (15초 영상 자동 생성)
-- 예상 소요 시간: 3-5분
-- GPU 가속 필수
-
-**성능 요구사항 업데이트:**
-- 콘텐츠 생성 전체 시간: 5-8분 이내 (영상 포함)
-- 이미지와 영상 병렬 생성 필수
-
----
-
-## ✅ 다음 단계
-
-1. **UI/UX 설계 업데이트**: 프로토타입 기준으로 설계서 재작성
-2. **API 설계 업데이트**: 영상 제작 API 명세 추가
-3. **백엔드 설계 업데이트**: 영상 제작 서비스 추가
-4. **프론트엔드 설계 업데이트**: 하단 네비게이션 구조 반영
diff --git a/claudedocs/prototype-analysis.md b/claudedocs/prototype-analysis.md
deleted file mode 100644
index b16c822..0000000
--- a/claudedocs/prototype-analysis.md
+++ /dev/null
@@ -1,339 +0,0 @@
-# 프로토타입 분석 보고서
-
-**분석일**: 2025-10-21
-**분석자**: Frontend Architect
-**분석 범위**: design/uiux/prototype/ 디렉토리 (01번~17번 화면)
-
----
-
-## 📊 전체 화면 구성
-
-프로토타입은 총 **17개 화면**으로 구성되어 있으며, 다음과 같은 주요 영역으로 분류됩니다:
-
-### 1. 인증 영역 (01~04)
-- **01-로그인.html**: 이메일/비밀번호 로그인
-- **02-회원가입.html**: 신규 사용자 등록
-- **03-프로필.html**: 사용자 프로필 관리
-- **04-로그아웃확인.html**: 로그아웃 확인 모달
-
-### 2. 대시보드 영역 (05~06)
-- **05-대시보드.html**: 메인 홈 화면
- - KPI 요약 (진행 중 이벤트, 총 참여자, 평균 ROI)
- - 빠른 시작 (새 이벤트, 분석)
- - 진행 중인 이벤트 목록
- - 최근 활동 타임라인
-- **06-이벤트목록.html**: 전체 이벤트 목록 및 필터링
-
-### 3. 이벤트 생성 플로우 (07~12)
-- **07-이벤트목적선택.html**: 이벤트 목적 선택 (신규고객 유치, 재방문 유도, 브랜드 인지도, 고객 데이터 수집)
-- **08-AI이벤트추천.html**: AI 트렌드 분석 및 예산별 이벤트 추천 (저/중/고비용, 온라인/오프라인)
-- **09-콘텐츠미리보기.html**: SNS 이미지 스타일 선택 (카드 선택 UI)
-- **10-콘텐츠편집.html**: 텍스트 편집 및 색상 조정
-- **11-배포채널선택.html**: 배포 채널 선택 (우리동네TV, 링고비즈, SNS, QR코드)
-- **12-최종승인.html**: 이벤트 최종 검토 및 승인
-
-### 4. 이벤트 관리 및 모니터링 (13~17)
-- **13-이벤트상세.html**: 이벤트 상세 정보 및 실시간 KPI
-- **14-참여자목록.html**: 참여자 관리 및 필터링
-- **15-이벤트참여.html**: 사용자 이벤트 참여 화면 (고객용)
-- **16-당첨자추첨.html**: 당첨자 추첨 및 관리
-- **17-성과분석.html**: 실시간 대시보드 및 성과 분석
-
----
-
-## 🔄 화면 흐름도
-
-```
-[로그인/회원가입]
- ↓
-[대시보드] ←→ [프로필]
- ↓
- ├─ [이벤트목록] → [이벤트상세] → [참여자목록] → [당첨자추첨]
- │ ↓
- │ [성과분석]
- │
- └─ [새 이벤트 생성 플로우]
- ↓
- [목적선택]
- ↓
- [AI추천]
- ↓
- [콘텐츠미리보기] (스타일 선택)
- ↓
- [콘텐츠편집]
- ↓
- [배포채널선택]
- ↓
- [최종승인]
- ↓
- [이벤트상세]
-```
-
----
-
-## 🎨 주요 UI/UX 패턴
-
-### Bottom Navigation
-- **구성**: 홈, 이벤트, 분석, 프로필
-- **특징**: 모든 메인 화면에서 일관되게 표시
-- **네비게이션**:
- - 홈 → 05-대시보드.html
- - 이벤트 → 06-이벤트목록.html
- - 분석 → 17-성과분석.html
- - 프로필 → 03-프로필.html
-
-### Header
-- **구성**: 타이틀, 뒤로가기 버튼, 프로필 버튼
-- **특징**:
- - 대시보드에서는 뒤로가기 없음
- - 이벤트 생성 플로우에서는 프로필 버튼 숨김
-
-### FAB (Floating Action Button)
-- **위치**: 우측 하단 고정
-- **기능**: 새 이벤트 생성 (07-이벤트목적선택.html로 이동)
-
-### 카드 기반 UI
-- 옵션 선택, 이벤트 목록, KPI 표시 등 대부분의 콘텐츠가 카드 형식
-- 일관된 그림자, 라운드 모서리, 패딩 적용
-
----
-
-## 🔧 최근 변경사항 (세션 기록)
-
-### 1. 09-콘텐츠미리보기.html
-**변경**: Radio 버튼 → 카드 선택 UI
-- **Before**: 전통적인 Radio 버튼 리스트
-- **After**:
- - 각 스타일을 카드로 표시
- - 선택 시 카드 테두리 강조 (빨간색)
- - 우측 상단에 체크 배지 표시
- - 이미지 클릭 시 전체화면 모달로 확대
-
-**영향**: 사용자 경험 개선, 시각적 명확성 향상
-
-### 2. 10-콘텐츠편집.html
-**변경**: 로고 위치 섹션 삭제 + 색상 조정
-- **삭제**: 로고 위치 선택 (상단, 하단, 중앙) 섹션 제거
-- **유지**: 텍스트 편집, 색상 조정 기능
-- **이유**: 간소화 및 사용자 복잡도 감소
-
-### 3. 05-대시보드.html
-**변경**: AI추천, 템플릿 버튼 삭제
-- **삭제 항목**:
- - "AI 추천" 버튼
- - "템플릿" 버튼
-- **유지**: 새 이벤트, 분석 버튼만 유지
-- **이유**: 기능 중복 제거 (AI 추천은 이벤트 생성 플로우에 통합)
-
-### 4. 햄버거 메뉴 제거
-**변경**: 전체 화면에서 햄버거 메뉴 제거
-- **대체**: Bottom Navigation으로 모든 주요 기능 접근
-- **영향**: 모바일 친화적인 네비게이션 구조
-
-### 5. Bottom Navigation 연결 수정
-**변경**: 분석 탭 연결
-- **Before**: 미정의 또는 다른 경로
-- **After**: 17-성과분석.html
-- **영향**: 네비게이션 일관성 확보
-
-### 6. 13-이벤트상세.html
-**변경**: Bottom Nav focus
-- **수정**: Bottom Navigation의 포커스를 'events'로 설정
-- **이유**: 이벤트 상세는 이벤트 섹션의 하위 화면
-
----
-
-## 🎯 핵심 기능별 화면 매핑
-
-### AI 기반 이벤트 생성
-1. **목적 인식** (07-이벤트목적선택.html)
- - 신규고객 유치, 재방문 유도, 브랜드 인지도, 데이터 수집
-2. **AI 추천** (08-AI이벤트추천.html)
- - 업종/지역/시즌 트렌드 분석
- - 예산별 온라인/오프라인 이벤트 추천
-3. **콘텐츠 생성** (09-콘텐츠미리보기.html, 10-콘텐츠편집.html)
- - 이미지 스타일 선택
- - 텍스트 및 색상 편집
-4. **배포 설정** (11-배포채널선택.html)
- - 다중 채널 선택 및 옵션 설정
-5. **최종 검토** (12-최종승인.html)
- - 전체 설정 확인 및 이벤트 생성
-
-### 이벤트 관리
-- **목록 조회** (06-이벤트목록.html): 검색, 필터링, 정렬
-- **상세 모니터링** (13-이벤트상세.html): 실시간 KPI, 참여 추이
-- **참여자 관리** (14-참여자목록.html): 검색, 필터링, 엑셀 다운로드
-- **당첨 관리** (16-당첨자추첨.html): 자동 추첨 및 결과 관리
-
-### 성과 분석
-- **대시보드** (17-성과분석.html)
- - 전체 이벤트 요약 통계
- - 이벤트별 성과 비교
- - ROI 상세 분석
- - 채널별 효율성
-
----
-
-## 📱 반응형 디자인
-
-### 브레이크포인트
-- **Mobile**: 기본
-- **Tablet**: 768px 이상 (grid-cols 조정)
-- **Desktop**: 1024px 이상 (side-by-side 레이아웃)
-
-### 주요 반응형 패턴
-1. **그리드 시스템**: 모바일(1열) → 태블릿(2열) → 데스크탑(3-4열)
-2. **카드 레이아웃**: 세로 스택 → 가로 배치
-3. **네비게이션**: Bottom Nav 고정 (모든 화면)
-4. **콘텐츠 편집** (10번): 모바일(세로 스택) → 데스크탑(좌우 분할)
-
----
-
-## 🔍 삭제된 기능
-
-### 1. 햄버거 메뉴
-- **삭제 이유**: Bottom Navigation으로 대체
-- **영향**: 네비게이션 복잡도 감소
-
-### 2. 대시보드 AI추천/템플릿 버튼
-- **삭제 이유**: 기능 중복 (이벤트 생성 플로우에 통합)
-- **영향**: 화면 간소화
-
-### 3. 로고 위치 선택
-- **삭제 이유**: 편집 기능 단순화
-- **영향**: 사용자 설정 옵션 감소
-
----
-
-## ➕ 추가/변경된 기능
-
-### 1. 카드 선택 UI (09-콘텐츠미리보기.html)
-- **추가**: 비주얼 중심의 스타일 선택
-- **기능**:
- - 카드 클릭 선택
- - 이미지 전체화면 보기
- - 선택 상태 시각적 피드백
-
-### 2. 성과 분석 탭 연결
-- **추가**: Bottom Nav에서 17-성과분석.html 직접 접근
-- **영향**: 주요 기능으로 성과 분석 격상
-
-### 3. 실시간 KPI 업데이트
-- **추가**: 이벤트 상세(13번)에서 실시간 데이터 표시
-- **기능**: 참여자, 조회수, ROI, 전환율 실시간 갱신
-
----
-
-## 🎨 UI/UX 개선 포인트
-
-### 강점
-1. ✅ **일관된 디자인 시스템**: 색상, 타이포그래피, 컴포넌트
-2. ✅ **모바일 우선 설계**: Bottom Navigation, FAB
-3. ✅ **명확한 정보 계층**: 카드, 헤더, 섹션 구분
-4. ✅ **시각적 피드백**: 버튼 상태, 카드 선택, 로딩 상태
-5. ✅ **접근성 고려**: Material Icons, 명확한 레이블
-
-### 개선 권장사항
-1. ⚠️ **키보드 네비게이션**: 접근성 개선 필요
-2. ⚠️ **에러 상태 처리**: 일부 화면에서 에러 메시지 미비
-3. ⚠️ **로딩 상태**: 비동기 작업 시 로딩 인디케이터 추가 권장
-4. ⚠️ **빈 상태**: 데이터 없을 때 처리 개선
-
----
-
-## 📋 유저스토리 업데이트 핵심 사항
-
-### 1. 화면 구성 변경
-- **대시보드**: AI추천/템플릿 버튼 삭제 → "새 이벤트", "분석" 2개만
-- **네비게이션**: 햄버거 메뉴 제거 → Bottom Navigation 4개 탭
-
-### 2. 이벤트 생성 플로우 수정
-- **09번 화면**: Radio 버튼 → 카드 선택 UI
-- **10번 화면**: 로고 위치 섹션 삭제
-- **흐름**: 07 → 08 → 09 → 10 → 11 → 12
-
-### 3. 분석 기능 강화
-- **Bottom Nav**: "분석" 탭 추가 (17-성과분석.html)
-- **실시간 모니터링**: 이벤트 상세에서 실시간 KPI
-
-### 4. 주요 화면 번호
-```
-01: 로그인
-02: 회원가입
-03: 프로필
-04: 로그아웃 확인
-05: 대시보드
-06: 이벤트목록
-07: 이벤트목적선택
-08: AI이벤트추천
-09: 콘텐츠미리보기 (스타일 선택)
-10: 콘텐츠편집
-11: 배포채널선택
-12: 최종승인
-13: 이벤트상세
-14: 참여자목록
-15: 이벤트참여 (고객용)
-16: 당첨자추첨
-17: 성과분석
-```
-
-### 5. 네비게이션 구조
-```
-Bottom Navigation (모든 주요 화면):
-- 홈: 05-대시보드.html
-- 이벤트: 06-이벤트목록.html
-- 분석: 17-성과분석.html
-- 프로필: 03-프로필.html
-
-FAB (새 이벤트):
-- 07-이벤트목적선택.html
-```
-
----
-
-## 🔄 화면 간 의존성
-
-### 순차적 플로우
-1. **이벤트 생성**: 07 → 08 → 09 → 10 → 11 → 12 → 13
-2. **참여자 관리**: 13 → 14 → 16
-3. **성과 분석**: 13 → 17
-
-### 독립적 화면
-- 05 (대시보드)
-- 06 (이벤트목록)
-- 17 (성과분석)
-
----
-
-## 📊 완성도 평가
-
-| 영역 | 완성도 | 비고 |
-|------|--------|------|
-| 화면 디자인 | ✅ 95% | 일관된 디자인 시스템 |
-| 화면 흐름 | ✅ 90% | 명확한 사용자 여정 |
-| 반응형 | ✅ 85% | 주요 브레이크포인트 지원 |
-| 접근성 | ⚠️ 70% | 키보드 네비게이션 개선 필요 |
-| 에러 처리 | ⚠️ 60% | 에러 상태 보완 필요 |
-| 로딩 상태 | ⚠️ 65% | 비동기 작업 피드백 추가 권장 |
-
----
-
-## ✅ 결론
-
-프로토타입은 **17개 화면**으로 구성되어 있으며, AI 기반 이벤트 자동 생성의 전체 사용자 여정을 잘 표현하고 있습니다.
-
-**주요 강점**:
-- 명확한 정보 구조와 화면 흐름
-- 일관된 디자인 시스템
-- 모바일 친화적 네비게이션
-
-**개선 영역**:
-- 접근성 (키보드 네비게이션, 스크린 리더)
-- 에러 및 로딩 상태 처리
-- 빈 상태 디자인
-
-**유저스토리 업데이트 필요 사항**:
-1. 화면 번호 및 명칭 정리 (01~17번)
-2. 네비게이션 구조 변경 (햄버거 메뉴 제거, Bottom Nav 4개 탭)
-3. 이벤트 생성 플로우 상세화 (7단계: 목적→AI추천→스타일→편집→배포→승인→상세)
-4. 분석 기능 강화 (Bottom Nav 추가, 실시간 KPI)
diff --git a/debug/final-validation.log b/debug/final-validation.log
deleted file mode 100644
index 7c07064..0000000
--- a/debug/final-validation.log
+++ /dev/null
@@ -1,104 +0,0 @@
-=====================================
-PlantUML 파일 검증 시작 (UTF-8)
-=====================================
-
-[1] 검증 중: design/backend/sequence/inner/ai-트렌드분석및추천.puml
- ❌ 실패: ai-트렌드분석및추천.puml (HTTP 400)
-
-[2] 검증 중: design/backend/sequence/inner/analytics-대시보드조회-캐시미스.puml
- ✅ 성공: analytics-대시보드조회-캐시미스.puml
-
-[3] 검증 중: design/backend/sequence/inner/analytics-대시보드조회-캐시히트.puml
- ✅ 성공: analytics-대시보드조회-캐시히트.puml
-
-[4] 검증 중: design/backend/sequence/inner/analytics-배포완료구독.puml
- ✅ 성공: analytics-배포완료구독.puml
-
-[5] 검증 중: design/backend/sequence/inner/analytics-이벤트생성구독.puml
- ✅ 성공: analytics-이벤트생성구독.puml
-
-[6] 검증 중: design/backend/sequence/inner/analytics-참여자등록구독.puml
- ✅ 성공: analytics-참여자등록구독.puml
-
-[7] 검증 중: design/backend/sequence/inner/content-이미지생성.puml
- ❌ 실패: content-이미지생성.puml (HTTP 400)
-
-[8] 검증 중: design/backend/sequence/inner/distribution-다중채널배포.puml
- ❌ 실패: distribution-다중채널배포.puml (HTTP 400)
-
-[9] 검증 중: design/backend/sequence/inner/distribution-배포상태조회.puml
- ✅ 성공: distribution-배포상태조회.puml
-
-[10] 검증 중: design/backend/sequence/inner/event-AI추천요청.puml
- ✅ 성공: event-AI추천요청.puml
-
-[11] 검증 중: design/backend/sequence/inner/event-목록조회.puml
- ✅ 성공: event-목록조회.puml
-
-[12] 검증 중: design/backend/sequence/inner/event-목적선택.puml
- ✅ 성공: event-목적선택.puml
-
-[13] 검증 중: design/backend/sequence/inner/event-상세조회.puml
- ✅ 성공: event-상세조회.puml
-
-[14] 검증 중: design/backend/sequence/inner/event-콘텐츠선택.puml
- ✅ 성공: event-콘텐츠선택.puml
-
-[15] 검증 중: design/backend/sequence/inner/event-대시보드조회.puml
- ❌ 실패: event-대시보드조회.puml (HTTP 400)
-
-[16] 검증 중: design/backend/sequence/inner/event-추천결과조회.puml
- ✅ 성공: event-추천결과조회.puml
-
-[17] 검증 중: design/backend/sequence/inner/event-이미지결과조회.puml
- ✅ 성공: event-이미지결과조회.puml
-
-[18] 검증 중: design/backend/sequence/inner/event-이미지생성요청.puml
- ✅ 성공: event-이미지생성요청.puml
-
-[19] 검증 중: design/backend/sequence/inner/event-최종승인및배포.puml
- ✅ 성공: event-최종승인및배포.puml
-
-[20] 검증 중: design/backend/sequence/inner/participation-당첨자추첨.puml
- ✅ 성공: participation-당첨자추첨.puml
-
-[21] 검증 중: design/backend/sequence/inner/participation-이벤트참여.puml
- ✅ 성공: participation-이벤트참여.puml
-
-[22] 검증 중: design/backend/sequence/inner/participation-참여자목록조회.puml
- ✅ 성공: participation-참여자목록조회.puml
-
-[23] 검증 중: design/backend/sequence/inner/user-로그인.puml
- ✅ 성공: user-로그인.puml
-
-[24] 검증 중: design/backend/sequence/inner/user-로그아웃.puml
- ✅ 성공: user-로그아웃.puml
-
-[25] 검증 중: design/backend/sequence/inner/user-회원가입.puml
- ✅ 성공: user-회원가입.puml
-
-[26] 검증 중: design/backend/sequence/inner/user-프로필수정.puml
- ✅ 성공: user-프로필수정.puml
-
-[27] 검증 중: design/backend/sequence/outer/고객참여플로우.puml
- ✅ 성공: 고객참여플로우.puml
-
-[28] 검증 중: design/backend/sequence/outer/성과분석플로우.puml
- ✅ 성공: 성과분석플로우.puml
-
-[29] 검증 중: design/backend/sequence/outer/사용자인증플로우.puml
- ✅ 성공: 사용자인증플로우.puml
-
-[30] 검증 중: design/backend/sequence/outer/이벤트생성플로우.puml
- ❌ 실패: 이벤트생성플로우.puml (HTTP 400)
-
-=====================================
-검증 완료
-=====================================
-총 파일 수: 30
-성공: 25
-실패: 5
-
-상세 결과: debug/puml-validation/validation-result.txt
-오류 상세: debug/puml-validation/validation-errors.txt
-=====================================
diff --git a/debug/puml-validation/ai-트렌드분석및추천.puml.error.txt b/debug/puml-validation/ai-트렌드분석및추천.puml.error.txt
deleted file mode 100644
index 2502f83..0000000
--- a/debug/puml-validation/ai-트렌드분석및추천.puml.error.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-[From string (line 208) ]
-
-@startuml ai-트렌드분석및추천
-
-
-
-
-...
-... ( skipping 354 lines )
-...
- 트렌드: {트렌드}
- 매장: {매장정보}
-
- 출력 형식:
- - 이벤트 제목
- - 추천 경품 (예산: 저)
- - 참여 방법 (난이도: 낮음)
- - 예상 참여자 수
- - 예상 비용
- - 예상 ROI"
- end note
-
- AIClient -> ExternalAPI: POST /api/v1/recommend\n(저비용 옵션)
- ExternalAPI --> AIClient: 200 OK\n{추천안 1}
- AIClient --> CB: 추천안 1
- deactivate AIClient
- CB --> RecommendEngine: 옵션 1 완료
- deactivate CB
-
- and
-^^^^^
- Syntax Error? (Assumed diagram type: sequence)
diff --git a/debug/puml-validation/ai-트렌드분석및추천.puml.png b/debug/puml-validation/ai-트렌드분석및추천.puml.png
deleted file mode 100644
index 47fb9988330eb05b5ab8e6ed8ebfb37acd452725..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 228178
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 Fh*c!}Th7jww)3b6mxGma{oJTh*p
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 eqC(E+nSW@#c5P;NVOp*G
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