mirror of
https://github.com/ktds-dg0501/kt-event-marketing-fe.git
synced 2025-12-06 06:16:24 +00:00
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
503 lines
14 KiB
Markdown
503 lines
14 KiB
Markdown
# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 프론트엔드 UI/UX 설계서
|
|
|
|
## 문서 정보
|
|
- **작성일**: 2025-10-24
|
|
- **버전**: 1.0
|
|
- **기술 스택**: Next.js 14 + React 18 + TypeScript 5
|
|
- **기반 문서**: design/uiux/uiux-design.md, 프로토타입 분석
|
|
- **프로토타입**: design/uiux/prototype/\*.html
|
|
|
|
---
|
|
|
|
## 1. UI/UX 설계
|
|
|
|
### 1.1 UI 프레임워크 선택
|
|
|
|
**선택한 프레임워크**: Material-UI (MUI) v6
|
|
|
|
**선택 이유**:
|
|
- React 18과 Next.js 14와의 완벽한 호환성
|
|
- TypeScript 기본 지원
|
|
- 모바일 우선 반응형 디자인 (Mobile First)
|
|
- 접근성 (WCAG 2.1 AA) 기본 준수
|
|
- 풍부한 컴포넌트 라이브러리
|
|
- KT 브랜드 컬러 커스터마이징 용이
|
|
|
|
**대안 고려**:
|
|
- Ant Design: 한국어 지원 우수하나 파일 크기가 큼
|
|
- Chakra UI: 경량이나 기업 디자인 시스템에 부적합
|
|
- Tailwind CSS + HeadlessUI: 커스터마이징은 우수하나 개발 속도 느림
|
|
|
|
**최종 결정**: MUI의 컴포넌트 완성도와 기업용 UI 패턴 지원으로 선택
|
|
|
|
---
|
|
|
|
### 1.2 화면 목록 정의
|
|
|
|
#### 인증 영역 (4개)
|
|
| 화면 ID | 화면명 | URL | 설명 |
|
|
|---------|--------|-----|------|
|
|
| AUTH-01 | 로그인 | `/login` | 전화번호/비밀번호 로그인 |
|
|
| AUTH-02 | 회원가입 | `/register` | 소상공인 회원가입 (매장 정보 포함) |
|
|
| AUTH-03 | 프로필 | `/profile` | 사용자 및 매장 정보 관리 |
|
|
| AUTH-04 | 로그아웃 확인 | Modal | 로그아웃 확인 다이얼로그 |
|
|
|
|
#### 대시보드 영역 (2개)
|
|
| 화면 ID | 화면명 | URL | 설명 |
|
|
|---------|--------|-----|------|
|
|
| DASH-01 | 대시보드 | `/` | KPI 요약, 빠른 시작, 진행 중 이벤트 |
|
|
| DASH-02 | 이벤트 목록 | `/events` | 전체 이벤트 목록 (필터, 검색, 페이징) |
|
|
|
|
#### 이벤트 생성 플로우 (6개)
|
|
| 화면 ID | 화면명 | URL | 설명 | Funnel Step |
|
|
|---------|--------|-----|------|-------------|
|
|
| EVENT-01 | 이벤트 목적 선택 | `/events/create/objective` | 4가지 목적 선택 | Step 1 |
|
|
| EVENT-02 | AI 이벤트 추천 | `/events/create/recommendation` | AI 트렌드 분석 및 추천 | Step 2 |
|
|
| EVENT-03 | 콘텐츠 미리보기 | `/events/create/content` | SNS 이미지 스타일 선택 | Step 3 |
|
|
| EVENT-04 | 콘텐츠 편집 | `/events/create/edit` | 텍스트 및 이미지 편집 | Step 4 |
|
|
| EVENT-05 | 배포 채널 선택 | `/events/create/channels` | 배포 채널 선택 | Step 5 |
|
|
| EVENT-06 | 최종 승인 | `/events/create/publish` | 최종 검토 및 배포 | Step 6 |
|
|
|
|
#### 이벤트 관리 및 모니터링 (5개)
|
|
| 화면 ID | 화면명 | URL | 설명 |
|
|
|---------|--------|-----|------|
|
|
| MANAGE-01 | 이벤트 상세 | `/events/[id]` | 이벤트 상세 정보 및 실시간 KPI |
|
|
| MANAGE-02 | 참여자 목록 | `/events/[id]/participants` | 참여자 관리 및 필터링 |
|
|
| MANAGE-03 | 이벤트 참여 (고객용) | `/participate/[id]` | 고객 이벤트 참여 화면 |
|
|
| MANAGE-04 | 당첨자 추첨 | `/events/[id]/draw` | 당첨자 추첨 및 관리 |
|
|
| MANAGE-05 | 성과 분석 | `/analytics` | 실시간 대시보드 및 성과 분석 |
|
|
|
|
**총 17개 화면 (모달 포함)**
|
|
|
|
---
|
|
|
|
### 1.3 화면 간 사용자 플로우
|
|
|
|
```
|
|
[로그인] → [대시보드] ←→ [Bottom Navigation]
|
|
↓
|
|
┌──────┴──────┐
|
|
↓ ↓
|
|
[이벤트 목록] [성과 분석]
|
|
↓ ↓
|
|
[이벤트 상세] → [참여자 목록] → [당첨자 추첨]
|
|
|
|
[대시보드] → [FAB: 새 이벤트] → [이벤트 생성 Funnel]
|
|
↓
|
|
(Objective → AI추천 → 콘텐츠 → 편집 → 채널 → 승인)
|
|
↓
|
|
[이벤트 상세]
|
|
|
|
[Bottom Navigation]
|
|
- 홈: 대시보드
|
|
- 이벤트: 이벤트 목록
|
|
- 분석: 성과 분석
|
|
- 프로필: 프로필
|
|
```
|
|
|
|
---
|
|
|
|
### 1.4 화면별 상세 설계
|
|
|
|
#### 1.4.1 AUTH-01: 로그인
|
|
|
|
**상세 기능**:
|
|
- 전화번호 (010XXXXXXXX) 입력
|
|
- 비밀번호 입력
|
|
- "로그인 유지" 체크박스
|
|
- 로그인 버튼 (API: POST /users/login)
|
|
- 회원가입 링크
|
|
- 비밀번호 찾기 링크 (향후 구현)
|
|
|
|
**UI 구성요소**:
|
|
- Logo (KT 로고)
|
|
- TextField: phoneNumber (pattern 검증)
|
|
- TextField: password (type="password")
|
|
- Checkbox: "로그인 유지"
|
|
- Button: "로그인" (variant="contained", color="primary")
|
|
- Link: "회원가입", "비밀번호 찾기"
|
|
|
|
**인터랙션**:
|
|
- 전화번호 입력 시 자동 하이픈 제거
|
|
- 비밀번호 8자 이상 검증
|
|
- Enter 키로 로그인
|
|
- 로그인 성공 시 "/" 리다이렉트
|
|
- 로그인 실패 시 에러 Toast 표시
|
|
|
|
---
|
|
|
|
#### 1.4.2 EVENT-01 ~ EVENT-06: 이벤트 생성 Funnel
|
|
|
|
**Funnel 구현**: `@use-funnel/next` 사용
|
|
|
|
**Funnel 설계**:
|
|
```typescript
|
|
const steps = [
|
|
'objective', // 목적 선택
|
|
'recommendation', // AI 추천
|
|
'content', // 콘텐츠 미리보기
|
|
'edit', // 콘텐츠 편집
|
|
'channels', // 배포 채널
|
|
'publish' // 최종 승인
|
|
] as const;
|
|
|
|
// useFunnel 사용
|
|
const [Funnel, state, setStep] = useFunnel({
|
|
id: 'event-creation',
|
|
initial: 'objective'
|
|
});
|
|
```
|
|
|
|
**Step 1: Objective (목적 선택)**
|
|
|
|
*상세 기능*:
|
|
- 4개 목적 중 1개 선택 (Radio)
|
|
1. 신규 고객 유치
|
|
2. 재방문 유도
|
|
3. 매출 증대
|
|
4. 인지도 향상
|
|
- 선택 후 다음 버튼 활성화
|
|
- API: POST /events/objectives
|
|
|
|
*UI 구성요소*:
|
|
- Stepper: 1/6 진행 표시
|
|
- OptionCard: 4개 (아이콘 + 제목 + 설명)
|
|
- Button: "다음" (하단 고정)
|
|
|
|
*인터랙션*:
|
|
- 카드 클릭 시 Radio 선택
|
|
- 선택 시 카드 강조 (border: KT Red)
|
|
- 다음 버튼 클릭 → API 호출 → eventId 저장 → Step 2 이동
|
|
|
|
---
|
|
|
|
**Step 2: AI Recommendation (AI 추천)**
|
|
|
|
*상세 기능*:
|
|
- AI 트렌드 분석 결과 표시 (업종, 지역, 시즌)
|
|
- 예산별 추천 이벤트 (저/중/고)
|
|
- 각 예산당 온라인/오프라인 2가지 방식 제공
|
|
- 총 6개 옵션 중 1개 선택
|
|
- 이벤트명, 경품 인라인 편집 가능
|
|
- 예산 네비게이션 (Sticky)
|
|
- API: POST /events/{eventId}/ai-recommendations
|
|
- Job 발행 → 폴링 (GET /jobs/{jobId})
|
|
|
|
*UI 구성요소*:
|
|
- TrendAnalysis Card: 3개 (업종/지역/시즌)
|
|
- BudgetNavigation: 3개 버튼 (Sticky)
|
|
- RecommendationCard: 6개 (온라인/오프라인 배지, 편집 가능 제목/경품)
|
|
- LoadingIndicator: AI 처리 중 (5초 예상)
|
|
- Button: "다음"
|
|
|
|
*인터랙션*:
|
|
- 예산 네비게이션 클릭 → smooth scroll
|
|
- 이벤트명/경품 hover → 점선 테두리 (편집 가능 표시)
|
|
- 클릭 → 인라인 편집 (TextField 전환)
|
|
- Enter/Blur → 저장
|
|
- AI Job 폴링 (5초 간격)
|
|
- 완료 시 추천 결과 표시
|
|
- 1개 선택 → PUT /events/{eventId}/recommendations → Step 3 이동
|
|
|
|
---
|
|
|
|
**Step 3: Content (콘텐츠 미리보기)**
|
|
|
|
*상세 기능*:
|
|
- 5가지 SNS 이미지 스타일 선택
|
|
1. 심플
|
|
2. 모던
|
|
3. 귀여움
|
|
4. 고급스러움
|
|
5. 트렌디
|
|
- 각 스타일 미리보기 이미지
|
|
- "크게보기" 버튼 → 전체화면 모달
|
|
- API: POST /events/{eventId}/images
|
|
- Job 발행 → 폴링 (GET /jobs/{jobId})
|
|
|
|
*UI 구성요소*:
|
|
- StyleCard: 5개 (이미지 + 제목 + 설명 + "크게보기")
|
|
- SelectBadge: 우측 상단 (선택 시만 표시)
|
|
- FullscreenModal: 이미지 확대
|
|
- LoadingIndicator: 이미지 생성 중 (5초 예상)
|
|
- Button: "다음"
|
|
|
|
*인터랙션*:
|
|
- 카드 클릭 → Radio 선택 (숨김)
|
|
- 선택 시 테두리 강조 + 체크 배지
|
|
- "크게보기" → 전체화면 모달 (이벤트 버블링 방지)
|
|
- Job 폴링 (3초 간격)
|
|
- 완료 시 이미지 URL 표시
|
|
- 1개 선택 → PUT /events/{eventId}/images/{imageId}/select → Step 4 이동
|
|
|
|
---
|
|
|
|
**Step 4: Edit (콘텐츠 편집)**
|
|
|
|
*상세 기능*:
|
|
- 텍스트 편집 (제목, 경품, 참여 안내)
|
|
- 실시간 미리보기
|
|
- API: PUT /events/{eventId}/images/{imageId}/edit
|
|
|
|
*UI 구성요소*:
|
|
- TextField: 제목
|
|
- TextField: 경품
|
|
- TextField: 참여 안내 (multiline)
|
|
- PreviewCard: 실시간 미리보기 (우측/하단)
|
|
- Button: "다음", "저장"
|
|
|
|
*인터랙션*:
|
|
- 입력 시 debounce (300ms) 후 미리보기 업데이트
|
|
- 저장 버튼 → 임시 저장
|
|
- 다음 버튼 → API 호출 → Step 5 이동
|
|
|
|
---
|
|
|
|
**Step 5: Channels (배포 채널 선택)**
|
|
|
|
*상세 기능*:
|
|
- 복수 채널 선택 (Checkbox)
|
|
- 우리동네TV
|
|
- 링고비즈
|
|
- SNS (Instagram, Naver, Kakao)
|
|
- QR코드
|
|
- 채널별 옵션 (조건부 표시)
|
|
- API: PUT /events/{eventId}/channels
|
|
|
|
*UI 구성요소*:
|
|
- Checkbox: 각 채널
|
|
- ConditionalOptions: 각 채널 (펼침/접힘)
|
|
- Button: "다음"
|
|
|
|
*인터랙션*:
|
|
- 체크박스 선택 → 해당 옵션 펼침
|
|
- 최소 1개 선택 필수
|
|
- 다음 버튼 → API 호출 → Step 6 이동
|
|
|
|
---
|
|
|
|
**Step 6: Publish (최종 승인)**
|
|
|
|
*상세 기능*:
|
|
- 이벤트 요약 표시
|
|
- 이미지 미리보기
|
|
- 배포 채널 목록
|
|
- 일정 설정 (시작일, 종료일)
|
|
- 최종 승인 및 배포
|
|
- API: POST /events/{eventId}/publish
|
|
|
|
*UI 구성요소*:
|
|
- SummaryCard: 이벤트 정보
|
|
- ImagePreview: 최종 이미지
|
|
- ChannelBadges: 선택된 채널
|
|
- DatePicker: 시작일, 종료일
|
|
- Button: "수정" (이전 단계), "승인 및 배포"
|
|
|
|
*인터랙션*:
|
|
- 수정 버튼 → Funnel 이전 단계 이동
|
|
- 승인 버튼 → Confirm 다이얼로그 → API 호출 → 배포 완료 Toast → `/events/[id]` 이동
|
|
|
|
---
|
|
|
|
#### 1.4.3 MANAGE-01: 이벤트 상세
|
|
|
|
**상세 기능**:
|
|
- 이벤트 헤더 (이미지, 제목, 상태, 기간)
|
|
- 실시간 KPI (4개)
|
|
- 참여자 수
|
|
- 조회수
|
|
- ROI
|
|
- 전환율
|
|
- 빠른 액션 (4개 버튼)
|
|
- 참여자 목록
|
|
- 당첨자 관리
|
|
- 성과 분석
|
|
- 이벤트 수정
|
|
- 참여 추이 차트 (Line Chart)
|
|
- API: GET /events/{eventId}
|
|
|
|
**UI 구성요소**:
|
|
- EventHeader: 이미지 + 정보
|
|
- KPICard: 4개 (Grid)
|
|
- ActionButton: 4개 (Grid)
|
|
- LineChart: 참여 추이 (Chart.js)
|
|
|
|
**인터랙션**:
|
|
- 실시간 업데이트 (5분마다 자동 갱신)
|
|
- Pull to Refresh (모바일)
|
|
- 액션 버튼 클릭 → 해당 페이지 이동
|
|
|
|
---
|
|
|
|
#### 1.4.4 MANAGE-03: 이벤트 참여 (고객용)
|
|
|
|
**상세 기능**:
|
|
- 이벤트 이미지
|
|
- 이벤트 정보 (제목, 경품, 참여 방법)
|
|
- 참여 폼 (이름, 전화번호)
|
|
- 개인정보 동의 (필수)
|
|
- 마케팅 수신 동의 (선택)
|
|
- API: POST /events/{eventId}/participate
|
|
|
|
**UI 구성요소**:
|
|
- EventBanner: 이미지
|
|
- InfoCard: 이벤트 정보
|
|
- TextField: 이름, 전화번호
|
|
- Checkbox: 개인정보 동의, 마케팅 동의
|
|
- Button: "참여하기"
|
|
|
|
**인터랙션**:
|
|
- 전화번호 검증 (010-XXXX-XXXX)
|
|
- 중복 참여 방지
|
|
- 개인정보 동의 필수
|
|
- 참여 성공 시 응모 번호 모달 표시
|
|
|
|
---
|
|
|
|
### 1.5 화면 간 전환 및 네비게이션
|
|
|
|
**Bottom Navigation** (4개 탭):
|
|
- 홈 (`/`): DASH-01 대시보드
|
|
- 이벤트 (`/events`): DASH-02 이벤트 목록
|
|
- 분석 (`/analytics`): MANAGE-05 성과 분석
|
|
- 프로필 (`/profile`): AUTH-03 프로필
|
|
|
|
**Header Navigation**:
|
|
- 로고 (클릭 시 홈 이동)
|
|
- 뒤로가기 버튼 (조건부 표시)
|
|
- 프로필 아이콘 (로그인 시만 표시)
|
|
|
|
**FAB (Floating Action Button)**:
|
|
- 위치: 우측 하단 고정
|
|
- 기능: 새 이벤트 생성 (`/events/create/objective`)
|
|
- 표시 조건: 대시보드, 이벤트 목록 화면에서만
|
|
|
|
---
|
|
|
|
### 1.6 반응형 설계 전략
|
|
|
|
**Breakpoints**:
|
|
- Mobile: 320px ~ 767px (기본)
|
|
- Tablet: 768px ~ 1023px
|
|
- Desktop: 1024px 이상
|
|
|
|
**레이아웃 변화**:
|
|
|
|
| 화면 | Mobile | Tablet | Desktop |
|
|
|------|--------|--------|---------|
|
|
| 대시보드 | KPI 세로 스택 | KPI 2x2 Grid | KPI 4열 + 사이드바 |
|
|
| 이벤트 목록 | 1열 | 2열 | 3열 |
|
|
| 이벤트 생성 | 세로 스택 | 세로 스택 | 편집 \| 미리보기 (Split) |
|
|
| 성과 분석 | 차트 세로 스택 | 차트 2x1 Grid | 차트 2x2 Grid |
|
|
|
|
**반응형 컴포넌트**:
|
|
- `Box` with `sx` prop (MUI)
|
|
- `Grid` with `xs/md/lg` props
|
|
- `useMediaQuery` hook
|
|
- `Container` with `maxWidth` prop
|
|
|
|
---
|
|
|
|
### 1.7 접근성 보장 방안
|
|
|
|
**WCAG 2.1 AA 준수**:
|
|
- 색상 대비: 4.5:1 (텍스트), 3:1 (UI 요소)
|
|
- 터치 영역: 최소 44x44px
|
|
- 키보드 네비게이션: Tab, Enter, Escape 지원
|
|
- Focus Indicator: 명확한 포커스 표시
|
|
|
|
**스크린 리더 지원**:
|
|
- ARIA Labels: 모든 버튼, 링크, 폼 필드
|
|
- ARIA Roles: 적절한 역할 지정
|
|
- Live Regions: 동적 콘텐츠 업데이트 알림
|
|
|
|
**대안 제공**:
|
|
- 색상 외 표현: 아이콘 + 텍스트 조합
|
|
- 이미지 alt 텍스트
|
|
- 폼 검증 에러 메시지
|
|
|
|
---
|
|
|
|
### 1.8 성능 최적화 방안
|
|
|
|
**Next.js 최적화**:
|
|
- App Router 사용 (Next.js 14)
|
|
- Server Components (기본)
|
|
- Client Components (인터랙션 필요 시만)
|
|
- Image 컴포넌트 (자동 최적화)
|
|
- Font 최적화 (next/font)
|
|
|
|
**Code Splitting**:
|
|
- 페이지별 자동 코드 분할
|
|
- Dynamic Import (Chart.js, 큰 라이브러리)
|
|
- Lazy Loading (이미지, 컴포넌트)
|
|
|
|
**캐싱 전략**:
|
|
- React Query (서버 상태 관리)
|
|
- staleTime: 5분 (대시보드)
|
|
- cacheTime: 30분
|
|
- refetchOnWindowFocus: true
|
|
- SWR (대안)
|
|
- Redux (클라이언트 상태 관리, 필요 시)
|
|
|
|
**이미지 최적화**:
|
|
- WebP 포맷 (fallback: JPG)
|
|
- 압축: Quality 80-85%
|
|
- Lazy Loading
|
|
- Responsive Images (srcset)
|
|
|
|
**폰트 최적화**:
|
|
- next/font 사용
|
|
- Font Display: swap
|
|
- Preload: 주요 폰트
|
|
- Subset: 한글 + 영문 + 숫자
|
|
|
|
**애니메이션 최적화**:
|
|
- GPU 가속: transform, opacity
|
|
- Framer Motion (선택적 사용)
|
|
- CSS Transitions (기본)
|
|
|
|
---
|
|
|
|
## 2. 참조 문서
|
|
|
|
- **프로토타입**: design/uiux/prototype/*.html
|
|
- **UI/UX 설계서**: design/uiux/uiux-design.md
|
|
- **스타일 가이드**: design/uiux/style-guide.md (→ design/frontend/style-guide.md)
|
|
- **정보 아키텍처**: design/frontend/ia.md
|
|
- **API 매핑 설계서**: design/frontend/api-mapping.md
|
|
|
|
---
|
|
|
|
## 3. 기술 스택 요약
|
|
|
|
| 항목 | 기술 |
|
|
|------|------|
|
|
| 프레임워크 | Next.js 14 (App Router) |
|
|
| 라이브러리 | React 18 |
|
|
| 언어 | TypeScript 5 |
|
|
| UI 프레임워크 | Material-UI (MUI) v6 |
|
|
| Funnel 관리 | @use-funnel/next |
|
|
| 상태 관리 | React Query v5 (서버 상태), Zustand (클라이언트 상태) |
|
|
| 폼 관리 | React Hook Form v7 + Zod (검증) |
|
|
| 차트 | Chart.js v4 + react-chartjs-2 |
|
|
| 날짜 | dayjs |
|
|
| HTTP 클라이언트 | Axios |
|
|
| 스타일링 | MUI sx prop, Emotion (CSS-in-JS) |
|
|
|
|
---
|
|
|
|
## 4. 변경 이력
|
|
|
|
### Version 1.0 (2025-10-24)
|
|
- 초안 작성
|
|
- Next.js 14 기반 설계
|
|
- @use-funnel/next 검토 및 적용
|
|
- MUI v6 선택
|
|
- 반응형 디자인 전략 수립
|
|
- 접근성 및 성능 최적화 방안 수립
|
|
|
|
---
|
|
|
|
**문서 끝**
|