- useInitialDataLoading에서 Zustand initFromApi() 호출 추가 - Context와 Zustand 병행 운영 구조 구축 - Zustand 초기화 실패 시 Context fallback 처리 - 점진적 마이그레이션 기반 마련 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
품목기준관리 테스트 및 Zustand 도입 체크리스트
브랜치:
feature/item-master-zustand작성일: 2025-12-24 목표: 훅 분리 완료 후 수동 테스트 → Zustand 도입
현재 상태
| 항목 | 상태 |
|---|---|
| 훅 분리 작업 | ✅ 완료 (2025-12-24) |
| 메인 컴포넌트 줄 수 | 1,799줄 → 971줄 (46% 감소) |
| 타입 에러 수정 | ✅ 완료 (55개 → 0개) |
| 무한 로딩 버그 수정 | ✅ 완료 |
| Zustand 연동 | ✅ 완료 (2025-12-24) |
| 빌드 | ✅ 성공 |
Phase 1: 훅 분리 작업 ✅
완료된 훅 (11개)
| # | 훅 이름 | 용도 | 상태 |
|---|---|---|---|
| 1 | usePageManagement | 페이지 CRUD | ✅ 기존 |
| 2 | useSectionManagement | 섹션 CRUD | ✅ 기존 |
| 3 | useFieldManagement | 필드 CRUD | ✅ 기존 |
| 4 | useMasterFieldManagement | 마스터 필드 | ✅ 기존 |
| 5 | useTemplateManagement | 템플릿 관리 | ✅ 기존 |
| 6 | useAttributeManagement | 속성/옵션 관리 | ✅ 기존 |
| 7 | useTabManagement | 탭 관리 | ✅ 기존 |
| 8 | useInitialDataLoading | 초기 데이터 로딩 | ✅ 신규 |
| 9 | useImportManagement | 섹션/필드 불러오기 | ✅ 신규 |
| 10 | useReorderManagement | 순서 변경 | ✅ 신규 |
| 11 | useDeleteManagement | 삭제 관리 | ✅ 신규 |
UI 컴포넌트 분리 (1개)
| # | 컴포넌트 | 용도 | 상태 |
|---|---|---|---|
| 1 | AttributeTabContent | 속성 탭 (~500줄) | ✅ 완료 |
Phase 2: Zustand 연동 ✅
2.1 구조
┌─────────────────────────────────────────────────────────────┐
│ useInitialDataLoading │
│ ┌─────────────────────┐ ┌─────────────────────────────┐│
│ │ Context 로드 │ AND │ Zustand Store 로드 ││
│ │ (기존 호환성 유지) │ │ (정규화된 상태) ││
│ └─────────────────────┘ └─────────────────────────────┘│
│ ↓ ↓ │
│ 기존 컴포넌트 → Context 새 컴포넌트 → useItemMasterStore│
└─────────────────────────────────────────────────────────────┘
2.2 연동 방식: 병행 운영
- Context: 기존 컴포넌트 호환성 유지
- Zustand: 새 컴포넌트에서 직접 사용 가능
- 점진적 마이그레이션: Context → Zustand로 단계적 전환
2.3 수정된 파일
| 파일 | 변경 내용 |
|---|---|
useInitialDataLoading.ts |
useItemMasterStore import, initFromApi() 호출 |
2.4 Zustand Store 기능
src/stores/item-master/useItemMasterStore.ts (1,139줄)
| 영역 | 기능 |
|---|---|
| 페이지 | loadPages, createPage, updatePage, deletePage |
| 섹션 | loadSections, createSection, updateSection, deleteSection, reorderSections |
| 필드 | loadFields, createField, updateField, deleteField, reorderFields |
| BOM | loadBomItems, createBomItem, updateBomItem, deleteBomItem |
| 속성 | addUnit, updateUnit, deleteUnit, addMaterial, updateMaterial, deleteMaterial |
| API | initFromApi() - API 호출 후 정규화된 상태 저장 |
Phase 3: 테스트 (다음 단계)
3.1 품목 유형별 등록 테스트
| # | 품목 유형 | 테스트 URL | 상태 |
|---|---|---|---|
| 1 | FG (제품) | /ko/items/create → 제품 선택 |
⬜ |
| 2 | PT (부품) - 절곡 | /ko/items/create → 부품 → 절곡부품 |
⬜ |
| 3 | PT (부품) - 조립 | /ko/items/create → 부품 → 조립부품 |
⬜ |
| 4 | PT (부품) - 구매 | /ko/items/create → 부품 → 구매부품 |
⬜ |
| 5 | SM (부자재) | /ko/items/create → 부자재 선택 |
⬜ |
| 6 | RM (원자재) | /ko/items/create → 원자재 선택 |
⬜ |
| 7 | CS (소모품) | /ko/items/create → 소모품 선택 |
⬜ |
작업 로그
| 날짜 | 작업 내용 | 커밋 |
|---|---|---|
| 2025-12-24 | Phase 1+2 훅/컴포넌트 분리 | a823ae0 |
| 2025-12-24 | unused 코드 정리 및 import 최적화 | 1664599 |
| 2025-12-24 | 타입 에러 및 무한 로딩 버그 수정 | 028932d |
| 2025-12-24 | Zustand 연동 완료 | (현재) |
다음 단계
- 수동 테스트 진행
- 새 컴포넌트에서
useItemMasterStore직접 사용 - Context 의존성 점진적 제거
- 동적 페이지 생성 구현
참고 문서
[PLAN-2025-12-24] hook-extraction-plan.md- 훅 분리 계획서src/stores/item-master/useItemMasterStore.ts- Zustand Storesrc/stores/item-master/types.ts- Store 타입 정의src/stores/item-master/normalizers.ts- API 응답 정규화