Files
sam-docs/plans/react-mock-remaining-tasks.md
kent 3cc539dc26 docs: Phase J/K 작업을 react-mock-remaining-tasks.md로 분리
- 아키텍처 원칙 추가 (React → api.sam.kr 만 호출, mng 호출 금지)
- API 상태 확인: api 프로젝트에 boards/posts API 이미 완비
- Phase J (게시판), Phase K (고객센터) 상세 계획 분리
- Serena 메모리 관리 규칙 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 17:24:37 +09:00

386 lines
15 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# React Mock → API 마이그레이션 - 잔여 작업
> **작성일**: 2025-12-27
> **목적**: 미완료 Mock → API 연동 작업 추적
> **원본 문서**: `react-mock-to-api-migration-plan.md`
> **참조 구현**: 단가관리 (`/sales/pricing-management`)
---
## 0. 로컬 개발 환경
### 도메인 구성
| 서비스 | 도메인 | 설명 |
|--------|--------|------|
| React (프론트엔드) | `http://dev.sam.kr` | 사용자 화면 |
| API (백엔드) | `http://api.sam.kr` | REST API 서버 |
| MNG (운영관리자) | `http://mng.sam.kr` | 관리자 패널 |
### 테스트 URL 예시
```
# 종합분석 페이지
http://dev.sam.kr/reports/comprehensive-analysis
# API 직접 호출
http://api.sam.kr/api/v1/comprehensive-analysis
```
---
## 1. 작업 규칙
### 1.0 아키텍처 원칙 (필수)
> **React는 오직 `api.sam.kr` (api 프로젝트)만 호출한다**
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ react/ │ ───► │ api/ │ │ mng/ │
│ dev.sam.kr │ │ api.sam.kr │ │ mng.sam.kr │
│ (프론트엔드) │ │ (REST API) │ │ (관리자패널) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ ✅ 호출 허용 │ │
└────────────────────┘ │
❌ 절대 호출 금지 ─────────────────────────┘
```
**규칙:**
- React에서 mng API 직접 호출 **절대 금지**
- 필요한 API가 api 프로젝트에 없으면 **api에 새로 개발**
- mng의 모델/로직은 **참조만** (코드 복사 또는 재구현)
### 1.1 작업 진행 정책
> **단위 작업 → 검수 → 승인 → 문서 업데이트 → 커밋** 순서로 진행
### 1.2 세션 규칙 및 Serena 메모리 관리
> **세션 간 일관성 보장을 위한 필수 규칙**
#### 세션 시작 프로토콜 (필수)
```
1. Serena 메모리 로드
read_memory("mock-to-api-state") → 현재 Phase/작업 확인
read_memory("mock-to-api-snapshot") → 마지막 작업 내용 확인
2. 현재 상태 확인
- 이 문서 읽기
- 현재 Phase의 기능별 상태 확인
- "다음 작업은 [Phase]-[번호]의 [기능] 입니다" 명시
3. 작업 범위 명확화
- 사용자에게 작업 범위 확인
- "[Phase] 전체를 진행할까요, 특정 기능만 진행할까요?"
```
#### Serena 메모리 구조
```javascript
// mock-to-api-state
{
"current_phase": "J",
"current_item": "J-1",
"current_feature": "게시판 목록",
"progress": {
"J-1": { "목록": "대기", "상세": "대기" }
},
"last_update": "2025-12-27"
}
// mock-to-api-snapshot
"Phase J 게시판 시스템 시작 예정"
```
#### 작업 완료 시 (필수)
```
1. 문서 업데이트
- 해당 기능 상태 변경 (🔄 → ✅)
- 변경 이력 추가
2. Serena 메모리 저장
write_memory("mock-to-api-state", 현재 상태)
write_memory("mock-to-api-snapshot", 작업 내용 요약)
3. 커밋
feat: [Phase]-[번호] [페이지명] Mock → API 연동
```
### 1.3 작업 템플릿 (표준)
```markdown
## [Phase-번호] 페이지명 - [기능명] 연동
**작업 대상:**
- 컴포넌트: `ComponentName.tsx`
- 액션: `actions.ts`
- API: `GET/POST/PUT/DELETE /api/v1/endpoint`
**작업 절차:**
1. [ ] API 스펙 확인 (Swagger)
2. [ ] actions.ts 함수 확인/생성
3. [ ] 타입 정의 확인 (API ↔ Frontend)
4. [ ] 컴포넌트에서 actions 호출
5. [ ] console.log/MOCK 제거
6. [ ] 브라우저 테스트
**결과:**
- [ ] 검수 요청
- [ ] [승인] 문서 업데이트
- [ ] [승인] 커밋
```
```
┌─────────────────────────────────────────────────────────────────┐
│ 📋 작업 흐름 (페이지 단위) │
├─────────────────────────────────────────────────────────────────┤
│ 1⃣ 작업 시작: 대상 페이지 Mock → API 연동 작업 │
│ 2⃣ 작업 완료: 코드 수정 완료 후 사용자에게 검수 요청 │
│ 3⃣ 검수: 사용자가 기능 확인 (브라우저 테스트) │
│ 4⃣ [승인] 문서 업데이트: 이 문서의 상태 갱신 │
│ 5⃣ [승인] 커밋: Git 커밋 생성 │
│ 6⃣ 다음 페이지로 이동 │
└─────────────────────────────────────────────────────────────────┘
```
**⚠️ 중요 규칙:**
- 각 단계에서 `[승인]` 표시된 작업은 **사용자 승인 후** 진행
---
## 2. 잔여 작업 목록
### 2.1 Phase J: 게시판 시스템
> **상태**: ✅ api 프로젝트에 게시판/게시글 API 완비 → React 연동 작업 가능
#### ✅ api 프로젝트 게시판 API (이미 구현됨)
| 기능 | Method | Endpoint (api.sam.kr) | 상태 |
|------|--------|----------------------|------|
| 게시판 목록 | GET | `/api/v1/boards` | ✅ |
| 테넌트 게시판 | GET | `/api/v1/boards/tenant` | ✅ |
| 게시판 상세 | GET | `/api/v1/boards/{code}` | ✅ |
| 게시판 등록 | POST | `/api/v1/boards` | ✅ |
| 게시판 수정 | PUT | `/api/v1/boards/{id}` | ✅ |
| 게시판 삭제 | DELETE | `/api/v1/boards/{id}` | ✅ |
| 게시판 필드 | GET | `/api/v1/boards/{code}/fields` | ✅ |
| 게시글 목록 | GET | `/api/v1/boards/{code}/posts` | ✅ |
| 게시글 상세 | GET | `/api/v1/boards/{code}/posts/{id}` | ✅ |
| 게시글 등록 | POST | `/api/v1/boards/{code}/posts` | ✅ |
| 게시글 수정 | PUT | `/api/v1/boards/{code}/posts/{id}` | ✅ |
| 게시글 삭제 | DELETE | `/api/v1/boards/{code}/posts/{id}` | ✅ |
| 댓글 CRUD | GET/POST/PUT/DELETE | `/api/v1/boards/{code}/posts/{id}/comments/*` | ✅ |
#### 🏗️ 게시판 시스템 아키텍처 (참조용)
**EAV (Entity-Attribute-Value) 패턴 기반 통합 게시판:**
```
boards (게시판 정의)
├── board_settings (EAV 필드 스키마)
├── posts (게시글)
│ └── post_custom_field_values (EAV 값 저장)
└── 첨부파일 (Polymorphic: files → fileable)
```
**게시판 모델 주요 필드:**
```typescript
interface Board {
id: number;
tenant_id?: number; // null = 시스템 게시판
is_system: boolean; // 시스템/테넌트 구분
board_type: string; // notice, qna, faq, free, gallery, download
board_code: string; // 고유 코드
name: string;
description?: string;
editor_type: 'wysiwyg' | 'markdown' | 'text';
allow_files: boolean;
max_file_count: number;
max_file_size: number; // KB
extra_settings: { // JSON
allow_comment?: boolean;
allow_secret?: boolean;
write_roles?: string[];
read_roles?: string[];
};
is_active: boolean;
}
interface BoardSetting { // EAV 필드 스키마
id: number;
board_id: number;
name: string; // 필드명 (예: 카테고리)
field_key: string; // 필드 키 (예: category)
field_type: 'text' | 'number' | 'select' | 'date' | 'textarea' | 'checkbox' | 'radio' | 'file';
field_meta?: { // JSON (select 옵션, 기본값 등)
options?: string[];
default?: string;
};
is_required: boolean;
sort_order: number;
}
```
**템플릿 시스템 (`config/board_templates.php`):**
- **시스템 템플릿**: notice, qna, faq, popup (본사 ↔ 테넌트 소통용)
- **테넌트 템플릿**: free, gallery, download, notice, qna (테넌트 내부용)
#### 📋 React 연동 작업 현황
| # | 페이지 | React 경로 | 조회 | 등록 | 수정 | 삭제 | API 연동 전략 |
|---|--------|-----------|------|------|------|------|--------------|
| J-1 | 게시판 목록 | `/board` | 🔄 Mock | ⏭️ | ⏭️ | ⏭️ | `GET /boards` + 게시글 API 필요 |
| J-2 | 게시글 상세 | `/board/[id]` | 🔄 Mock | ⏭️ | 🔄 | 🔄 | 게시글 API 필요 (posts CRUD) |
| J-3 | 게시글 작성/수정 | `/board/[id]/edit` | 🔄 Mock | 🔄 | 🔄 | ⏭️ | 게시글 API + 커스텀필드 동적 렌더링 |
| J-4 | 게시판 관리 | `/board/board-management` | 🔄 Mock | 🔄 | 🔄 | 🔄 | ✅ API 완비 → 바로 연동 가능 |
**파일 구조 → 연동 계획:**
```
components/board/
├── types.ts ← 🔄 Board, Post, BoardSetting 타입으로 교체
├── actions.ts ← 🆕 Server Actions (게시판/게시글 CRUD)
├── BoardForm/ ← 🔄 동적 폼 렌더링 (EAV 필드 기반)
├── BoardDetail/ ← 🔄 게시글 상세 + 커스텀필드 표시
├── BoardList/ ← 🔄 게시판별 필터링 + 페이지네이션
└── BoardManagement/
├── types.ts ← 🔄 Board 관리 타입으로 교체
├── actions.ts ← 🆕 `/admin/boards/*` API 연동
└── BoardForm.tsx ← 🔄 템플릿 선택 + 필드 관리 UI
```
---
### 2.2 Phase K: 고객센터
> **상태**: mng 게시판 시스템의 **템플릿 기반 게시판**으로 통합 운영
#### 🎯 통합 전략: 고객센터 = 게시판 템플릿 활용
각 고객센터 메뉴를 별도 `board_code`로 생성하여 통합 관리:
| 메뉴 | board_code | board_type | 템플릿 | 커스텀 필드 |
|------|------------|------------|--------|------------|
| FAQ | `system-faq` | faq | system/faq | category (select) |
| 공지사항 | `system-notice` | notice | system/notice | category (select) |
| 이벤트 | `system-event` | notice | - | start_date, end_date, image_url |
| 1:1 문의 | `system-qna` | qna | system/qna | inquiry_type, answer_status |
**장점:**
- 코드 중복 제거 (게시판 CRUD 재사용)
- 커스텀 필드로 각 메뉴 특성 반영
- 관리자 UI 통합 (mng.sam.kr/boards에서 일괄 관리)
#### 📋 React 연동 작업 현황
| # | 페이지 | React 경로 | 조회 | 등록 | 수정 | 삭제 | API 연동 전략 |
|---|--------|-----------|------|------|------|------|--------------|
| K-1 | FAQ 관리 | `/customer-center/faq` | 🔄 Mock | 🔄 | 🔄 | 🔄 | `board_code: system-faq` 게시글 API |
| K-2 | 이벤트 관리 | `/customer-center/events` | 🔄 Mock | 🔄 | 🔄 | 🔄 | `board_code: system-event` 게시글 API |
| K-3 | 공지사항 관리 | `/customer-center/notices` | 🔄 Mock | 🔄 | 🔄 | 🔄 | `board_code: system-notice` 게시글 API |
| K-4 | 문의 관리 | `/customer-center/inquiries` | 🔄 Mock | 🔄 | 🔄 | 🔄 | `board_code: system-qna` 게시글 API + 답변 |
**파일 구조 → 연동 계획:**
```
components/customer-center/
├── shared/
│ ├── types.ts ← 🆕 공통 Post, BoardField 타입
│ ├── actions.ts ← 🆕 게시글 CRUD Server Actions (board_code 파라미터)
│ └── PostForm.tsx ← 🆕 동적 폼 (커스텀필드 기반)
├── FAQManagement/
│ ├── types.ts ← 🔄 FAQ 특화 타입 (category 필드)
│ ├── actions.ts ← 🆕 board_code='system-faq' 고정
│ └── FAQList.tsx ← 🔄 카테고리별 그룹핑 UI
├── EventManagement/
│ ├── types.ts ← 🔄 Event 특화 타입 (start_date, end_date)
│ ├── actions.ts ← 🆕 board_code='system-event' 고정
│ └── EventList.tsx ← 🔄 진행중/예정/종료 필터
├── NoticeManagement/
│ ├── types.ts ← 🔄 Notice 특화 타입
│ ├── actions.ts ← 🆕 board_code='system-notice' 고정
│ └── NoticeList.tsx ← 🔄 공지 목록 UI
└── InquiryManagement/
├── types.ts ← 🔄 Inquiry 특화 타입 (answer_status)
├── actions.ts ← 🆕 board_code='system-qna' 고정
├── InquiryList.tsx ← 🔄 답변대기/완료 필터
├── InquiryDetail.tsx ← 🔄 문의 상세 + 답변 작성
└── InquiryForm.tsx ← 🔄 문의 등록 폼
```
#### 🛠️ 구현 순서 (권장)
**Step 1: mng에서 시스템 게시판 생성**
```
mng.sam.kr/boards → 템플릿으로 생성:
- system-faq (FAQ 템플릿)
- system-notice (공지사항 템플릿)
- system-event (커스텀: 이벤트)
- system-qna (1:1문의 템플릿)
```
**Step 2: React 공통 모듈 개발** (✅ 게시판/게시글 API 이미 완비)
```
react/src/lib/board/
├── types.ts ← API 타입 정의
├── actions.ts ← 게시글 CRUD Server Actions
└── utils.ts ← 커스텀필드 렌더링 유틸
```
**Step 3: 각 메뉴별 연동**
```
K-3 공지사항 (가장 단순) → K-1 FAQ → K-2 이벤트 → K-4 문의 (가장 복잡)
```
#### 💡 커스텀 필드 동적 렌더링 전략
```typescript
// 게시판 필드 스키마 기반 동적 폼 생성
function renderCustomField(field: BoardSetting, value: string | null) {
switch (field.field_type) {
case 'text': return <Input {...} />;
case 'select': return <Select options={field.field_meta?.options} {...} />;
case 'date': return <DatePicker {...} />;
case 'textarea': return <Textarea {...} />;
case 'checkbox': return <Checkbox {...} />;
// ...
}
}
// 게시글 작성 시 커스텀필드 값 저장
const formData = {
title: '...',
content: '...',
custom_fields: {
category: '이용안내', // field_key: value
answer_status: '대기중',
}
};
```
---
## 3. 잔여 Mock 파일 (삭제 대상)
> **참고**: 일부 mockData.ts는 유틸리티 함수(색상매핑, 판정함수)만 유지
```
react/src/components/
├── production/ProductionDashboard/mockData.ts ← G-3 (유틸리티만 유지)
├── production/WorkOrders/mockData.ts ← G-1 (유틸리티만 유지)
├── production/WorkResults/mockData.ts ← G-2 (유틸리티만 유지)
├── quality/InspectionManagement/mockData.ts ← G-5 (확인 필요)
└── reports/mockData.ts ← 확인 필요
```
---
## 4. 참고 문서
- **API 스펙**: http://api.sam.kr/api-docs
- **원본 계획**: `react-mock-to-api-migration-plan.md`
- **API 개발 계획**: `erp-api-development-plan-d1.0-changes.md`
- **표준 구현 참조**: `/sales/pricing-management`