# ItemMasterDataManagement 타입 오류 수정 체크리스트

**시작일**: 2025-11-21
**대상 파일**: `src/components/items/ItemMasterDataManagement.tsx`
**초기 오류 개수**: ~150개
**목표**: 모든 타입 오류 0개

---

## 📊 전체 진행 상황

- [x] Phase 1: ItemPage 속성 수정 ✅
- [x] Phase 2: ItemSection 속성 수정 ✅
- [x] Phase 3: ItemField 속성 수정 ✅
- [x] Phase 4: 존재하지 않는 속성 제거/수정 (대부분 완료, 일부 남음)
- [x] Phase 5: ID 타입 통일 ✅
- [x] Phase 6: State 타입 수정 (대부분 완료, 일부 남음)
- [ ] Phase 7: 함수 시그니처 수정 및 최종 검증 🔄
- [ ] Phase 8: Import 정리

---

## Phase 1: ItemPage 속성 수정

**목표**: ItemPage 타입의 camelCase 속성을 snake_case로 수정

### 타입 정의 참조
```typescript
interface ItemPage {
  id: number;
  page_name: string;     // NOT pageName
  item_type: string;     // NOT itemType
  absolute_path: string; // NOT absolutePath
  is_active: boolean;    // NOT isActive
  order_no: number;
  created_at: string;    // NOT createdAt
  updated_at: string;
  sections: ItemSection[];
}
```

### 수정 패턴
- [ ] `page.pageName` → `page.page_name` (읽기)
- [ ] `page.itemType` → `page.item_type` (읽기)
- [ ] `page.absolutePath` → `page.absolute_path` (읽기)
- [ ] `page.isActive` → `page.is_active` (읽기)
- [ ] `page.createdAt` → `page.created_at` (읽기)
- [ ] `{ pageName: x }` → `{ page_name: x }` (쓰기)
- [ ] `{ itemType: x }` → `{ item_type: x }` (쓰기)
- [ ] `{ absolutePath: x }` → `{ absolute_path: x }` (쓰기)
- [ ] `{ isActive: x }` → `{ is_active: x }` (쓰기)
- [ ] `{ createdAt: x }` → `{ created_at: x }` (쓰기)

### 주요 위치 (라인 번호)
- [ ] Line 324: `page.absolutePath`
- [ ] Line 325: `page.itemType`, `page.pageName`
- [ ] Line 326: `{ absolutePath }`
- [ ] Line 609-620: `duplicatedPageName`, `originalPage.itemType`
- [ ] Line 617: `{ absolutePath }`
- [ ] 기타 useEffect, handler 함수들

**완료 후 확인**: ItemPage 관련 오류 0개

---

## Phase 2: ItemSection 속성 수정

**목표**: ItemSection 타입의 속성명 수정 및 타입 값 변경

### 타입 정의 참조
```typescript
interface ItemSection {
  id: number;
  page_id: number;
  section_name: string;              // NOT title
  section_type: 'BASIC' | 'BOM' | 'CUSTOM';  // NOT type, NOT 'fields' | 'bom'
  order_no: number;                  // NOT order
  is_collapsible: boolean;
  is_default_open: boolean;          // NOT isCollapsed (의미 반대!)
  created_at: string;
  updated_at: string;
  fields?: ItemField[];
  bomItems?: BOMItem[];
}
```

### 수정 패턴
- [ ] `section.title` → `section.section_name`
- [ ] `section.type` → `section.section_type`
- [ ] `section.order` → `section.order_no`
- [ ] `section.isCollapsible` → `section.is_collapsible`
- [ ] `section.isCollapsed` → `!section.is_default_open` (의미 반대!)
- [ ] `{ title: x }` → `{ section_name: x }`
- [ ] `{ type: 'fields' }` → `{ section_type: 'BASIC' }`
- [ ] `{ type: 'bom' }` → `{ section_type: 'BOM' }`
- [ ] `type === 'bom'` → `section_type === 'BOM'`

### 주요 위치
- [ ] Line 631-640: `handleAddSection` - newSection 생성
- [ ] Line 657-669: 섹션 템플릿 생성
- [ ] Line 684: `handleEditSectionTitle`
- [ ] Line 1297-1318: 템플릿 기반 섹션 추가
- [ ] 기타 섹션 관련 핸들러들

**완료 후 확인**: ItemSection 관련 오류 0개

---

## Phase 3: ItemField 속성 수정

**목표**: ItemField 타입의 속성명 수정

### 타입 정의 참조
```typescript
interface ItemField {
  id: number;
  section_id: number;
  field_name: string;           // NOT name
  field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
  order_no: number;             // NOT order
  is_required: boolean;
  placeholder?: string | null;
  default_value?: string | null;
  display_condition?: Record<string, any> | null;  // NOT displayCondition
  validation_rules?: Record<string, any> | null;
  options?: Array<{ label: string; value: string }> | null;
  properties?: Record<string, any> | null;
  created_at: string;
  updated_at: string;
}
```

