# React 목업 데이터 → API 연동 마이그레이션 계획 > **작성일**: 2025-12-23 > **목적**: React 프론트엔드의 목업 데이터를 실제 API와 연동 > **참고 문서**: `react-api-integration-plan.md`, `erp-api-development-plan-d1.0-changes.md` > **참조 구현**: 단가관리 (`/sales/pricing-management`) --- ## 1. 개요 ### 1.1 현황 분석 **목업 데이터 사용 페이지**: 80개+ 파일에서 목업 데이터 사용 중 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 🎯 연동 목표 │ ├─────────────────────────────────────────────────────────────────┤ │ - React 목업 데이터 → 실제 API 호출로 전환 │ │ - 단가관리(pricing-management) 패턴을 표준으로 적용 │ │ - Phase A~B (API 완료 기능) 우선 연동 │ └─────────────────────────────────────────────────────────────────┘ ``` ### 1.4 전수 조사 결과 (2025-12-26 최신) > MCP Serena를 활용한 React 전체 Mock 데이터 사용 현황 전수 조사 결과 #### 🔍 발견된 주요 패턴 | 문제 유형 | 파일 수 | 설명 | |----------|---------|------| | **mockData.ts 파일** | 8개 | 별도 Mock 데이터 파일 (삭제 필요) | | **MOCK_* 상수** | 15개+ | 인라인 Mock 상수 | | **console.log CRUD** | 40개+ | API 대신 console.log 출력 | | **TODO 주석** | 30개+ | 미구현 기능 | #### 🚨 "완료" 표시됐지만 잔여 작업 있는 Phase | Phase | 항목 | 발견된 문제 | |-------|------|------------| | B-2 | 매입 관리 | **MOCK_ACCOUNTS, MOCK_VENDORS** 사용 (PurchaseDetailModal) | | C-1 | 직원 관리 | `TODO: 파일 업로드`, `console.log('Invite user')` | | D-4 | 근태 설정 | **MOCK_DEPARTMENTS** 사용 | | F-1~4 | 결재 시스템 | **MOCK_EMPLOYEES** 사용 (결재선/참조자 선택) | #### 📋 문서에 누락된 모듈 (Phase J~L로 추가됨) | 카테고리 | 경로 | Mock 사용 현황 | |----------|------|---------------| | **게시판** | `/board/*` | MOCK_BOARDS, MOCK_DEPARTMENTS | | **FAQ** | `/customer-center/faq` | MOCK_FAQS 전체 사용 | | **이벤트** | `/customer-center/events` | MOCK_EVENTS 전체 사용 | | **문의** | `/customer-center/inquiries` | MOCK_INQUIRIES, MOCK_REPLY, MOCK_COMMENTS | | **공지사항** | `/customer-center/notices` | MOCK_NOTICES 전체 사용 | | **공정관리** | `/master-data/process-management` | ✅ **완료** (2025-12-26) | | **견적** | `/sales/quote-management` | ✅ **완료** (2025-12-26) | #### 📁 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 ├── material/ReceivingManagement/mockData.ts ← H-1 연동 완료 ├── material/StockStatus/mockData.ts ← H-2 연동 완료 ├── outbound/ShipmentManagement/mockData.ts ← H-3 연동 완료 └── reports/mockData.ts ← 확인 필요 ``` ### 1.5 작업 진행 정책 > **단위 작업 → 검수 → 승인 → 문서 업데이트 → 커밋** 순서로 진행 ### 1.6 세션 규칙 및 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": "G", "current_item": "G-1", "current_feature": "목록 조회", "progress": { "G-1": { "목록": "완료", "상세": "진행중", "등록": "대기" } }, "last_update": "2025-12-26 14:30" } // mock-to-api-snapshot "G-1 작업지시관리: 목록 조회 API 연동 완료. 다음: 상세 조회 연동 예정" ``` #### 작업 완료 시 (필수) ``` 1. 문서 업데이트 - 해당 기능 상태 변경 (⏳ → ✅) - 변경 이력 추가 2. Serena 메모리 저장 write_memory("mock-to-api-state", 현재 상태) write_memory("mock-to-api-snapshot", 작업 내용 요약) 3. 커밋 feat: [Phase]-[번호] [페이지명] Mock → API 연동 ``` ### 1.7 작업 템플릿 (표준) > **각 기능별 작업 시 사용하는 표준 템플릿** ```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️⃣ 다음 페이지로 이동 │ └─────────────────────────────────────────────────────────────────┘ ``` **⚠️ 중요 규칙:** - 각 단계에서 `[승인]` 표시된 작업은 **사용자 승인 후** 진행 - 한 번에 하나의 페이지만 작업 (병렬 작업 금지) - 검수 실패 시 수정 후 재검수 - 커밋 메시지: `feat: [Phase]-[번호] [페이지명] Mock → API 연동` **📌 현재 진행 순서:** 1. ~~A-1 악성채권~~ *(완료 - 상세+CRUD+메모 API 연동)* 2. ~~A-2 팝업 관리~~ *(완료 - 상세+CRUD API 연동)* 3. A-3 결제 내역 (조회 전용, 완료) 4. A-4 구독 관리 (조회 전용, 완료) 5. A-5 알림 설정 (완료) 6. B-1 매출 관리 7. B-2 매입 관리 8. B-3 입금 관리 9. B-4 출금 관리 10. B-5 거래처 관리 11. B-6 어음 관리 ### 1.2 단가관리 연동 패턴 (표준 참조) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 📂 파일 구조 │ ├─────────────────────────────────────────────────────────────────┤ │ react/src/ │ │ ├── app/[locale]/(protected)/sales/pricing-management/ │ │ │ └── page.tsx ← 서버 컴포넌트 (API 호출) │ │ │ │ │ └── components/pricing/ │ │ ├── types.ts ← 타입 정의 │ │ ├── actions.ts ← Server Actions (CRUD) │ │ ├── PricingListClient.tsx ← 클라이언트 컴포넌트 │ │ └── index.ts ← Export │ └─────────────────────────────────────────────────────────────────┘ ``` **데이터 흐름:** ``` page.tsx (서버) ↓ API 호출 (fetch) ↓ 데이터 변환 (API → Frontend) ↓ initialData prop 전달 ListClient.tsx (클라이언트) ↓ useState로 데이터 관리 ↓ UI 렌더링 ``` ### 1.3 핵심 패턴 요약 | 구분 | 파일 | 역할 | |------|------|------| | 타입 | `types.ts` | 프론트엔드 인터페이스 정의 | | 서버 페이지 | `page.tsx` | API 호출, 데이터 병합, 초기 데이터 전달 | | 서버 액션 | `actions.ts` | CRUD 작업, 데이터 변환 함수 | | 클라이언트 | `*Client.tsx` | UI 렌더링, 사용자 상호작용 | --- ## 2. 우선순위별 연동 대상 > **상태 범례**: > - ✅ 완료: API 연동 완료 (Server Actions 호출) > - 🔄 Mock: Mock 데이터 또는 console.log 사용 > - ⚠️ API 필요: 백엔드 API 개발 선행 필요 > - ⏭️ 건너뜀: API 미존재 또는 해당 없음 > - 📦 actions.ts: Server Actions 파일 존재 (UI 연동 필요) ### 2.1 Phase A: API 완료 기능 (즉시 연동 가능) > 이미 API가 구현되어 있어 React 연동만 필요 > **⚠️ 2025-12-24 전수 조사 결과**: 리스트 API 연동 완료했으나 상세/CRUD 작업에서 Mock 사용 확인 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | A-1 | 악성채권 관리 | `/accounting/bad-debt-collection` | ✅ | ✅ | ✅ | ✅ | ✅ | 상세+CRUD+메모 API 연동 완료 (2025-12-24) | | A-2 | 팝업 관리 | `/settings/popup-management` | ✅ | ✅ | ✅ | ✅ | ✅ | 상세+CRUD API 연동 완료 (2025-12-24) | | A-3 | 결제 내역 | `/settings/payment-history` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | 조회 전용 | | A-4 | 구독 관리 | `/settings/subscription` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | 조회 전용 | | A-5 | 알림 설정 | `/settings/notifications` | ✅ | ⏭️ | ⏭️ | ✅ | ⏭️ | 저장 기능 완료 | ### 2.2 Phase B: 핵심 업무 기능 > **⚠️ 2025-12-24 전수 조사 결과**: actions.ts 존재하나 UI에서 console.log로 Mock 처리 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | B-1 | 매출 관리 | `/accounting/sales` | ✅ | ✅ | ✅ | ✅ | ✅ | API 연동 완료, alert→toast 변환 | | B-2 | 매입 관리 | `/accounting/purchase` | ✅ | ✅ | ✅ | ✅ | ✅ | API 연동 완료, alert→toast 변환 | | B-3 | 입금 관리 | `/accounting/deposit` | ✅ | ✅ | ✅ | ✅ | ✅ | API 연동 완료, alert→toast 변환 | | B-4 | 출금 관리 | `/accounting/withdrawal` | ✅ | ✅ | ✅ | ✅ | ✅ | API 연동 완료, alert→toast 변환 | | B-5 | 거래처 관리 | `/accounting/vendor` | ✅ | ✅ | ✅ | ✅ | ✅ | API 연동 완료, console.error 제거 | | B-6 | 어음 관리 | `/accounting/bills` | ✅ | ⏭️ 모달 | ✅ | ✅ | ✅ | API 연동 완료 | ### 2.3 Phase C: 인사/근태 > **2025-12-24 분석 결과**: API 존재, 전체 Mock 사용 중 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | C-1 | 직원 관리 | `/hr/employee-management` | ✅ | ✅ | ✅ | ✅ | ✅ | **2025-12-24 연동 완료** - actions.ts, utils.ts 생성, 전체 CRUD API 연동 | | C-2 | 근태 관리 | `/hr/attendance` | ✅ | ⏭️ | ✅ | ⏭️ | ⏭️ | **2025-12-24 연동 완료** - actions.ts 생성, check-in/check-out/today API 연동 | | C-3 | 휴가 관리 | `/hr/vacation-management` | ✅ | ⏭️ | ✅ | ⏭️ | ⏭️ | **2025-12-24 연동 완료** - actions.ts 생성, 신청현황 탭 API 연동 (목록/승인/반려/신청), 사용현황/부여현황 탭 API 연동 | | C-4 | 부서 관리 | `/hr/departments` | ✅ | ⏭️ | ✅ | ✅ | ✅ | **2025-12-24 연동 완료** - actions.ts 생성, 트리 조회/생성/수정/삭제 API 연동 | ### 2.4 Phase D: 설정/시스템 관리 > **2025-12-24 분석 결과**: 대부분 Mock, console.log로 저장 처리 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | D-1 | 회사 정보 관리 | `/settings/company-info` | ✅ | ⏭️ | ⏭️ | ✅ | ⏭️ | **2025-12-24 연동 완료** - actions.ts 생성, API 조회/수정 연동 | | D-2 | 계정 관리 | `/settings/accounts` | ✅ | ✅ | ✅ | ✅ | ✅ | **2025-12-24 연동 완료** - actions.ts 생성, CRUD API 연동 | | D-3 | 근무 일정 관리 | `/settings/work-schedule` | ✅ | ⏭️ | ⏭️ | ✅ | ⏭️ | **2025-12-24 연동 완료** - actions.ts 생성, 조회/수정 API 연동 | | D-4 | 근태 설정 관리 | `/settings/attendance-settings` | ✅ | ⏭️ | ⏭️ | ✅ | ⏭️ | **2025-12-24 연동 완료** - actions.ts 생성, GPS/허용반경 API 연동 | ### 2.5 Phase E: 인사/급여 > **2025-12-25 완료**: API 연동 완료 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | E-1 | 법인카드 관리 | `/hr/card-management` | ✅ | ✅ | ✅ | ✅ | ✅ | **2025-12-25 완료** - `actions.ts` 생성, CRUD+토글+일괄삭제 API 연동, CardForm 직원목록 API 연동 | | E-2 | 급여 관리 | `/hr/salary` | ✅ | ✅ | ⏭️ | ✅ | ⏭️ | **2025-12-25 완료** - Salary API 신규 생성, `actions.ts` 생성, 목록/상세/상태변경/일괄상태변경 API 연동 | ### 2.6 Phase F: 결재 시스템 > **2025-12-25 완료**: 전체 API 연동 완료 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | F-1 | 기안함 | `/approval/draft-box` | ✅ | ⏭️ | ⏭️ | ⏭️ | ✅ | **2025-12-25 완료** - `actions.ts` 생성, 목록/삭제/일괄삭제 API 연동 | | F-2 | 참조함 | `/approval/reference-box` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | **2025-12-25 완료** - `actions.ts` 생성, 목록/열람처리/일괄처리 API 연동 | | F-3 | 결재함 | `/approval/approval-box` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | **2025-12-25 완료** - `actions.ts` 생성, 목록/승인/반려/일괄처리 API 연동 | | F-4 | 비용견적서 양식 | `/approval/create/expense-estimate` | ⏭️ | ⏭️ | ✅ | ⏭️ | ⏭️ | **2025-12-25 완료** - `actions.ts` 생성, 비용견적서 항목조회/문서생성/상신 API 연동 | ### 2.7 Phase G: 생산 관리 > **2025-12-26 완료**: 전체 API 연동 완료 | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | G-1 | 작업지시 관리 | `/production/work-orders` | ✅ | ✅ | ✅ | ⏭️ | ⏭️ | **2025-12-26 완료** - `actions.ts` 생성, 목록/상세/등록/담당자선택/수주선택 API 연동 | | G-2 | 작업실적 관리 | `/production/work-results` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | **2025-12-26 완료** - `actions.ts` 생성, 목록/통계 API 연동 | | G-3 | 생산 대시보드 | `/production/dashboard` | ✅ | ⏭️ | ⏭️ | ⏭️ | ⏭️ | **2025-12-26 완료** - `actions.ts` 생성, 대시보드 데이터 API 연동 | | G-4 | 작업자 화면 | `/production/worker-screen` | ✅ | ⏭️ | ✅ | ⏭️ | ⏭️ | **2025-12-26 완료** - `actions.ts` 생성, 작업목록/완료/자재투입/공정단계/검사요청 API 연동 | | G-5 | 품질 검사 | `/quality/inspection` | ✅ | ✅ | ✅ | ✅ | ⏭️ | **2025-12-26 완료** - `actions.ts` 생성, 목록/상세/등록/수정 API 연동 | ### 2.8 Phase H: 자재/출하 관리 > **2025-12-24 분석 결과**: 전체 Mock (mockData.ts 파일 사용) | # | 페이지 | React 경로 | 리스트 | 상세 조회 | 등록 | 수정 | 삭제 | 비고 | |---|--------|-----------|--------|----------|------|------|------|------| | H-1 | 입고 관리 | `/material/receiving` | ✅ | ✅ | ✅ | ✅ | ✅ | **2025-12-26 연동 완료** - `actions.ts` 생성, 목록/상세/등록/수정/삭제/통계/옵션 API 연동 | | H-2 | 재고 현황 | `/material/stock-status` | ✅ | ✅ | ⏭️ | ⏭️ | ⏭️ | **2025-12-26 연동 완료** - `actions.ts` 생성, 목록/상세/통계/옵션 API 연동 | | H-3 | 출하 관리 | `/outbound/shipment` | ✅ | ✅ | ✅ | ✅ | ✅ | **2025-12-26 연동 완료** - `actions.ts` 생성, 목록/상세/등록/수정/삭제/통계/옵션 API 연동 | ### 2.9 Phase I: API 연동 및 UI 완성도 개선 > **2025-12-26 완료**: 전체 항목 API 연동 및 UI CRUD 기능 보완 완료 | # | 페이지 | React 경로 | 조회 | 등록 | 수정 | 삭제 | 기타 | 비고 | |---|--------|-----------|------|------|------|------|------|------| | I-1 | 미지급비용 관리 | `/accounting/expected-expense` | ✅ | ✅ | ✅ | ✅ | 예상지급일변경 ✅ | **2025-12-26 완료** - 등록/수정 폼 다이얼로그, 삭제/일괄삭제 구현 | | I-2 | 거래처 원장 | `/accounting/vendor-ledger` | ✅ | ⏭️ | ⏭️ | ⏭️ | 상세이동 ✅, 엑셀/PDF ✅ | **조회전용** - exportVendorLedgerExcel, exportVendorLedgerDetailPdf API 연동 | | I-3 | 카드 거래 조회 | `/accounting/card-transaction` | ✅ | ⏭️ | ✅ | ⏭️ | 계정과목 일괄수정 ✅ | **외부연동 데이터** (등록/삭제 불필요) | | I-4 | 은행 거래 조회 | `/accounting/bank-transaction` | ✅ | ⏭️ | ✅ | ⏭️ | - | **2025-12-26 확인** - 수정은 상세 페이지 이동 방식 (deposits/{id}?mode=edit) | | I-5 | 채권 현황 | `/accounting/receivables-status` | ✅ | ⏭️ | ✅ | ⏭️ | 연체토글 ✅, 엑셀 ✅ | **2025-12-26 완료** - updateOverdueStatus, exportReceivablesExcel API 연동 | | I-6 | 일일 보고서 | `/accounting/daily-report` | ✅ | ⏭️ | ⏭️ | ⏭️ | 엑셀 ✅ | **조회전용 리포트** - exportDailyReportExcel API 연동 | | I-7 | 종합 분석 보고서 | `/reports/comprehensive-analysis` | ✅ | ⏭️ | ⏭️ | ⏭️ | 이슈승인 ✅ | **2025-12-26 완료** - approveIssue/rejectIssue API 연동 | | I-8 | 휴가 정책 관리 | `/settings/leave-policy` | ✅ | ⏭️ | ✅ | ⏭️ | - | ✅ **완료** (단일 레코드 설정 관리) | #### Phase I 상세 분석 (2025-12-26) **I-1 미지급비용 관리 (ExpectedExpenseManagement)** - **actions.ts**: `getExpectedExpenseList`, `createExpectedExpense`, `updateExpectedExpense`, `deleteExpectedExpense`, `bulkDeleteExpectedExpenses`, `updateExpectedPaymentDate` ✅ - **UI 현황**: 목록 조회 ✅, 예상지급일 변경 ✅, **등록 폼/모달 ❌**, **수정 폼/모달 ❌**, **삭제 버튼 ❌**, **일괄삭제 버튼 ❌** - **필요 작업**: UI에 등록/수정/삭제 기능 연동 (API는 완료) **I-2 거래처 원장 (VendorLedger)** - **actions.ts**: `getVendorLedgerList`, `getVendorLedgerSummary`, `getVendorLedgerDetail` ✅ - **특성**: 거래처별 매출/수금 집계 조회 기능 → **CRUD 불필요** (읽기전용이 정상) - **상태**: ✅ 완료 (조회전용) **I-3 카드거래조회 (CardTransactionInquiry)** - **actions.ts**: `getCardTransactionList`, `getCardTransactionSummary`, `bulkUpdateAccountCode` ✅ - **특성**: 외부 카드사 연동 데이터 → 등록/삭제 불필요, **계정과목 수정만 필요** - **UI 현황**: 조회 ✅, 체크박스 선택 ✅, 계정과목 일괄수정 Dialog ✅ - **상태**: ✅ 완료 **I-4 은행거래조회 (BankTransactionInquiry)** - **actions.ts**: `getBankTransactionList`, `getBankTransactionSummary`, `getBankAccountOptions` ✅ - **특성**: 외부 은행 연동 데이터 → 등록/삭제 불필요 - **UI 현황**: 조회 ✅, 수정 아이콘(Pencil) 있으나 **수정 API 없음** - **필요 작업**: 은행거래 수정 API 개발 또는 수정 기능 제거 결정 필요 **I-5 채권현황 (ReceivablesStatus)** - **actions.ts**: `getReceivablesList`, `getReceivablesSummary` ✅ - **특성**: 거래처별 월별 채권 집계 데이터 → **CRUD 불필요** - **UI 현황**: 조회 ✅, 연체 토글 Switch (UI만, API 미연동), 저장/엑셀 버튼 (placeholder) - **필요 작업**: 연체 토글 저장 API 개발 및 연동 **I-6 일일보고서 (DailyReport)** - **actions.ts**: `getNoteReceivables`, `getDailyAccounts`, `getDailyReportSummary` ✅ - **특성**: 일별 어음/계좌 현황 집계 리포트 → **CRUD 불필요** - **상태**: ✅ 완료 (조회전용) **I-7 종합분석 (ComprehensiveAnalysis)** - **actions.ts**: `getComprehensiveAnalysis` ✅ (reports/actions.ts) - **특성**: 경영 대시보드 → **CRUD 불필요** - **UI 현황**: 대시보드 카드/체크포인트 ✅, 오늘 이슈 승인/거절 버튼 (UI만, API 미연동) - **필요 작업**: 이슈 승인/거절 API 개발 및 연동 (선택사항) **I-8 휴가 정책 관리 (LeavePolicyManagement)** - **actions.ts**: `getLeavePolicy`, `updateLeavePolicy` ✅ - **특성**: 단일 레코드 설정 관리 → 등록/삭제 불필요 - **상태**: ✅ 완료 ### 2.10 Phase J: 게시판 시스템 > **2025-12-26 분석 결과**: mng 게시판 관리 시스템 (`mng.sam.kr/boards`) 연동 예정 #### 🏗️ mng 게시판 시스템 아키텍처 **EAV (Entity-Attribute-Value) 패턴 기반 통합 게시판:** ``` boards (게시판 정의) ├── board_settings (EAV 필드 스키마) ├── posts (게시글) │ └── post_custom_field_values (EAV 값 저장) └── 첨부파일 (Polymorphic: files → fileable) ``` **API 엔드포인트 (`/admin/boards/*`):** | 기능 | Method | Endpoint | 설명 | |------|--------|----------|------| | 게시판 CRUD | GET/POST/PUT/DELETE | `/boards`, `/boards/{id}` | 게시판 설정 관리 | | 통계 | GET | `/boards/stats` | 게시판 통계 (총/활성/비활성/삭제) | | 필드 관리 | GET/POST/PUT/DELETE | `/boards/{id}/fields` | EAV 필드 스키마 관리 | | 필드 순서 | POST | `/boards/{id}/fields/reorder` | 드래그앤드롭 정렬 | | 활성화 토글 | POST | `/boards/{id}/toggle-active` | 활성/비활성 전환 | | 복원/영구삭제 | POST/DELETE | `/boards/{id}/restore`, `/boards/{id}/force` | Soft Delete 관리 | | 템플릿 | GET/POST | `/boards/templates`, `/boards/create-from-template` | 템플릿 기반 생성 | **게시판 모델 주요 필드:** ```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 | 🔄 | 🔄 | 🔄 | ✅ `/admin/boards/*` 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 ``` #### ⚠️ 추가 API 개발 필요 (api 프로젝트) 현재 mng에는 **게시판 설정 API**만 있고, **게시글 CRUD API**는 별도 구현 필요: | API | Method | Endpoint | 설명 | |-----|--------|----------|------| | 게시글 목록 | GET | `/boards/{boardCode}/posts` | 페이지네이션, 검색, 정렬 | | 게시글 상세 | GET | `/boards/{boardCode}/posts/{id}` | 조회수 증가, 커스텀필드 포함 | | 게시글 등록 | POST | `/boards/{boardCode}/posts` | 커스텀필드 값 저장 | | 게시글 수정 | PUT | `/boards/{boardCode}/posts/{id}` | 커스텀필드 값 수정 | | 게시글 삭제 | DELETE | `/boards/{boardCode}/posts/{id}` | Soft Delete | | 댓글 CRUD | GET/POST/PUT/DELETE | `/posts/{id}/comments` | 댓글 기능 | | 파일 업로드 | POST | `/posts/{id}/files` | 첨부파일 | ### 2.11 Phase K: 고객센터 > **2025-12-26 분석 결과**: 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: API 프로젝트 게시글 API 개발** ``` api/app/Http/Controllers/Api/V1/PostController.php api/app/Services/PostService.php api/app/Http/Requests/Post/StorePostRequest.php ``` **Step 2: mng에서 시스템 게시판 생성** ``` mng.sam.kr/boards → 템플릿으로 생성: - system-faq (FAQ 템플릿) - system-notice (공지사항 템플릿) - system-event (커스텀: 이벤트) - system-qna (1:1문의 템플릿) ``` **Step 3: React 공통 모듈 개발** ``` react/src/lib/board/ ├── types.ts ← API 타입 정의 ├── actions.ts ← 게시글 CRUD Server Actions └── utils.ts ← 커스텀필드 렌더링 유틸 ``` **Step 4: 각 메뉴별 연동** ``` K-3 공지사항 (가장 단순) → K-1 FAQ → K-2 이벤트 → K-4 문의 (가장 복잡) ``` #### 💡 커스텀 필드 동적 렌더링 전략 ```typescript // 게시판 필드 스키마 기반 동적 폼 생성 function renderCustomField(field: BoardSetting, value: string | null) { switch (field.field_type) { case 'text': return ; case 'select': return