# 당월 예상 지출내역 API 연동 계획 > **작성일**: 2026-01-22 > **목적**: CEO 대시보드의 당월 예상 지출내역 섹션 4개 카드 및 모달 API 연동 > **기준 문서**: `react/src/components/business/CEODashboard/`, `api/app/Services/ExpectedExpenseService.php` > **상태**: 🔄 진행중 (Serena ID: monthly-expense-state) --- ## 📍 현재 진행 상태 | 항목 | 내용 | |------|------| | **마지막 완료 작업** | - | | **다음 작업** | Phase 1.1 - 카드 요약 데이터 연동 상태 확인 | | **진행률** | 0/8 (0%) | | **마지막 업데이트** | 2026-01-22 | --- ## 1. 개요 ### 1.1 배경 CEO 대시보드의 **당월 예상 지출내역** 섹션에 4개의 카드(매입, 카드, 발행어음, 총예상 지출 합계)가 있으며, 현재 카드 요약 데이터는 API 연동이 완료되어 있으나, 각 카드 클릭 시 표시되는 **모달의 상세 데이터는 목업(Mock) 데이터**를 사용하고 있음. 모달에는 다음 정보가 포함됨: - **요약 카드**: 당월 금액, 전월 대비, 이용건 등 - **차트**: 월별 추이 바차트, 유형별/사용자별 파이차트, 거래처별 수평 바차트 - **테이블**: 일별 상세 내역 (필터, 정렬, 합계 포함) ### 1.2 기준 원칙 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 🎯 핵심 원칙 │ ├─────────────────────────────────────────────────────────────────┤ │ - Service-First 아키텍처 (비즈니스 로직은 Service에) │ │ - API 우선 개발 → Frontend 연동 │ │ - 기존 API 패턴 준수 (ExpectedExpenseService 확장) │ │ - Multi-tenancy 필수 (tenant_id 스코프) │ └─────────────────────────────────────────────────────────────────┘ ``` ### 1.3 변경 승인 정책 | 분류 | 예시 | 승인 | |------|------|------| | ✅ 즉시 가능 | 기존 Service에 메서드 추가, 새 API 엔드포인트, React Hook 추가 | 불필요 | | ⚠️ 컨펌 필요 | 테이블 스키마 변경, 기존 API 응답 구조 변경 | **필수** | | 🔴 금지 | 기존 summary API 제거, 프로덕션 데이터 직접 수정 | 별도 협의 | ### 1.4 준수 규칙 - `docs/quickstart/quick-start.md` - 빠른 시작 가이드 - `docs/standards/quality-checklist.md` - 품질 체크리스트 - `api/CLAUDE.md` - SAM API Development Rules - `docs/guides/swagger-guide.md` - Swagger 문서 작성 가이드 --- ## 1.5 🔴 핵심 발견 사항: 데이터 소스 매핑 > **중요**: 4개 카드는 **서로 다른 테이블**에서 데이터를 가져와야 함! | 카드 ID | 카드명 | 데이터 소스 테이블 | 비고 | |---------|--------|-------------------|------| | **me1** | 매입 | `purchases` | Purchase 모델 | | **me2** | 카드 | `withdrawals` (payment_method='card') | Withdrawal 모델, CardTransactionService 참조 | | **me3** | 발행어음 | `bills` (bill_type='issued') | Bill 모델 | | **me4** | 지출예상 | `expected_expenses` (전체 집계) | ExpectedExpense 모델 | ### 1.5.1 ExpectedExpense 모델 (지출예상) **파일**: `api/app/Models/Tenants/ExpectedExpense.php` ```php // ⚠️ 주의: transaction_type에 'card', 'bill'이 없음! public const TRANSACTION_TYPES = [ 'purchase' => '매입', 'advance' => '선급금', 'suspense' => '가지급금', 'rent' => '임대료', 'salary' => '급여', 'insurance' => '보험료', 'tax' => '세금', 'utilities' => '공과금', 'other' => '기타', ]; public const PAYMENT_STATUSES = [ 'pending' => '미지급', 'partial' => '부분지급', 'completed' => '지급완료', ]; // 주요 필드 protected $fillable = [ 'vendor_id', 'transaction_type', 'description', 'amount', 'expected_payment_date', 'payment_status', 'paid_amount', // ... ]; ``` ### 1.5.2 Purchase 모델 (매입) **파일**: `api/app/Models/Tenants/Purchase.php` ```php public const PURCHASE_TYPES = [ 'unset' => '미설정', 'raw_material' => '원재료매입', 'subsidiary_material' => '부재료매입', 'packaging_material' => '포장재매입', 'consumable' => '소모품', 'equipment' => '장비', 'service' => '용역', 'other' => '기타', ]; // 주요 필드: vendor_id, purchase_type, purchase_date, total_amount, status // 관계: belongsTo(Vendor), hasMany(PurchaseItem) ``` ### 1.5.3 Bill 모델 (발행어음) **파일**: `api/app/Models/Tenants/Bill.php` ```php public const BILL_TYPES = [ 'received' => '수취', 'issued' => '발행', // ← me3 필터 조건 ]; public const ISSUED_STATUSES = [ 'stored' => '보관중', 'maturityAlert' => '만기입금(7일전)', 'matured' => '만기', 'defaulted' => '부도', 'partialPayment' => '분할입금', 'completed' => '입금완료', ]; // 주요 필드: bill_type, vendor_id, issue_date, maturity_date, amount, status // 관계: belongsTo(Vendor), belongsTo(BankAccount) ``` ### 1.5.4 Withdrawal 모델 (카드 사용) **파일**: `api/app/Models/Tenants/Withdrawal.php` ```php public const PAYMENT_METHODS = [ 'cash' => '현금', 'transfer' => '계좌이체', 'card' => '카드', // ← me2 필터 조건 'check' => '수표', ]; // 주요 필드: bank_account_id, card_id, payment_method, withdrawal_date, // amount, description, category, vendor_id // 관계: belongsTo(Card), belongsTo(BankAccount), belongsTo(Vendor) ``` ### 1.5.5 CardTransactionService (기존 서비스 참조) **파일**: `api/app/Services/CardTransactionService.php` ```php // summary() 메서드 - 카드 거래 조회 예시 public function summary(): array { $currentMonth = Withdrawal::where('payment_method', 'card') ->whereBetween('withdrawal_date', [$startOfMonth, $endOfMonth]) ->sum('amount'); return [ 'previous_month_total' => $previousMonth, 'current_month_total' => $currentMonth, 'total_count' => $count, 'total_amount' => $total, ]; } ``` --- ## 1.6 DetailModal 컴포넌트 구조 **파일**: `react/src/components/business/CEODashboard/modals/DetailModal.tsx` 모달은 `DetailModalConfig` 타입의 설정 객체를 받아 렌더링: ```typescript interface DetailModalConfig { title: string; subtitle?: string; summaryCards?: SummaryCardData[]; // 상단 요약 카드들 barChart?: BarChartConfig; // 월별 추이 차트 pieChart?: PieChartConfig; // 파이 차트 (유형별) horizontalBarChart?: HorizontalBarChartConfig; // 수평 바차트 (거래처별) table?: TableConfig; // 상세 테이블 (필터, 정렬 포함) } // 렌더링 순서 1. SummaryCard[] (요약 카드들) 2. BarChartSection (월별 추이) 3. PieChartSection OR HorizontalBarChartSection (비율/현황) 4. TableSection (상세 내역 + 필터 + 정렬) ``` **데이터 흐름**: ``` 카드 클릭 → handleMonthlyExpenseCardClick(cardId) → getMonthlyExpenseModalConfig(cardId) // 현재 하드코딩 → setDetailModalConfig(config) → DetailModal 렌더링 ``` --- ## 2. 대상 범위 ### 2.1 Phase 1: 현황 확인 및 카드 데이터 검증 | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 1.1 | 카드 요약 데이터 API 연동 상태 확인 | ⏳ | `useCEODashboard` → `useMonthlyExpense` | | 1.2 | 현재 모달 목업 데이터 구조 분석 | ⏳ | `monthlyExpenseConfigs.ts` | ### 2.2 Phase 2: API 엔드포인트 개발 | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 2.1 | 매입(me1) 상세 API 개발 | ⏳ | 월별 추이, 유형별 비율, 일별 내역 | | 2.2 | 카드(me2) 상세 API 개발 | ⏳ | 월별 추이, 사용자별 비율, 일별 내역 | | 2.3 | 발행어음(me3) 상세 API 개발 | ⏳ | 월별 추이, 거래처별 현황, 일별 내역 | | 2.4 | 지출예상(me4) 상세 API 개발 | ⏳ | 승인 내역서, 지출 합계, 계좌 잔액 | ### 2.3 Phase 3: Frontend 모달 연동 | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 3.1 | API 호출 Hook 추가 | ⏳ | `useCEODashboard.ts` 확장 | | 3.2 | 모달 설정에서 API 데이터 연동 | ⏳ | `monthlyExpenseConfigs.ts` 수정 | --- ## 3. 작업 절차 ### 3.1 단계별 절차 ``` Step 1: 현황 확인 (Phase 1) ├── useCEODashboard.ts의 useMonthlyExpense 훅 동작 확인 ├── transformMonthlyExpenseResponse 변환 로직 확인 └── monthlyExpenseConfigs.ts 목업 데이터 구조 분석 Step 2: API 설계 (Phase 2 준비) ├── 각 모달별 필요 데이터 정의 ├── ExpectedExpenseService에 추가할 메서드 설계 └── Swagger 문서 작성 Step 3: API 개발 (Phase 2) ├── ExpectedExpenseService에 상세 조회 메서드 추가 ├── ExpectedExpenseController에 라우트 추가 ├── FormRequest 검증 클래스 생성 └── Swagger 문서 생성 Step 4: Frontend 연동 (Phase 3) ├── API 타입 정의 추가 (dashboard/types.ts) ├── API 호출 함수 추가 (useCEODashboard.ts) ├── Transformer 함수 추가 (transformers.ts) └── monthlyExpenseConfigs.ts를 동적 데이터로 변경 ``` ### 3.2 모달별 데이터 구조 분석 #### me1 (매입 상세) ```typescript { summaryCards: [ { label: '당월 매입', value: number, unit: '원' }, { label: '전월 대비', value: string, isComparison: true } ], barChart: { title: '월별 매입 추이', data: MonthlyData[] }, pieChart: { title: '자재 유형별 구매 비율', data: TypeRatioData[] }, table: { title: '일별 매입 내역', columns: ['no', 'date', 'vendor', 'amount', 'type'], data: PurchaseItem[], filters: ['type', 'sortOrder'] } } ``` #### me2 (카드 상세) ```typescript { summaryCards: [ { label: '당월 카드 사용', value: number, unit: '원' }, { label: '전월 대비', value: string, isComparison: true }, { label: '이용건', value: string } ], barChart: { title: '월별 카드 사용 추이', data: MonthlyData[] }, pieChart: { title: '사용자별 카드 사용 비율', data: UserRatioData[] }, table: { title: '일별 카드 사용 내역', columns: ['no', 'cardName', 'user', 'date', 'store', 'amount', 'usageType'], data: CardUsageItem[], filters: ['user', 'sortOrder'] } } ``` #### me3 (발행어음 상세) ```typescript { summaryCards: [ { label: '당월 발행어음 사용', value: number, unit: '원' }, { label: '전월 대비', value: string, isComparison: true } ], barChart: { title: '월별 발행어음 추이', data: MonthlyData[] }, horizontalBarChart: { title: '당월 거래처별 발행어음', data: VendorData[] }, table: { title: '일별 발행어음 내역', columns: ['no', 'vendor', 'issueDate', 'dueDate', 'amount', 'status'], data: BillItem[], filters: ['vendor', 'status', 'sortOrder'] } } ``` #### me4 (지출예상 상세) ```typescript { summaryCards: [ { label: '당월 지출 예상', value: number, unit: '원' }, { label: '전월 대비', value: string, isComparison: true }, { label: '총 계좌 잔액', value: number, unit: '원' } ], table: { title: '당월 지출 승인 내역서', columns: ['paymentDate', 'item', 'amount', 'vendor', 'account'], data: ExpenseItem[], filters: ['vendor', 'sortOrder'], footerSummary: [ { label: '지출 합계', value: number }, { label: '계좌 잔액', value: number }, { label: '최종 차액', value: number } ] } } ``` --- ## 4. 상세 작업 내용 > 각 Phase 진행 후 이 섹션에 상세 내용 추가 ### 4.1 Phase 1: 현황 확인 #### 1.1 카드 요약 데이터 API 연동 상태 - **상태**: ⏳ 대기 - **확인 파일**: - `react/src/hooks/useCEODashboard.ts` - `useMonthlyExpense()` 훅 - `react/src/lib/api/dashboard/transformers.ts` - `transformMonthlyExpenseResponse()` - `api/app/Services/ExpectedExpenseService.php` - `summary()` 메서드 **현재 분석 결과**: - ✅ 카드 요약 데이터는 이미 API 연동됨 (`/api/proxy/expected-expenses/summary`) - ✅ `by_transaction_type`으로 purchase, card, bill 분류되어 반환 - ❌ 모달 상세 데이터는 `monthlyExpenseConfigs.ts`에서 하드코딩된 목업 사용 #### 1.2 현재 모달 목업 데이터 구조 - **상태**: ✅ 분석 완료 - **확인 파일**: `react/src/components/business/CEODashboard/modalConfigs/monthlyExpenseConfigs.ts` **현재 분석 결과**: - 각 카드 ID(me1~me4)별 `DetailModalConfig` 객체 정의 - 하드코딩된 데이터: summaryCards, barChart, pieChart, horizontalBarChart, table - 테이블 필터와 정렬 옵션도 정적으로 정의됨 **목업 함수 시그니처** (API로 대체 필요): ```typescript // monthlyExpenseConfigs.ts export function getMonthlyExpenseModalConfig(cardId: string): DetailModalConfig | null { switch (cardId) { case 'me1': return getME1Config(); // 매입 - 하드코딩 목업 case 'me2': return getME2Config(); // 카드 - 하드코딩 목업 case 'me3': return getME3Config(); // 발행어음 - 하드코딩 목업 case 'me4': return getME4Config(); // 지출예상 - 하드코딩 목업 default: return null; } } ``` **목업 → API 전환 방식** (선택지): 1. **방식 A**: `getMonthlyExpenseModalConfig`를 async로 변경 → API 호출 2. **방식 B**: Modal 컴포넌트에서 `useEffect`로 API 호출 → config 동적 생성 3. **방식 C** (권장): 새 Hook `useMonthlyExpenseDetail(type)` 생성 → 데이터 반환 → config 생성 ### 4.2 Phase 2: API 엔드포인트 개발 > **⚠️ 중요**: 각 API는 **서로 다른 테이블/서비스**에서 데이터를 조회함! #### 2.1 매입(me1) 상세 API - **상태**: ⏳ 대기 - **엔드포인트**: `GET /api/v1/purchases/dashboard-detail` - **Service**: `PurchaseService` (신규 메서드 추가 또는 기존 확장) - **Model**: `Purchase` (테이블: `purchases`) - **필요 데이터**: - 당월 매입 합계: `Purchase::whereBetween('purchase_date', [$start, $end])->sum('total_amount')` - 전월 대비 변화율: 전월 합계 대비 증감률 계산 - 최근 7개월 월별 매입 추이: `groupBy(month)` 집계 - 자재 유형별 구매 비율: `groupBy('purchase_type')` → `raw_material`, `subsidiary_material` 등 - 일별 매입 내역: 개별 레코드 with `vendor` 관계 **API 응답 구조**: ```json { "summary": { "current_month_total": 305000000, "previous_month_total": 276000000, "change_rate": 10.5, "count": 45 }, "monthly_trend": [ { "month": "2025-07", "amount": 250000000 }, { "month": "2025-08", "amount": 280000000 } ], "by_type": [ { "type": "raw_material", "label": "원재료매입", "amount": 180000000, "ratio": 59.0 }, { "type": "subsidiary_material", "label": "부재료매입", "amount": 80000000, "ratio": 26.2 } ], "items": [ { "id": 1, "date": "2026-01-15", "vendor_name": "대한철강", "amount": 15000000, "type": "raw_material", "type_label": "원재료매입" } ] } ``` #### 2.2 카드(me2) 상세 API - **상태**: ⏳ 대기 - **엔드포인트**: `GET /api/v1/card-transactions/dashboard-detail` - **Service**: `CardTransactionService` (기존 서비스 확장) - **Model**: `Withdrawal` (테이블: `withdrawals`, 조건: `payment_method='card'`) - **필요 데이터**: - 당월 카드 사용 합계, 이용 건수: `where('payment_method', 'card')` - 전월 대비 변화율 - 최근 7개월 월별 카드 사용 추이 - 사용자별 카드 사용 비율: `groupBy` → `card.assigned_user_id` 기준 - 일별 카드 사용 내역: with `card`, `card.assignedUser` 관계 **API 응답 구조**: ```json { "summary": { "current_month_total": 30123000, "previous_month_total": 27000000, "change_rate": 11.6, "count": 128 }, "monthly_trend": [ { "month": "2025-07", "amount": 25000000 } ], "by_user": [ { "user_id": 1, "user_name": "김철수", "amount": 12000000, "ratio": 39.8 } ], "items": [ { "id": 1, "card_name": "삼성카드 1234", "user_name": "김철수", "date": "2026-01-20", "store": "GS25 강남점", "amount": 35000, "category": "복리후생비" } ] } ``` #### 2.3 발행어음(me3) 상세 API - **상태**: ⏳ 대기 - **엔드포인트**: `GET /api/v1/bills/dashboard-detail` - **Service**: `BillService` (신규 메서드 추가) - **Model**: `Bill` (테이블: `bills`, 조건: `bill_type='issued'`) - **필요 데이터**: - 당월 발행어음 합계: `where('bill_type', 'issued')` - 전월 대비 변화율 - 최근 7개월 월별 발행어음 추이 - 거래처별 발행어음 현황: `groupBy('vendor_id')` with vendor 관계 - 일별 발행어음 내역: with `vendor` 관계 **API 응답 구조**: ```json { "summary": { "current_month_total": 30123000, "previous_month_total": 28000000, "change_rate": 7.6, "count": 15 }, "monthly_trend": [ { "month": "2025-07", "amount": 26000000 } ], "by_vendor": [ { "vendor_id": 1, "vendor_name": "대한건설", "amount": 15000000, "ratio": 49.8 } ], "items": [ { "id": 1, "vendor_name": "대한건설", "issue_date": "2026-01-05", "maturity_date": "2026-04-05", "amount": 10000000, "status": "stored", "status_label": "보관중" } ] } ``` #### 2.4 지출예상(me4) 상세 API - **상태**: ⏳ 대기 - **엔드포인트**: `GET /api/v1/expected-expenses/dashboard-detail` - **Service**: `ExpectedExpenseService` (기존 서비스 확장) - **Model**: `ExpectedExpense` (테이블: `expected_expenses`) - **추가 Model**: `BankAccount` (계좌 잔액 조회) - **필요 데이터**: - 당월 지출 예상 합계: `sum('amount')` where `expected_payment_date` in current month - 전월 대비 변화율 - 총 계좌 잔액: `BankAccount::sum('balance')` - 지출 승인 내역: 개별 레코드 with `vendor`, `bankAccount` 관계 - 푸터 요약: 지출 합계, 계좌 잔액, 최종 차액 계산 **API 응답 구조**: ```json { "summary": { "current_month_total": 350000000, "previous_month_total": 320000000, "change_rate": 9.4, "total_account_balance": 3050000000 }, "items": [ { "id": 1, "expected_payment_date": "2026-01-25", "description": "원자재 대금", "amount": 50000000, "vendor_name": "대한철강", "account_name": "기업은행 1234" } ], "footer": { "expense_total": 350000000, "account_balance": 3050000000, "difference": 2700000000 } } ### 4.3 Phase 3: Frontend 모달 연동 #### 3.1 API 호출 Hook 추가 - **상태**: ⏳ 대기 - **수정 파일**: `react/src/hooks/useCEODashboard.ts` - **추가 내용**: - `useMonthlyExpenseDetail(type: 'purchase' | 'card' | 'bill' | 'total')` - 로딩, 에러, 데이터 상태 관리 #### 3.2 모달 설정 동적 데이터 연동 - **상태**: ⏳ 대기 - **수정 파일**: `react/src/components/business/CEODashboard/modalConfigs/monthlyExpenseConfigs.ts` - **변경 내용**: - 정적 함수 → 비동기 데이터 fetching 함수로 변경 - 또는 모달 컴포넌트에서 직접 API 호출하도록 변경 --- ## 5. 컨펌 대기 목록 > API 내부 로직 변경 등 승인 필요 항목 | # | 항목 | 변경 내용 | 영향 범위 | 상태 | |---|------|----------|----------|------| | - | - | - | - | - | --- ## 6. 변경 이력 | 날짜 | 항목 | 변경 내용 | 파일 | 승인 | |------|------|----------|------|------| | 2026-01-22 | - | 문서 초안 작성 | - | - | --- ## 7. 참고 문서 - **빠른 시작**: `docs/quickstart/quick-start.md` - **품질 체크리스트**: `docs/standards/quality-checklist.md` - **API 규칙**: `api/CLAUDE.md` (SAM API Development Rules) - **Swagger 가이드**: `docs/guides/swagger-guide.md` - **대시보드 타입**: `react/src/lib/api/dashboard/types.ts` --- ## 8. 세션 및 메모리 관리 정책 (Serena Optimized) ### 8.1 세션 시작 시 (Load Strategy) ```javascript // 순차적 로드 read_memory("monthly-expense-state") // 1. 상태 파악 read_memory("monthly-expense-snapshot") // 2. 사고 흐름 복구 read_memory("monthly-expense-active-symbols") // 3. 작업 대상 파악 ``` ### 8.2 작업 중 관리 (Context Defense) | 컨텍스트 잔량 | Action | 내용 | |--------------|--------|------| | **30% 이하** | 🛠 **Snapshot** | `write_memory("monthly-expense-snapshot", "코드변경+논의요약")` | | **20% 이하** | 🧹 **Context Purge** | `write_memory("monthly-expense-active-symbols", "주요 수정 파일/함수")` | | **10% 이하** | 🛑 **Stop & Save** | 최종 상태 저장 후 세션 교체 권고 | ### 8.3 Serena 메모리 구조 - `monthly-expense-state`: { phase, progress, next_step, last_decision } (JSON 구조) - `monthly-expense-snapshot`: 현재까지의 논의 및 코드 변경점 요약 (Text) - `monthly-expense-rules`: 해당 작업에서 결정된 불변의 규칙들 (Text) - `monthly-expense-active-symbols`: 현재 수정 중인 파일/심볼 리스트 (List) --- ## 9. 검증 결과 > 작업 완료 후 이 섹션에 검증 결과 추가 ### 9.1 테스트 케이스 | 입력값 | 예상 결과 | 실제 결과 | 상태 | |--------|----------|----------|------| | me1 카드 클릭 | 매입 상세 모달 표시 (API 데이터) | | ⏳ | | me2 카드 클릭 | 카드 상세 모달 표시 (API 데이터) | | ⏳ | | me3 카드 클릭 | 발행어음 상세 모달 표시 (API 데이터) | | ⏳ | | me4 카드 클릭 | 지출예상 상세 모달 표시 (API 데이터) | | ⏳ | | 테이블 필터 적용 | 필터된 데이터 표시 | | ⏳ | | 테이블 정렬 변경 | 정렬된 데이터 표시 | | ⏳ | ### 9.2 성공 기준 달성 현황 | 기준 | 달성 | 비고 | |------|------|------| | 4개 카드 요약 데이터 API 연동 | ✅ | 이미 연동됨 | | 매입 상세 모달 API 연동 | ⏳ | | | 카드 상세 모달 API 연동 | ⏳ | | | 발행어음 상세 모달 API 연동 | ⏳ | | | 지출예상 상세 모달 API 연동 | ⏳ | | | 테이블 필터/정렬 동작 | ⏳ | | --- ## 10. 자기완결성 점검 결과 > 문서 생성 시 Phase 5.5에서 수행된 자기완결성 점검 결과 ### 10.1 체크리스트 검증 | # | 검증 항목 | 상태 | 비고 | |---|----------|:----:|------| | 1 | 작업 목적이 명확한가? | ✅ | 4개 카드 및 모달 API 연동 | | 2 | 성공 기준이 정의되어 있는가? | ✅ | 섹션 9.2 참조 | | 3 | 작업 범위가 구체적인가? | ✅ | Phase별 작업 항목 명시 | | 4 | 의존성이 명시되어 있는가? | ✅ | **1.5 데이터 소스 매핑** - 4개 모델 및 테이블 명시 | | 5 | 참고 파일 경로가 정확한가? | ✅ | 모든 파일 경로 검증됨 | | 6 | 단계별 절차가 실행 가능한가? | ✅ | Step 1~4 구체적, API 응답 구조 포함 | | 7 | 검증 방법이 명시되어 있는가? | ✅ | 섹션 9.1 테스트 케이스 | | 8 | 모호한 표현이 없는가? | ✅ | 구체적 데이터 구조 및 쿼리 힌트 명시 | ### 10.2 새 세션 시뮬레이션 테스트 | 질문 | 답변 가능 | 참조 섹션 | |------|:--------:|----------| | Q1. 이 작업의 목적은 무엇인가? | ✅ | 1.1 배경 | | Q2. 어디서부터 시작해야 하는가? | ✅ | 3.1 단계별 절차 | | Q3. 어떤 파일을 수정해야 하는가? | ✅ | 2. 대상 범위, 4. 상세 작업 내용 | | Q4. 작업 완료 확인 방법은? | ✅ | 9. 검증 결과 | | Q5. 막혔을 때 참고 문서는? | ✅ | 7. 참고 문서 | | **Q6. 각 카드의 데이터 소스는?** | ✅ | **1.5 데이터 소스 매핑** | | **Q7. API 응답 형식은?** | ✅ | **4.2 각 API별 응답 구조** | | **Q8. 모델 필드는 무엇인가?** | ✅ | **1.5.1~1.5.4 모델 정의** | **결과**: 8/8 통과 → ✅ 자기완결성 확보 (보완 후) ### 10.3 보완 이력 | 날짜 | 항목 | 원본 | 보완 내용 | |------|------|------|----------| | 2026-01-22 | - | - | 초기 검증 통과 (70-80%) | | 2026-01-22 | 1.5 | 누락 | **데이터 소스 매핑** 추가 - 4개 카드별 테이블 명시 | | 2026-01-22 | 1.5.1~1.5.5 | 누락 | **모델 정의** 추가 - 필드, 상수, 관계 명시 | | 2026-01-22 | 1.6 | 누락 | **DetailModal 구조** 추가 - 컴포넌트 흐름 명시 | | 2026-01-22 | 4.2 | 불완전 | **API 응답 구조** 추가 - JSON 예시 포함 | | 2026-01-22 | 4.1 | 불완전 | **목업 전환 방식** 추가 - 3가지 선택지 명시 | --- *이 문서는 /plan 스킬로 생성되었습니다.*