### 수정 패턴
- [ ] `field.name` → `field.field_name`
- [ ] `field.displayCondition` → `field.display_condition`
- [ ] `field.order` → `field.order_no`
- [ ] `{ name: x }` → `{ field_name: x }`
- [ ] `{ displayCondition: x }` → `{ display_condition: x }`

### 주요 위치
- [ ] Line 783-822: Field 수정/추가 핸들러
- [ ] Line 906-920: Field 편집 다이얼로그
- [ ] Line 1437-1447: 템플릿 필드 편집
- [ ] 기타 필드 관련 핸들러들

**완료 후 확인**: ItemField 관련 오류 0개

---

## Phase 4: 존재하지 않는 속성 제거/수정

**목표**: 타입에 정의되지 않은 속성 제거 또는 올바른 속성으로 대체

### ItemMasterField 타입 참조
```typescript
interface ItemMasterField {
  id: number;
  field_name: string;          // NOT name, NOT fieldKey
  field_type: 'TEXT' | 'NUMBER' | 'DATE' | 'SELECT' | 'TEXTAREA' | 'CHECKBOX';
  category?: string | null;
  description?: string | null;
  validation_rules?: Record<string, any> | null;  // NOT default_validation
  properties?: Record<string, any> | null;        // NOT property, NOT default_properties
  created_at: string;
  updated_at: string;
}
```

### SectionTemplate 타입 참조
```typescript
interface SectionTemplate {
  id: number;
  template_name: string;       // NOT title
  section_type: 'BASIC' | 'BOM' | 'CUSTOM';  // NOT type
  description?: string | null;
  default_fields?: Record<string, any> | null;  // NOT fields, NOT bomItems
  created_at: string;
  updated_at: string;

  // 주의: category, fields, bomItems, isCollapsible, isCollapsed 속성은 존재하지 않음!
}
```

### 제거/수정할 속성들
- [ ] `field.fieldKey` → 제거 또는 `field.field_name` 사용
- [ ] `field.property` → `field.properties` (복수형!)
- [ ] `field.default_properties` → 제거 (ItemField에 없음)
- [ ] `template.fields` → 제거 (SectionTemplate에 없음)
- [ ] `template.bomItems` → 제거 (SectionTemplate에 없음)
- [ ] `template.category` → 제거 (SectionTemplate에 없음)
- [ ] `template.isCollapsible` → 제거
- [ ] `template.isCollapsed` → 제거

### 주요 위치
- [ ] Line 226-241: ItemMasterField fieldKey 참조
- [ ] Line 437-460: property 속성 접근
- [ ] Line 793: field.property
- [ ] Line 815: field.property
- [ ] Line 831: field.property (여러 곳)
- [ ] Line 910-913: field.default_properties
- [ ] Line 1154, 1157: field.fieldKey
- [ ] Line 1247-1248: template.category, template.type
- [ ] Line 1300-1313: template.fields, template.bomItems
- [ ] Line 1440-1447: field.default_properties
- [ ] Line 2192, 2205: properties 접근

**완료 후 확인**: 존재하지 않는 속성 관련 오류 0개

---

## Phase 5: ID 타입 통일

**목표**: 모든 ID를 string에서 number로 통일

### 수정할 ID 타입들
- [ ] `selectedPageId`: `string | null` → `number | null`
- [ ] `editingPageId`: `string | null` → `number | null`
- [ ] `editingFieldId`: `string | null` → `number | null`
- [ ] `editingMasterFieldId`: `string | null` → `number | null`
- [ ] `currentTemplateId`: `string | null` → `number | null`
- [ ] `editingTemplateId`: `string | null` → `number | null`
- [ ] `editingTemplateFieldId`: `string | null` → `number | null`

### 관련 수정
- [ ] 모든 ID 비교: `=== 'string'` → `=== number`
- [ ] 함수 파라미터: `(id: string)` → `(id: number)`
- [ ] State setter 호출: 타입 변환 제거

### 주요 위치
- [ ] Line 313: selectedPageIdFromStorage 타입
- [ ] Line 314: 비교 연산
- [ ] Line 591, 701, 723, 934, 1147, 1169, 1190, 1289, 1330, 1453, 1487: ID 비교
- [ ] Line 623: setSelectedPageId
- [ ] Line 906-907: setEditingFieldId, setSelectedPageId
- [ ] Line 1069: setEditingMasterFieldId
- [ ] Line 1105, 1150: deleteItemMasterField ID
- [ ] Line 1178: deleteItemPage ID
- [ ] Line 1244: setCurrentTemplateId
- [ ] Line 1263, 1277, 1419, 1457: Template ID 함수 호출
- [ ] Line 1437: setEditingTemplateFieldId

