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. 향후 개선 사항