# BOM 관리 시스템 개발 현황 ## 1. 개요 BOM(Bill of Materials) 관리 시스템은 제품의 구성 부품을 계층적으로 관리하는 기능입니다. V2 컴포넌트 기반으로 구현되어 있으며, 설정 패널을 통해 모든 기능을 동적으로 구성할 수 있습니다. --- ## 2. 아키텍처 ### 2.1 전체 구조 ``` [프론트엔드] [백엔드] [데이터베이스] v2-bom-tree (트리 뷰) ──── /api/bom ────── bomService.ts ────── bom, bom_detail v2-bom-item-editor ──── /api/table-management ──────────── bom_history, bom_version V2BomTreeConfigPanel (설정 패널) ``` ### 2.2 관련 파일 목록 #### 프론트엔드 | 파일 | 설명 | |------|------| | `frontend/lib/registry/components/v2-bom-tree/BomTreeComponent.tsx` | BOM 트리/레벨 뷰 메인 컴포넌트 | | `frontend/lib/registry/components/v2-bom-tree/BomVersionModal.tsx` | 버전 관리 모달 | | `frontend/lib/registry/components/v2-bom-tree/BomHistoryModal.tsx` | 이력 관리 모달 | | `frontend/lib/registry/components/v2-bom-tree/BomDetailEditModal.tsx` | BOM 항목 수정 모달 | | `frontend/lib/registry/components/v2-bom-tree/BomTreeRenderer.tsx` | 트리 렌더러 | | `frontend/lib/registry/components/v2-bom-tree/index.ts` | 컴포넌트 정의 (v2-bom-tree) | | `frontend/components/v2/config-panels/V2BomTreeConfigPanel.tsx` | BOM 트리 설정 패널 | | `frontend/lib/registry/components/v2-bom-item-editor/BomItemEditorComponent.tsx` | BOM 항목 편집기 (에디터 모드) | #### 백엔드 | 파일 | 설명 | |------|------| | `backend-node/src/routes/bomRoutes.ts` | BOM API 라우트 정의 | | `backend-node/src/controllers/bomController.ts` | BOM 컨트롤러 (이력/버전) | | `backend-node/src/services/bomService.ts` | BOM 서비스 (비즈니스 로직) | #### 데이터베이스 | 파일 | 설명 | |------|------| | `db/migrations/062_create_bom_history_version_tables.sql` | 이력/버전 테이블 DDL | --- ## 3. 데이터베이스 스키마 ### 3.1 bom (BOM 헤더) | 컬럼 | 타입 | 설명 | |------|------|------| | id | VARCHAR (UUID) | PK | | item_id | VARCHAR | 완제품 품목 ID (item_info FK) | | bom_name | VARCHAR | BOM 명칭 | | version | VARCHAR | 현재 사용중인 버전명 | | revision | VARCHAR | 차수 | | base_qty | NUMERIC | 기준수량 | | unit | VARCHAR | 단위 | | remark | TEXT | 비고 | | company_code | VARCHAR | 회사 코드 (멀티테넌시) | ### 3.2 bom_detail (BOM 상세 - 자식 품목) | 컬럼 | 타입 | 설명 | |------|------|------| | id | VARCHAR (UUID) | PK | | bom_id | VARCHAR | BOM 헤더 FK | | parent_detail_id | VARCHAR | 부모 detail FK (NULL = 1레벨) | | child_item_id | VARCHAR | 자식 품목 ID (item_info FK) | | quantity | NUMERIC | 구성수량 (소요량) | | unit | VARCHAR | 단위 | | process_type | VARCHAR | 공정구분 (제조/외주 등) | | loss_rate | NUMERIC | 손실율 | | level | INTEGER | 레벨 | | base_qty | NUMERIC | 기준수량 | | revision | VARCHAR | 차수 | | remark | TEXT | 비고 | | company_code | VARCHAR | 회사 코드 | ### 3.3 bom_history (BOM 이력) | 컬럼 | 타입 | 설명 | |------|------|------| | id | VARCHAR (UUID) | PK | | bom_id | VARCHAR | BOM 헤더 FK | | revision | VARCHAR | 차수 | | version | VARCHAR | 버전 | | change_type | VARCHAR | 변경구분 (등록/수정/추가/삭제) | | change_description | TEXT | 변경내용 | | changed_by | VARCHAR | 변경자 | | changed_date | TIMESTAMP | 변경일시 | | company_code | VARCHAR | 회사 코드 | ### 3.4 bom_version (BOM 버전) | 컬럼 | 타입 | 설명 | |------|------|------| | id | VARCHAR (UUID) | PK | | bom_id | VARCHAR | BOM 헤더 FK | | version_name | VARCHAR | 버전명 (1.0, 2.0 ...) | | revision | INTEGER | 생성 시점의 차수 | | status | VARCHAR | 상태 (developing / active / inactive) | | snapshot_data | JSONB | 스냅샷 (bom 헤더 + bom_detail 전체) | | created_by | VARCHAR | 생성자 | | created_date | TIMESTAMP | 생성일시 | | company_code | VARCHAR | 회사 코드 | --- ## 4. API 명세 ### 4.1 이력 API | Method | Path | 설명 | |--------|------|------| | GET | `/api/bom/:bomId/history` | 이력 목록 조회 | | POST | `/api/bom/:bomId/history` | 이력 등록 | **Query Params**: `tableName` (설정 패널에서 지정한 이력 테이블명, 기본값: `bom_history`) ### 4.2 버전 API | Method | Path | 설명 | |--------|------|------| | GET | `/api/bom/:bomId/versions` | 버전 목록 조회 | | POST | `/api/bom/:bomId/versions` | 신규 버전 생성 | | POST | `/api/bom/:bomId/versions/:versionId/load` | 버전 불러오기 (데이터 복원) | | POST | `/api/bom/:bomId/versions/:versionId/activate` | 버전 사용 확정 | | DELETE | `/api/bom/:bomId/versions/:versionId` | 버전 삭제 | **Body/Query**: `tableName`, `detailTable` (설정 패널에서 지정한 테이블명) --- ## 5. 버전 관리 구조 ### 5.1 핵심 원리 **각 버전은 생성 시점의 BOM 전체 구조(헤더 + 모든 디테일)를 JSONB 스냅샷으로 저장합니다.** ``` 버전 1.0 (active) └─ snapshot_data: { bom: {...}, details: [{...}, {...}, ...] } 버전 2.0 (developing) └─ snapshot_data: { bom: {...}, details: [{...}, {...}, ...] } 버전 3.0 (inactive) └─ snapshot_data: { bom: {...}, details: [{...}, {...}, ...] } ``` ### 5.2 버전 상태 (status) | 상태 | 설명 | |------|------| | `developing` | 개발중 - 신규 생성 시 기본 상태 | | `active` | 사용중 - "사용 확정" 후 운영 상태 | | `inactive` | 사용중지 - 이전에 active였다가 다른 버전이 확정된 경우 | ### 5.3 버전 워크플로우 ``` [현재 BOM 데이터] │ ▼ 신규 버전 생성 ───► 버전 N.0 (status: developing) │ ├── 불러오기: 해당 스냅샷의 데이터로 현재 BOM을 복원 │ (status 변경 없음, BOM 헤더 version 변경 없음) │ ├── 사용 확정: status → active, │ 기존 active 버전 → inactive, │ BOM 헤더의 version 필드 갱신 │ └── 삭제: active 상태가 아닌 경우만 삭제 가능 ``` ### 5.4 불러오기 vs 사용 확정 | 동작 | 불러오기 (Load) | 사용 확정 (Activate) | |------|----------------|---------------------| | BOM 데이터 복원 | O (detail 전체 교체) | X | | BOM 헤더 업데이트 | O (base_qty, unit 등) | version 필드만 | | 버전 status 변경 | X | active로 변경 | | 기존 active 비활성화 | X | O (→ inactive) | | BOM 목록 새로고침 | O (refreshTable) | O (refreshTable) | --- ## 6. 설정 패널 구성 `V2BomTreeConfigPanel.tsx`에서 아래 항목을 설정할 수 있습니다: ### 6.1 기본 탭 | 설정 항목 | 설명 | 기본값 | |-----------|------|--------| | 디테일 테이블 | BOM 상세 데이터 테이블 | `bom_detail` | | 외래키 | BOM 헤더와의 연결 키 | `bom_id` | | 부모키 | 부모-자식 관계 키 | `parent_detail_id` | | 이력 테이블 | BOM 변경 이력 테이블 | `bom_history` | | 버전 테이블 | BOM 버전 관리 테이블 | `bom_version` | | 이력 기능 표시 | 이력 버튼 노출 여부 | `true` | | 버전 기능 표시 | 버전 버튼 노출 여부 | `true` | ### 6.2 컬럼 탭 - 소스 테이블 (bom/item_info 등)에서 표시할 컬럼 선택 - 디테일 테이블에서 표시할 컬럼 선택 - 컬럼 순서 드래그앤드롭 - 컬럼별 라벨, 너비, 정렬 설정 --- ## 7. 뷰 모드 ### 7.1 트리 뷰 (기본) - 계층적 들여쓰기로 부모-자식 관계 표현 - 레벨별 시각 구분: - **0레벨 (가상 루트)**: 파란색 배경 + 파란 좌측 바 - **1레벨**: 흰색 배경 + 초록 좌측 바 - **2레벨**: 연회색 배경 + 주황 좌측 바 - **3레벨 이상**: 진회색 배경 + 보라 좌측 바 - 펼침/접힘 (정전개/역전개) ### 7.2 레벨 뷰 - 평면 테이블 형태로 표시 - "레벨0", "레벨1", "레벨2" ... 컬럼에 체크마크로 계층 표시 - 같은 레벨별 배경색 구분 적용 --- ## 8. 주요 기능 목록 | 기능 | 상태 | 설명 | |------|------|------| | BOM 트리 표시 | 완료 | 계층적 트리 뷰 + 레벨 뷰 | | BOM 항목 편집 | 완료 | 더블클릭으로 수정 모달 (0레벨: bom, 하위: bom_detail) | | 이력 관리 | 완료 | 변경 이력 조회/등록 모달 | | 버전 관리 | 완료 | 버전 생성/불러오기/사용 확정/삭제 | | 설정 패널 | 완료 | 테이블/컬럼/기능 동적 설정 | | 디자인 모드 프리뷰 | 완료 | 실제 화면과 일치하는 디자인 모드 표시 | | 컬럼 크기 조절 | 완료 | 헤더 드래그로 컬럼 너비 변경 | | 텍스트 말줄임 | 완료 | 긴 텍스트 `...` 처리 | | 레벨별 시각 구분 | 완료 | 배경색 + 좌측 컬러 바 | | 정전개/역전개 | 완료 | 전체 펼침/접기 토글 | | 좌우 스크롤 | 완료 | 컬럼 크기가 커질 때 수평 스크롤 | | BOM 목록 자동 새로고침 | 완료 | 버전 불러오기/확정 후 좌측 패널 자동 리프레시 | | BOM 하위 품목 저장 | 완료 | BomItemEditorComponent에서 직접 INSERT/UPDATE/DELETE | | 차수 (Revision) 자동 증가 | 미구현 | BOM 변경 시 헤더 revision 자동 +1 | --- ## 9. 보안 고려사항 - **SQL 인젝션 방지**: `safeTableName()` 함수로 테이블명 검증 (`^[a-zA-Z_][a-zA-Z0-9_]*$`) - **멀티테넌시**: 모든 API에서 `company_code` 필터링 적용 - **최고 관리자**: `company_code = "*"` 시 전체 데이터 조회 가능 - **인증**: `authenticateToken` 미들웨어로 모든 라우트 보호 --- ## 10. 향후 개선 사항 - [ ] 차수(Revision) 자동 증가 구현 (BOM 헤더 레벨) - [ ] 버전 비교 기능 (두 버전 간 diff) - [ ] BOM 복사 기능 - [ ] 이력 자동 등록 (수정/저장 시 자동으로 이력 생성) - [ ] Excel 내보내기/가져오기 - [ ] BOM 유효성 검증 (순환참조 방지 등)