**완료 후 확인**: ID 타입 불일치 오류 0개

---

## Phase 6: State 타입 수정

**목표**: 로컬 state 타입을 타입 정의와 일치시키기

### 수정할 State들
- [ ] `customTabs` ID: `string` → `number`
- [ ] `MasterOption`: `is_active` → `isActive` (로컬 타입은 camelCase 유지)
- [ ] 기타 타입 불일치 state들

### 주요 위치
- [ ] Line 491: MasterOption `is_active` vs `isActive`
- [ ] Line 1014-1017: customAttributeOptions 타입
- [ ] Line 1371-1374: customAttributeOptions 타입
- [ ] Line 1465, 1483: BOM ID 타입
- [ ] Line 1528: customTabs ID 타입

**완료 후 확인**: State 타입 불일치 오류 0개

---

## Phase 7: 함수 시그니처 수정 및 최종 검증

**목표**: 컴포넌트 props와 Context 함수 시그니처 일치시키기

### 수정할 함수 시그니처들
- [ ] `handleDeleteMasterField`: `(id: string)` → `(id: number)`
- [ ] `handleDeleteSectionTemplate`: `(id: string)` → `(id: number)`
- [ ] `handleAddBOMItemToTemplate`: 시그니처 확인
- [ ] `handleUpdateBOMItemInTemplate`: 시그니처 확인
- [ ] Tab props 시그니처들

### 누락된 Props 추가
- [ ] MasterFieldTab: `hasUnsavedChanges`, `pendingChanges` props
- [ ] HierarchyTab: `trackChange`, `hasUnsavedChanges`, `pendingChanges` props
- [ ] TabManagementDialogs: `setIsAddAttributeTabDialogOpen` prop

### 주요 위치
- [ ] Line 2404: MasterFieldTab props
- [ ] Line 2423-2424: BOM 함수 시그니처
- [ ] Line 2433: HierarchyTab props
- [ ] Line 2435: selectedPage null vs undefined
- [ ] Line 2451-2452: selectedSectionForField 타입
- [ ] Line 2454: newSectionType 타입
- [ ] Line 2455: updateItemPage 시그니처
- [ ] Line 2465: updateSection 시그니처
- [ ] Line 2494: TabManagementDialogs props
- [ ] Line 2584, 2594: Path 관련 함수 시그니처
- [ ] Line 2800: SectionTemplate 타입

### 기타 수정
- [ ] Line 598: `section.fields` optional 체크
- [ ] Line 817: `category` 타입 (string[] → string)
- [ ] Line 1175, 1194: `s.fields`, `sectionToDelete.fields` optional 체크
- [ ] Line 1302, 1307: Spread types 오류
- [ ] Line 1413, 1456, 1499, 1500, 1508: `never` 타입 오류
- [ ] Line 1731: fields optional 체크

**완료 후 확인**:
- [ ] 모든 함수 시그니처 일치
- [ ] 모든 props 타입 일치
- [ ] 타입 오류 0개

---

## Phase 8: Import 및 최종 정리

**목표**: 불필요한 import 제거 및 코드 정리

### 제거할 Import들
- [ ] Line 43: `Save` (사용하지 않음)

### 제거할 변수들
- [ ] Line 103: `clearCache`
- [ ] Line 110: `_itemSections`
- [ ] Line 118: `mounted`
- [ ] Line 126: `isLoading`
- [ ] Line 432: `bomItems`
- [ ] Line 697: `_handleMoveSectionUp`
- [ ] Line 719: `_handleMoveSectionDown`
- [ ] Line 1206-1207: `pageId`, `sectionId`
- [ ] Line 1462: `_handleAddBOMItem`
- [ ] Line 1471: `_handleUpdateBOMItem`
- [ ] Line 1475: `_handleDeleteBOMItem`
- [ ] Line 1512: `_toggleSection`
- [ ] Line 1534: `_handleEditTab`
- [ ] Line 1700: `_getAllFieldsInSection`
- [ ] Line 1739: `handleResetAllData`

### 기타 정리
- [ ] 불필요한 주석 제거
- [ ] 중복 코드 정리
- [ ] 사용하지 않는 any 타입 수정

**완료 후 확인**: ESLint 경고 최소화

---

## 최종 검증

- [ ] `npm run build` 성공 (타입 검증 포함)
- [ ] IDE에서 타입 오류 0개
- [ ] ESLint 경고 최소화
- [ ] 기능 테스트 통과

---

## 진행 기록

### 2025-11-21
- 체크리스트 생성
- 작업 시작 준비 완료
