ERP-node/docs/DB_WORKFLOW_ANALYSIS.md

1729 lines
56 KiB
Markdown

# WACE ERP 데이터베이스 워크플로우 분석
> 📅 작성일: 2026-02-06
> 🎯 목적: 비즈니스 워크플로우 중심의 DB 구조 분석
> 📊 DB 엔진: PostgreSQL 16.8
> 📝 기반 스키마: plm_schema_20260120.sql
---
## 📋 Executive Summary
WACE ERP 시스템은 **멀티테넌트 SaaS 아키텍처**를 기반으로 한 제조업 특화 ERP입니다.
- **총 테이블 수**: 337개
- **핵심 아키텍처**: Multi-tenancy (company_code 기반 데이터 격리)
- **특징**: 메타데이터 드리븐, 동적 스키마, 플로우 기반 통합
---
## 🏗️ 1. 데이터베이스 아키텍처 개요
### 1.1 계층 구조
```
┌─────────────────────────────────────────────────────────┐
│ Application Layer (React) │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Backend Layer (Node.js + TypeScript) │
│ - API Routes │
│ - Business Logic Services │
│ - Raw SQL Query Execution │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Database Layer (PostgreSQL) │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ System Core │ │ Metadata │ │
│ │ - user_info │ │ - table_labels │ │
│ │ - company_mng │ │ - screen_def │ │
│ │ - menu_info │ │ - flow_def │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ Business Domain Tables │ │
│ │ - Sales (30+) - Purchase (25+) │ │
│ │ - Stock (20+) - Production (25+) │ │
│ │ - Quality (15+) - Logistics (20+) │ │
│ │ - PLM (30+) - Accounting (20+) │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 1.2 멀티테넌시 핵심 원칙
**ABSOLUTE MUST: 모든 테이블에 company_code**
```sql
-- ✅ 표준 테이블 구조
CREATE TABLE {table_name} (
id VARCHAR(500) PRIMARY KEY DEFAULT gen_random_uuid()::text,
company_code VARCHAR(20) NOT NULL, -- 필수!
created_date TIMESTAMP DEFAULT NOW(),
updated_date TIMESTAMP DEFAULT NOW(),
writer VARCHAR(500),
-- ... 비즈니스 컬럼들
);
-- 필수 인덱스
CREATE INDEX idx_{table_name}_company_code
ON {table_name}(company_code);
```
**company_code = "*" 의미**
- ❌ 잘못된 이해: 모든 회사 공통 데이터
- ✅ 올바른 이해: 슈퍼 관리자 전용 데이터
- 일반 회사 쿼리: `WHERE company_code = $1 AND company_code != '*'`
---
## 🎯 2. 핵심 시스템 테이블 (System Core)
### 2.1 사용자 및 인증
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `user_info` | 사용자 정보 | user_id, user_name, email, password_hash, company_code |
| `user_info_history` | 사용자 변경 이력 | history_id, user_id, change_type, changed_at |
| `auth_tokens` | 인증 토큰 | token_id, user_id, token, expires_at |
| `login_access_log` | 로그인 이력 | log_id, user_id, ip_address, login_at |
| `user_dept` | 사용자-부서 매핑 (겸직 지원) | user_id, dept_code, is_primary |
| `user_dept_sub` | 겸직 부서 정보 | user_id, sub_dept_code |
**워크플로우:**
```
로그인 → auth_tokens 생성 → login_access_log 기록
회사별 데이터 격리 → company_code 필터링
```
### 2.2 권한 관리
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `authority_master` | 권한 그룹 마스터 | objid, auth_name, auth_code, company_code |
| `authority_master_history` | 권한 그룹 이력 | objid, parent_objid, history_type |
| `authority_sub_user` | 권한 그룹 멤버 | objid, master_objid, user_id |
| `rel_menu_auth` | 메뉴별 권한 CRUD | objid, menu_objid, auth_objid, create_auth, read_auth, update_auth, delete_auth |
**권한 체계:**
```
사용자 → authority_sub_user → authority_master → rel_menu_auth → 메뉴별 CRUD 권한
```
### 2.3 회사 및 부서
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `company_mng` | 회사 정보 | company_code (PK), company_name, business_registration_number |
| `company_code_sequence` | 회사 코드 시퀀스 | company_code, next_sequence |
| `dept_info` | 부서 정보 | dept_code, dept_name, parent_dept_code, company_code |
| `dept_info_history` | 부서 변경 이력 | dept_code, change_type, changed_at |
**계층 구조:**
```
company_mng (회사)
└─ dept_info (부서 - 계층 구조)
└─ user_dept (사용자 배정)
```
### 2.4 메뉴 시스템
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `menu_info` | 메뉴 정보 | objid, menu_type, parent_obj_id, menu_name_kor, menu_url, screen_code, company_code, source_menu_objid |
| `menu_screen_groups` | 통합 메뉴/화면 그룹 | group_id, group_name, parent_group_id, company_code |
| `menu_screen_group_items` | 그룹-화면 연결 | group_id, screen_code |
| `screen_menu_assignments` | 화면-메뉴 할당 | screen_code, menu_id |
**메뉴 타입:**
- `menu_type = 0`: 일반 메뉴
- `menu_type = 1`: 시스템 관리 메뉴
- `menu_type = 2`: 동적 생성 메뉴 (screen_definitions에서 자동 생성)
**메뉴 복사 메커니즘:**
```
원본 메뉴 (회사A) → 복사 → 새 메뉴 (회사B)
source_menu_objid: 원본 메뉴의 objid 추적
재복사 시: source_menu_objid로 기존 복사본 찾아서 덮어쓰기
```
---
## 🗂️ 3. 메타데이터 시스템 (Metadata Layer)
### 3.1 테이블 메타데이터
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `table_labels` | 테이블 논리명 | table_name (PK), table_label, description |
| `table_type_columns` | 컬럼 타입 정의 (회사별) | table_name, column_name, company_code, input_type, detail_settings, display_order |
| `column_labels` | 컬럼 논리명 (레거시) | table_name, column_name, column_label, input_type |
| `table_relationships` | 테이블 관계 정의 | parent_table, child_table, join_condition |
| `table_log_config` | 테이블 로그 설정 | table_name, log_enabled, log_table_name |
**메타데이터 구조:**
```
table_labels (테이블 논리명)
└─ table_type_columns (컬럼 타입 정의 - 회사별)
└─ category_column_mapping (카테고리 컬럼 매핑)
└─ table_column_category_values (카테고리 값)
```
**동적 테이블 생성 프로세스:**
1. `CREATE TABLE` 실행
2. `table_labels` 등록
3. `table_type_columns` 등록 (회사별)
4. `column_labels` 등록 (레거시 호환)
5. `ddl_execution_log`에 DDL 실행 이력 기록
### 3.2 화면 메타데이터
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `screen_definitions` | 화면 정의 | screen_code (PK), screen_name, table_name, screen_type, company_code |
| `screen_layouts` | 화면 레이아웃 | screen_code, layout_config (JSONB) |
| `screen_templates` | 화면 템플릿 | template_id, template_name, template_config |
| `screen_widgets` | 화면 위젯 | widget_id, screen_code, widget_type, widget_config |
| `screen_groups` | 화면 그룹 | group_id, group_name, parent_group_id |
| `screen_group_screens` | 화면-그룹 연결 | group_id, screen_code |
**화면 생성 워크플로우:**
```
screen_definitions 생성
→ 트리거 발동 → menu_info 자동 생성 (menu_type=2)
→ screen_layouts 레이아웃 정의
→ screen_widgets 위젯 배치
→ screen_table_relations 테이블 관계 설정
```
### 3.3 화면 고급 기능
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `screen_embedding` | 화면 임베딩 | parent_screen, child_screen, embed_config |
| `screen_split_panel` | 분할 패널 | screen_code, left_screen, right_screen, split_ratio |
| `screen_data_transfer` | 화면 간 데이터 전달 | source_screen, target_screen, mapping_config |
| `screen_data_flows` | 화면 간 데이터 흐름 | flow_id, source_screen, target_screen, flow_type |
| `screen_field_joins` | 화면 필드 조인 | source_table, target_table, join_condition |
| `screen_table_relations` | 화면-테이블 관계 | screen_code, table_name, relation_type |
**화면 임베딩 패턴:**
```
마스터 화면 (sales_order)
├─ 좌측 패널: 수주 목록
└─ 우측 패널: 상세 정보 (임베딩)
├─ 수주 기본 정보
├─ 수주 품목 (임베딩)
└─ 배송 정보 (임베딩)
```
### 3.4 UI 컴포넌트 표준
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `component_standards` | UI 컴포넌트 표준 | component_type, standard_props (JSONB) |
| `button_action_standards` | 버튼 액션 기준 | action_type, action_config (JSONB) |
| `web_type_standards` | 웹 타입 기준 | web_type, type_config (JSONB) |
| `grid_standards` | 격자 시스템 기준 | grid_type, grid_config (JSONB) |
| `layout_standards` | 레이아웃 표준 | layout_type, layout_config (JSONB) |
| `layout_instances` | 레이아웃 인스턴스 | instance_id, layout_type, instance_config |
| `style_templates` | 스타일 템플릿 | template_id, template_name, style_config (JSONB) |
---
## 🔄 4. 플로우 및 데이터 통합 시스템
### 4.1 플로우 정의
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `flow_definition` | 플로우 정의 | id, name, table_name, db_source_type, company_code |
| `flow_step` | 플로우 단계 | step_id, flow_id, step_name, step_type, step_order, action_config (JSONB) |
| `flow_step_connection` | 플로우 단계 연결 | connection_id, source_step_id, target_step_id, condition |
| `flow_data_mapping` | 플로우 데이터 매핑 | mapping_id, flow_id, source_table, target_table, mapping_config |
**플로우 타입:**
- 승인 플로우: 결재 라인 정의
- 상태 플로우: 데이터 상태 전환
- 데이터 플로우: 테이블 간 데이터 이동
- 통합 플로우: 외부 시스템 연동
### 4.2 플로우 실행 및 모니터링
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `flow_data_status` | 데이터 현재 상태 | data_id, flow_id, current_step_id, status |
| `flow_audit_log` | 플로우 상태 변경 이력 | log_id, flow_id, data_id, from_step, to_step, changed_at, changed_by |
| `flow_integration_log` | 플로우 외부 연동 로그 | log_id, flow_id, integration_type, request_data, response_data |
**플로우 실행 예시: 수주 승인**
```
수주 등록 (sales_order_mng)
→ flow_data_status 생성 (status: 'PENDING')
→ flow_step 1: 영업팀장 승인
→ flow_step 2: 재고 확인
→ flow_step 3: 생산계획 생성
→ flow_step 4: 최종 승인
→ flow_audit_log 각 단계 기록
```
### 4.3 노드 기반 플로우
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `node_flows` | 노드 기반 플로우 | flow_id, flow_name, nodes (JSONB), edges (JSONB) |
| `dataflow_diagrams` | 데이터플로우 다이어그램 | diagram_id, diagram_name, diagram_data (JSONB) |
| `dataflow_external_calls` | 데이터플로우 외부 호출 | call_id, diagram_id, external_connection_id |
**노드 타입:**
- Start/End Node
- Data Node (테이블 조회/저장)
- Logic Node (조건 분기, 계산)
- External Node (외부 API 호출)
- Transform Node (데이터 변환)
---
## 🌐 5. 외부 연동 시스템
### 5.1 외부 데이터베이스 연결
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `external_db_connections` | 외부 DB 연결 정보 | connection_id, connection_name, db_type, host, port, database, username, password_encrypted |
| `external_db_connection` | 외부 DB 연결 (레거시) | connection_id, connection_config (JSONB) |
| `external_connection_permission` | 외부 연결 권한 | permission_id, connection_id, user_id, allowed_operations |
| `flow_external_db_connection` | 플로우 전용 외부 DB 연결 | connection_id, flow_id, db_config (JSONB) |
| `flow_external_connection_permission` | 플로우 외부 연결 권한 | permission_id, flow_id, connection_id |
**지원 DB 타입:**
- PostgreSQL
- MySQL
- MS SQL Server
- Oracle
- MongoDB (NoSQL)
### 5.2 외부 REST API 연결
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `external_rest_api_connections` | 외부 REST API 연결 | connection_id, api_name, base_url, auth_type, auth_config (JSONB) |
| `external_call_configs` | 외부 호출 설정 | config_id, connection_id, endpoint, method, headers (JSONB) |
| `external_call_logs` | 외부 호출 로그 | log_id, config_id, request_data, response_data, status_code, executed_at |
**인증 방식:**
- API Key
- Bearer Token
- OAuth 2.0
- Basic Auth
### 5.3 데이터 수집 배치
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `data_collection_configs` | 데이터 수집 설정 | config_id, source_type, source_config (JSONB), schedule |
| `data_collection_jobs` | 데이터 수집 작업 | job_id, config_id, job_status, started_at, completed_at |
| `data_collection_history` | 데이터 수집 이력 | history_id, job_id, collected_count, error_count |
| `collection_batch_management` | 수집 배치 관리 | batch_id, batch_name, batch_config (JSONB) |
| `collection_batch_executions` | 배치 실행 이력 | execution_id, batch_id, execution_status, executed_at |
---
## 📊 6. 비즈니스 도메인 테이블 (Business Domain)
### 6.1 영업/수주 (Sales & Orders) - 30+ 테이블
#### 핵심 테이블
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `sales_order_mng` | 수주 관리 | customer_mng, product_mng |
| `sales_order_detail` | 수주 상세 | sales_order_mng |
| `sales_order_detail_log` | 수주 상세 이력 | sales_order_detail |
| `sales_request_master` | 구매요청서 마스터 | customer_mng |
| `sales_request_part` | 구매요청서 품목 | sales_request_master, part_mng |
| `estimate_mgmt` | 견적 관리 | customer_mng, product_mng |
| `contract_mgmt` | 계약 관리 | customer_mng |
| `contract_mgmt_option` | 계약 옵션 | contract_mgmt |
#### 영업 지원 테이블
| 테이블 | 역할 |
|--------|------|
| `sales_bom_report` | 영업 BOM 보고서 |
| `sales_bom_part_qty` | 영업 BOM 수량 |
| `sales_bom_report_part` | 영업 BOM 품목 |
| `sales_long_delivery` | 장납기 부품 리스트 |
| `sales_long_delivery_input` | 장납기 자재 투입 이력 |
| `sales_long_delivery_predict` | 장납기 예측 |
| `sales_part_chg` | 설계 변경 리스트 |
| `sample_supply` | 샘플 공급 |
#### 고객 관리
| 테이블 | 역할 |
|--------|------|
| `customer_mng` | 거래처 마스터 |
| `customer_item` | 거래처별 품번 관리 |
| `customer_item_alias` | 거래처별 품목 품번/품명 |
| `customer_item_mapping` | 거래처별 품목 매핑 |
| `customer_item_price` | 거래처별 품목 단가 이력 |
| `customer_service_mgmt` | 조치내역서 마스터 |
| `customer_service_part` | 조치내역서 사용 부품 |
| `customer_service_workingtime` | 조치내역서 작업 시간 |
| `counselingmgmt` | 상담 관리 |
**워크플로우: 수주 프로세스**
```
1. 견적 요청 (estimate_mgmt)
2. 견적 작성 및 발송
3. 수주 등록 (sales_order_mng)
4. 수주 상세 입력 (sales_order_detail)
5. 계약 체결 (contract_mgmt)
6. 생산 계획 생성 (order_plan_mgmt)
7. 구매 요청 (sales_request_master)
```
### 6.2 구매/발주 (Purchase & Procurement) - 25+ 테이블
#### 핵심 테이블
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `purchase_order_master` | 발주 관리 마스터 | supplier_mng |
| `purchase_order_part` | 발주서 상세 목록 | purchase_order_master, part_mng |
| `purchase_order_multi` | 동시적용 프로젝트 발주 | purchase_order_master |
| `purchase_order_mng` | 발주 관리 | supplier_mng |
| `purchase_detail` | 구매 상세 | purchase_order |
| `purchase_order` | 구매 주문 | supplier_mng |
#### 공급처 관리
| 테이블 | 역할 |
|--------|------|
| `supplier_mng` | 공급처 마스터 |
| `supplier_mng_log` | 공급처 변경 이력 |
| `supplier_item` | 공급처별 품목 정보 |
| `supplier_item_alias` | 공급처별 품목 품번/품명 |
| `supplier_item_mapping` | 공급처별 품목 매핑 |
| `supplier_item_price` | 공급처별 품목 단가 |
| `procurement_standard` | 구매 기준 정보 |
#### 입고 관리
| 테이블 | 역할 |
|--------|------|
| `delivery_history` | 입고 관리 |
| `delivery_history_defect` | 입고 불량 품목 |
| `delivery_part_price` | 입고 품목 단가 |
| `receiving` | 입고 처리 |
| `receive_history` | 입고 이력 |
| `inbound_mng` | 입고 관리 |
| `check_report_mng` | 검수 관리 보고서 |
**워크플로우: 구매 프로세스**
```
1. 구매 요청 (sales_request_master)
2. 공급처 선정 (supplier_mng)
3. 발주서 작성 (purchase_order_master)
4. 발주서 상세 (purchase_order_part)
5. 입고 예정 (delivery_history)
6. 검수 (check_report_mng)
7. 입고 확정 (receiving)
8. 재고 반영 (inventory_stock)
```
### 6.3 재고/창고 (Inventory & Warehouse) - 20+ 테이블
#### 핵심 테이블
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `inventory_stock` | 재고 현황 | item_info, warehouse_location |
| `inventory_history` | 재고 이력 | inventory_stock |
| `warehouse_info` | 창고 정보 | - |
| `warehouse_location` | 창고 위치 | warehouse_info |
| `inbound_mng` | 입고 관리 | warehouse_location |
| `outbound_mng` | 출고 관리 | warehouse_location |
| `material_release` | 자재 출고 | - |
#### 물류 관리
| 테이블 | 역할 |
|--------|------|
| `shipment_header` | 출하 헤더 |
| `shipment_detail` | 출하 상세 |
| `shipment_plan` | 출하 계획 |
| `shipment_instruction` | 출하 지시 |
| `shipment_instruction_item` | 출하 지시 품목 |
| `shipment_pallet` | 출하 파레트 |
| `delivery_destination` | 납품처 정보 |
| `delivery_route_mng` | 배송 경로 관리 |
| `delivery_route_mng_log` | 배송 경로 이력 |
| `delivery_status` | 배송 상태 |
#### 디지털 트윈 (창고 레이아웃)
| 테이블 | 역할 |
|--------|------|
| `digital_twin_layout` | 디지털 트윈 레이아웃 |
| `digital_twin_layout_template` | 레이아웃 템플릿 |
| `digital_twin_location_layout` | Location 배치 정보 |
| `digital_twin_zone_layout` | Zone 배치 정보 |
| `digital_twin_objects` | 디지털 트윈 객체 |
| `yard_layout` | 야드 레이아웃 |
| `yard_material_placement` | 야드 자재 배치 |
**워크플로우: 재고 관리**
```
1. 입고 (inbound_mng)
→ inventory_stock 증가
→ inventory_history 기록
2. 출고 (outbound_mng)
→ inventory_stock 감소
→ inventory_history 기록
3. 창고 위치 관리
→ warehouse_location
→ digital_twin_location_layout (시각화)
4. 재고 조사
→ inventory_stock 조회
→ 실사 vs 전산 비교
→ 차이 조정
```
### 6.4 생산/작업 (Production & Work) - 25+ 테이블
#### 핵심 테이블
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `work_orders` | 작업지시 관리 | product_mng, sales_order_mng |
| `work_orders_detail` | 작업지시 상세 | work_orders |
| `work_instruction` | 작업지시 | - |
| `work_instruction_detail` | 작업지시 상세 | work_instruction |
| `work_instruction_log` | 작업지시 이력 | work_instruction |
| `work_instruction_detail_log` | 작업지시 상세 이력 | work_instruction_detail |
| `work_order` | 작업지시 (레거시) | - |
| `work_request` | 작업 요청 (워크플로우) | - |
#### 생산 계획
| 테이블 | 역할 |
|--------|------|
| `order_plan_mgmt` | 생산 계획 관리 |
| `order_plan_result_error` | 생산 계획 오류 결과 |
| `production_task` | 생산 작업 |
| `production_record` | 생산 실적 |
| `production_issue` | 생산 이슈 |
| `facility_assembly_plan` | 설비 조립 계획 |
#### 공정 관리
| 테이블 | 역할 |
|--------|------|
| `process_mng` | 공정 관리 |
| `process_equipment` | 공정 설비 |
| `item_routing_version` | 품목 라우팅 버전 |
| `item_routing_detail` | 품목 라우팅 상세 |
| `input_resource` | 투입 자원 |
#### 설비 관리
| 테이블 | 역할 |
|--------|------|
| `equipment_mng` | 설비 관리 |
| `equipment_mng_log` | 설비 변경 이력 |
| `equipment_consumable` | 설비 소모품 |
| `equipment_consumable_log` | 소모품 이력 |
| `equipment_inspection_item` | 설비 점검 항목 |
| `equipment_inspection_item_log` | 점검 항목 이력 |
| `inspection_equipment_mng` | 검사 설비 관리 |
| `inspection_equipment_mng_log` | 검사 설비 이력 |
**워크플로우: 생산 프로세스**
```
1. 수주 확정 (sales_order_mng)
2. 생산 계획 생성 (order_plan_mgmt)
3. 자재 소요 계획 (MRP)
4. 작업지시 발행 (work_orders)
5. 자재 출고 (material_release)
6. 생산 실행 (production_record)
7. 품질 검사 (inspection_standard)
8. 완제품 입고 (inventory_stock)
```
### 6.5 품질/검사 (Quality & Inspection) - 15+ 테이블
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `inspection_standard` | 검사 기준 | - |
| `item_inspection_info` | 품목 검사 정보 | item_info |
| `defect_standard_mng` | 불량 기준 관리 | - |
| `defect_standard_mng_log` | 불량 기준 이력 | defect_standard_mng |
| `check_report_mng` | 검수 관리 보고서 | - |
**품질 관리 워크플로우:**
```
1. 입고 검사 (check_report_mng)
2. 공정 검사 (inspection_standard)
3. 최종 검사 (item_inspection_info)
4. 불량 처리 (defect_standard_mng)
5. 품질 데이터 분석
```
### 6.6 물류/운송 (Logistics & Transport) - 20+ 테이블
#### 차량 관리
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `vehicles` | 차량 정보 | - |
| `drivers` | 운전자 정보 | - |
| `vehicle_locations` | 차량 현재 위치 | vehicles |
| `vehicle_location_history` | 차량 위치 이력 | vehicles |
| `transport_vehicle_locations` | 운행 관리 실시간 위치 | vehicles |
#### 운송 관리
| 테이블 | 역할 |
|--------|------|
| `transport_logs` | 운행 이력 |
| `transport_statistics` | 일별 운행 통계 |
| `vehicle_trip_summary` | 차량 운행 요약 |
| `maintenance_schedules` | 차량 정비 일정 |
#### 운송사 관리
| 테이블 | 역할 |
|--------|------|
| `carrier_mng` | 운송사 관리 |
| `carrier_mng_log` | 운송사 이력 |
| `carrier_contract_mng` | 운송사 계약 관리 |
| `carrier_contract_mng_log` | 계약 이력 |
| `carrier_vehicle_mng` | 운송사 차량 관리 |
| `carrier_vehicle_mng_log` | 차량 이력 |
#### DTG (디지털운행기록계)
| 테이블 | 역할 |
|--------|------|
| `dtg_management` | DTG 통합 관리 (구매/설치/점검/폐기/정산) |
| `dtg_management_log` | DTG 관리 이력 |
| `dtg_contracts` | DTG 차종별/운송사별 계약 |
| `dtg_monthly_settlements` | DTG 월별 정산 |
| `dtg_maintenance_history` | DTG 점검 이력 |
#### 물류 비용
| 테이블 | 역할 |
|--------|------|
| `logistics_cost_mng` | 물류 비용 관리 |
| `logistics_cost_mng_log` | 물류 비용 이력 |
**워크플로우: 운송 관리**
```
1. 출하 계획 (shipment_plan)
2. 차량 배차 (vehicles)
3. 운행 시작
→ vehicle_location_history (GPS 추적)
→ transport_logs 기록
4. 배송 완료
5. 운행 통계 집계 (transport_statistics)
6. 정산 (dtg_monthly_settlements)
```
### 6.7 PLM/설계 (Product Lifecycle Management) - 30+ 테이블
#### 제품 관리
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `product_mng` | 제품 마스터 | - |
| `product_mgmt` | 제품 관리 | - |
| `product_mgmt_model` | 제품 모델 | product_mgmt |
| `product_mgmt_price_history` | 제품 가격 이력 | product_mgmt |
| `product_mgmt_upg_master` | 제품 업그레이드 마스터 | product_mgmt |
| `product_mgmt_upg_detail` | 제품 업그레이드 상세 | product_mgmt_upg_master |
| `product_kind_spec` | 제품별 사양 관리 | - |
| `product_kind_spec_main` | 제품별 사양 메인 | - |
| `product_spec` | 제품 사양 | - |
| `product_group_mng` | 제품 그룹 관리 | - |
#### 품목 관리
| 테이블 | 역할 |
|--------|------|
| `item_info` | 품목 정보 |
| `part_mng` | 부품 관리 (설계 정보 포함) |
| `part_mng_history` | 부품 변경 이력 |
| `part_mgmt` | 부품 관리 |
| `part_distribution_list` | 부품 배포 리스트 |
#### BOM 관리
| 테이블 | 역할 |
|--------|------|
| `klbom_tbl` | KL BOM 테이블 |
| `part_bom_qty` | BOM 수량 관리 |
| `part_bom_report` | BOM 보고서 |
| `sales_bom_report` | 영업 BOM 보고서 |
| `sales_bom_report_part` | 영업 BOM 품목 |
| `sales_bom_part_qty` | 영업 BOM 수량 |
#### 프로젝트 관리
| 테이블 | 역할 |
|--------|------|
| `pms_pjt_info` | 프로젝트 정보 |
| `pms_pjt_concept_info` | 프로젝트 개념 정보 |
| `pms_pjt_year_goal` | 프로젝트 연간 목표 |
| `pms_rel_pjt_prod` | 프로젝트-제품 관계 |
| `pms_rel_pjt_concept_prod` | 프로젝트 개념-제품 관계 |
| `pms_rel_pjt_concept_milestone` | 프로젝트 개념-마일스톤 |
| `pms_rel_prod_ref_dept` | 제품-참조부서 관계 |
| `project` | 프로젝트 (레거시) |
| `project_mgmt` | 프로젝트 관리 |
| `project_concept` | 프로젝트 개념 (레거시?) |
#### WBS (Work Breakdown Structure)
| 테이블 | 역할 |
|--------|------|
| `pms_wbs_task` | WBS 작업 |
| `pms_wbs_task_info` | WBS 작업 정보 |
| `pms_wbs_task_confirm` | WBS 작업 확인 |
| `pms_wbs_task_standard` | WBS 작업 표준 |
| `pms_wbs_task_standard2` | WBS 작업 표준2 |
| `pms_wbs_template` | WBS 템플릿 |
#### 설계 관리
| 테이블 | 역할 |
|--------|------|
| `mold_dev_request_info` | 금형 개발 요청 |
| `structural_review_proposal` | 구조 검토 제안서 |
| `external_work_review_info` | 외주 작업 검토 정보 |
| `standard_doc_info` | 표준 문서 정보 |
#### OEM 관리
| 테이블 | 역할 |
|--------|------|
| `oem_mng` | OEM 관리 |
| `oem_factory_mng` | OEM 공장 관리 |
| `oem_milestone_mng` | OEM 마일스톤 관리 |
**워크플로우: PLM 프로세스**
```
1. 제품 기획 (pms_pjt_concept_info)
2. 프로젝트 생성 (pms_pjt_info)
3. WBS 작업 분해 (pms_wbs_task)
4. 제품 설계 (product_mng)
5. BOM 작성 (part_bom_report)
6. 부품 관리 (part_mng)
7. 설계 검토 (structural_review_proposal)
8. 양산 전환 (production_task)
```
### 6.8 회계/원가 (Accounting & Costing) - 20+ 테이블
#### 원가 관리
| 테이블 | 역할 | 주요 참조 |
|--------|------|-----------|
| `material_cost` | 재료비 | - |
| `injection_cost` | 사출 원가 | - |
| `profit_loss` | 손익 관리 | - |
| `profit_loss_total` | 손익 합계 | - |
| `profit_loss_coefficient` | 손익 계수 | - |
| `profit_loss_coolingtime` | 손익 냉각 시간 | - |
| `profit_loss_depth` | 손익 깊이 | - |
| `profit_loss_lossrate` | 손익 손실률 | - |
| `profit_loss_machine` | 손익 기계 | - |
| `profit_loss_pretime` | 손익 사전 시간 | - |
| `profit_loss_srrate` | 손익 SR률 | - |
| `profit_loss_weight` | 손익 중량 | - |
| `profit_loss_total_addlist` | 손익 합계 추가 리스트 | - |
| `profit_loss_total_addlist2` | 손익 합계 추가 리스트2 | - |
#### 자재/비용 관리
| 테이블 | 역할 |
|--------|------|
| `material_mng` | 자재 관리 |
| `material_master_mgmt` | 자재 마스터 관리 |
| `material_detail_mgmt` | 자재 상세 관리 |
| `input_cost_goal` | 투입 원가 목표 |
#### 비용/투자
| 테이블 | 역할 |
|--------|------|
| `expense_master` | 비용 마스터 |
| `expense_detail` | 비용 상세 |
| `pms_invest_cost_mng` | 투자 비용 관리 |
| `fund_mgmt` | 자금 관리 |
#### 세금계산서
| 테이블 | 역할 |
|--------|------|
| `tax_invoice` | 세금계산서 |
| `tax_invoice_item` | 세금계산서 항목 |
#### 안전 예산
| 테이블 | 역할 |
|--------|------|
| `safety_budget_execution` | 안전 예산 집행 |
| `safety_incidents` | 안전 사고 |
| `safety_inspections` | 안전 점검 |
| `safety_inspections_log` | 안전 점검 이력 |
**워크플로우: 원가 계산**
```
1. BOM 기반 재료비 계산 (material_cost)
2. 공정별 가공비 계산 (injection_cost)
3. 간접비 배부
4. 총 원가 집계 (profit_loss_total)
5. 판매가 대비 이익률 계산 (profit_loss)
```
### 6.9 기타 비즈니스 테이블 - 15+ 테이블
#### 공통 코드
| 테이블 | 역할 |
|--------|------|
| `comm_code` | 공통 코드 |
| `comm_code_history` | 공통 코드 이력 |
| `code_category` | 코드 카테고리 |
| `code_info` | 코드 정보 |
#### 환율
| 테이블 | 역할 |
|--------|------|
| `comm_exchange_rate` | 환율 정보 |
#### 게시판/댓글
| 테이블 | 역할 |
|--------|------|
| `chartmgmt` | 차트 관리 |
| `comments` | 댓글 |
| `inboxtask` | 받은편지함 작업 |
#### 첨부파일
| 테이블 | 역할 |
|--------|------|
| `attach_file_info` | 첨부파일 정보 |
| `file_down_log` | 파일 다운로드 로그 |
#### 승인
| 테이블 | 역할 |
|--------|------|
| `approval` | 승인 |
#### 옵션 관리
| 테이블 | 역할 |
|--------|------|
| `option_mng` | 옵션 관리 |
| `option_price_history` | 옵션 가격 이력 |
#### 수주 사양
| 테이블 | 역할 |
|--------|------|
| `order_spec_mng` | 수주 사양 관리 |
| `order_spec_mng_history` | 수주 사양 이력 |
#### 기타
| 테이블 | 역할 |
|--------|------|
| `ratecal_mgmt` | 요율 계산 관리 |
| `time_sheet` | 타임시트 |
| `problem_mng` | 문제 관리 |
| `planning_issue` | 계획 이슈 |
| `used_mng` | 중고 관리 |
---
## 📊 7. 대시보드 및 리포트 시스템
### 7.1 대시보드
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `dashboards` | 대시보드 정의 | dashboard_id, dashboard_name, company_code |
| `dashboard_elements` | 대시보드 요소 | element_id, dashboard_id, element_type, element_config (JSONB) |
| `dashboard_shares` | 대시보드 공유 | share_id, dashboard_id, shared_with_user_id |
| `dashboard_sliders` | 대시보드 슬라이더 | slider_id, slider_name, company_code |
| `dashboard_slider_items` | 슬라이더 내 대시보드 목록 | item_id, slider_id, dashboard_id, display_order |
**대시보드 구조:**
```
dashboard_sliders (슬라이더 그룹)
└─ dashboard_slider_items (슬라이더에 포함된 대시보드들)
└─ dashboards (개별 대시보드)
└─ dashboard_elements (차트, 위젯 등)
```
### 7.2 리포트 시스템
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `report_master` | 리포트 마스터 | report_id, report_name, report_type |
| `report_query` | 리포트 쿼리 | query_id, report_id, query_sql, query_params |
| `report_layout` | 리포트 레이아웃 | layout_id, report_id, layout_config (JSONB) |
| `report_template` | 리포트 템플릿 | template_id, template_name, template_config (JSONB) |
| `report_menu_mapping` | 리포트-메뉴 매핑 | mapping_id, report_id, menu_id |
**리포트 생성 프로세스:**
```
1. report_master 정의
2. report_query SQL 작성
3. report_layout 레이아웃 설정
4. report_menu_mapping 메뉴 연결
5. 사용자가 메뉴 클릭
6. 동적 SQL 실행
7. 결과를 레이아웃에 맞춰 렌더링
```
---
## 🔧 8. 고급 기능 시스템
### 8.1 카테고리 시스템
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `category_column_mapping` | 카테고리 컬럼 매핑 | table_name, column_name, category_key |
| `table_column_category_values` | 카테고리 값 | table_name, column_name, company_code, category_values (JSONB) |
| `category_value_cascading_group` | 카테고리 연쇄 그룹 | group_id, group_name |
| `category_value_cascading_mapping` | 카테고리 연쇄 매핑 | mapping_id, parent_category, child_category |
**카테고리 기능:**
- 컬럼별 드롭다운 옵션 관리
- 회사별 독립적인 카테고리 값
- 연쇄 드롭다운 (parent → child)
### 8.2 연쇄 드롭다운 (Cascading Dropdown)
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `cascading_relation` | 연쇄 드롭다운 관계 | relation_id, parent_field, child_field, relation_config |
| `cascading_hierarchy_group` | 다단계 연쇄 그룹 | group_id, group_name, hierarchy_levels |
| `cascading_hierarchy_level` | 다단계 연쇄 레벨 | level_id, group_id, level_order, level_config |
| `cascading_condition` | 조건부 연쇄 | condition_id, parent_field, child_field, condition_config |
| `cascading_multi_parent` | 다중 부모 연쇄 | relation_id, child_field, parent_fields (ARRAY) |
| `cascading_multi_parent_source` | 다중 부모 소스 | source_id, relation_id, parent_field, source_config |
| `cascading_mutual_exclusion` | 상호 배제 | exclusion_id, field_1, field_2 |
| `cascading_reverse_lookup` | 역방향 연쇄 | lookup_id, child_field, parent_field |
| `cascading_auto_fill_group` | 자동 입력 그룹 | group_id, master_field, auto_fill_fields |
| `cascading_auto_fill_mapping` | 자동 입력 매핑 | mapping_id, group_id, source_field, target_field |
**연쇄 드롭다운 패턴:**
```
1. 단순 연쇄: 대분류 → 중분류 → 소분류
2. 다단계 연쇄: 회사 → 부서 → 팀 → 직원
3. 조건부 연쇄: 제품군에 따라 다른 옵션 표시
4. 다중 부모: 부품은 여러 제품에 속할 수 있음
5. 자동 입력: 거래처 선택 시 주소/연락처 자동 입력
```
### 8.3 채번 규칙 (Numbering Rules)
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `numbering_rules` | 채번 규칙 마스터 | rule_id, rule_name, table_name, column_name, company_code |
| `numbering_rule_parts` | 채번 규칙 파트 | part_id, rule_id, part_order, part_type, part_config |
**채번 규칙 예시:**
```
수주번호: SO-20260206-001
- SO: 고정 접두사
- 20260206: 날짜 (YYYYMMDD)
- 001: 일련번호 (3자리)
발주번호: PO-{회사코드}-{YYYYMM}-{시퀀스}
- PO: 고정 접두사
- COMPANY_A: 회사 코드
- 202602: 년월
- 0001: 시퀀스 (4자리)
```
### 8.4 엑셀 업로드 매핑
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `excel_mapping_template` | 엑셀 매핑 템플릿 | template_id, template_name, table_name, column_mapping (JSONB) |
**엑셀 업로드 프로세스:**
```
1. 사용자가 엑셀 업로드
2. 헤더 행 읽기
3. excel_mapping_template에서 매칭 템플릿 조회
4. 컬럼 자동 매핑
5. 데이터 검증
6. DB 삽입
```
### 8.5 데이터 관계 브리지
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `data_relationship_bridge` | 테이블 간 데이터 관계 중계 | bridge_id, source_table, source_id, target_table, target_id, relation_type |
**용도:**
- 여러 테이블에 걸친 데이터 연결 추적
- M:N 관계 관리
- 데이터 통합 조회
---
## ⚙️ 9. 배치 및 자동화 시스템
### 9.1 배치 작업
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `batch_jobs` | 배치 작업 정의 | job_id, job_name, job_type, job_config (JSONB) |
| `batch_schedules` | 배치 스케줄 | schedule_id, job_id, cron_expression |
| `batch_execution_logs` | 배치 실행 로그 | log_id, job_id, execution_status, started_at, completed_at |
| `batch_job_executions` | 배치 작업 실행 | execution_id, job_id, execution_params |
| `batch_job_parameters` | 배치 작업 파라미터 | param_id, job_id, param_name, param_value |
| `batch_configs` | 배치 설정 | config_id, job_id, config_key, config_value |
| `batch_mappings` | 배치 매핑 | mapping_id, source_config, target_config |
**배치 작업 예시:**
- 일일 재고 실사
- 월말 마감 처리
- 통계 데이터 집계
- 외부 시스템 동기화
### 9.2 동적 폼 데이터
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `dynamic_form_data` | 동적 폼 데이터 | form_id, table_name, form_data (JSONB) |
**용도:**
- 런타임에 정의된 폼의 데이터 저장
- 유연한 데이터 구조
---
## 🌍 10. 다국어 시스템
### 10.1 다국어 관리
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `multi_lang_category` | 다국어 키 카테고리 (2단계 계층) | category_id, category_name, parent_category_id |
| `multi_lang_key_master` | 다국어 키 마스터 | key_id, key_name, category_id, default_text |
| `multi_lang_text` | 다국어 텍스트 | text_id, key_id, language_code, translated_text |
| `language_master` | 언어 마스터 | language_code, language_name, is_active |
**다국어 구조:**
```
multi_lang_category (카테고리)
└─ multi_lang_key_master (키)
└─ multi_lang_text (언어별 번역)
├─ ko: 한국어
├─ en: 영어
├─ ja: 일본어
└─ zh: 중국어
```
**사용 예시:**
```typescript
// menu_info.lang_key = "menu.sales.order"
// multi_lang_key_master: key_name = "menu.sales.order"
// multi_lang_text:
// - ko: "수주관리"
// - en: "Sales Order"
// - ja: "受注管理"
```
---
## 📧 11. 메일 및 로그 시스템
### 11.1 메일 시스템
| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|-----------|
| `mail_log` | 메일 발송 로그 | log_id, to_email, subject, body, sent_at, sent_status |
### 11.2 로그 테이블
| 테이블 | 역할 |
|--------|------|
| `ddl_execution_log` | DDL 실행 로그 |
| `file_down_log` | 파일 다운로드 로그 |
| `login_access_log` | 로그인 접근 로그 |
### 11.3 변경 이력 테이블 (Audit Log)
모든 주요 테이블에는 `{table_name}_log` 테이블이 있습니다:
| 원본 테이블 | 이력 테이블 | 트리거 함수 |
|-------------|-------------|-------------|
| `carrier_contract_mng` | `carrier_contract_mng_log` | `carrier_contract_mng_log_trigger_func()` |
| `carrier_mng` | `carrier_mng_log` | `carrier_mng_log_trigger_func()` |
| `carrier_vehicle_mng` | `carrier_vehicle_mng_log` | `carrier_vehicle_mng_log_trigger_func()` |
| `defect_standard_mng` | `defect_standard_mng_log` | - |
| `delivery_route_mng` | `delivery_route_mng_log` | - |
| `dtg_management` | `dtg_management_log` | - |
| `equipment_consumable` | `equipment_consumable_log` | - |
| `equipment_inspection_item` | `equipment_inspection_item_log` | - |
| `equipment_mng` | `equipment_mng_log` | - |
| `inspection_equipment_mng` | `inspection_equipment_mng_log` | - |
| `item_info_20251202` | `item_info_20251202_log` | - |
| `logistics_cost_mng` | `logistics_cost_mng_log` | - |
| `order_table` | `order_table_log` | - |
| `safety_inspections` | `safety_inspections_log` | - |
| `sales_order_detail` | `sales_order_detail_log` | - |
| `supplier_mng` | `supplier_mng_log` | - |
| `work_instruction` | `work_instruction_log` | - |
| `work_instruction_detail` | `work_instruction_detail_log` | - |
**이력 테이블 구조:**
```sql
CREATE TABLE {table_name}_log (
id SERIAL PRIMARY KEY,
operation_type VARCHAR(10), -- INSERT, UPDATE, DELETE
original_id VARCHAR(500), -- 원본 레코드 ID
changed_column VARCHAR(100),
old_value TEXT,
new_value TEXT,
changed_by VARCHAR(100),
ip_address VARCHAR(50),
changed_at TIMESTAMP DEFAULT NOW(),
full_row_before JSONB, -- 변경 전 전체 행
full_row_after JSONB -- 변경 후 전체 행
);
```
**트리거 자동 기록:**
```sql
CREATE TRIGGER trg_{table_name}_log
AFTER INSERT OR UPDATE OR DELETE ON {table_name}
FOR EACH ROW
EXECUTE FUNCTION {table_name}_log_trigger_func();
```
---
## 🔍 12. 데이터베이스 함수 및 트리거
### 12.1 주요 함수
#### 화면 관련
```sql
-- 화면 생성 시 메뉴 자동 생성
CREATE FUNCTION auto_create_menu_for_screen() RETURNS TRIGGER;
-- 화면 삭제 시 메뉴 비활성화
CREATE FUNCTION auto_deactivate_menu_for_screen() RETURNS TRIGGER;
```
#### 통계 집계
```sql
-- 일일 운송 통계 집계 함수
CREATE FUNCTION aggregate_daily_transport_statistics(target_date DATE DEFAULT CURRENT_DATE - 1)
RETURNS INTEGER;
```
#### 거리 계산
```sql
-- Haversine 거리 계산 (GPS 좌표)
CREATE FUNCTION calculate_distance(lat1 NUMERIC, lng1 NUMERIC, lat2 NUMERIC, lng2 NUMERIC)
RETURNS NUMERIC;
-- 차량 위치 이력의 이전 위치로부터 거리 계산
CREATE FUNCTION calculate_distance_from_prev() RETURNS TRIGGER;
```
#### 비즈니스 로직
```sql
-- 수주 잔량 자동 계산
CREATE FUNCTION calculate_order_balance() RETURNS TRIGGER;
-- 세금계산서 합계 자동 계산
CREATE FUNCTION calculate_tax_invoice_total() RETURNS TRIGGER;
-- 영업에서 프로젝트 자동 생성
CREATE FUNCTION auto_create_project_from_sales(p_sales_no VARCHAR) RETURNS VARCHAR;
-- 차량 상태 변경 시 운행 통계 계산
CREATE FUNCTION calculate_trip_on_status_change() RETURNS TRIGGER;
```
### 12.2 주요 트리거
```sql
-- 화면 생성 시 메뉴 자동 생성
CREATE TRIGGER trg_auto_create_menu_for_screen
AFTER INSERT ON screen_definitions
FOR EACH ROW
EXECUTE FUNCTION auto_create_menu_for_screen();
-- 화면 삭제 시 메뉴 비활성화
CREATE TRIGGER trg_auto_deactivate_menu_for_screen
AFTER UPDATE ON screen_definitions
FOR EACH ROW
EXECUTE FUNCTION auto_deactivate_menu_for_screen();
-- 차량 위치 이력 거리 자동 계산
CREATE TRIGGER trg_calculate_distance_from_prev
BEFORE INSERT ON vehicle_location_history
FOR EACH ROW
EXECUTE FUNCTION calculate_distance_from_prev();
-- 수주 잔량 자동 계산
CREATE TRIGGER trg_calculate_order_balance
BEFORE INSERT OR UPDATE ON orders
FOR EACH ROW
EXECUTE FUNCTION calculate_order_balance();
-- 세금계산서 합계 자동 계산
CREATE TRIGGER trg_calculate_tax_invoice_total
BEFORE INSERT OR UPDATE ON tax_invoice
FOR EACH ROW
EXECUTE FUNCTION calculate_tax_invoice_total();
```
---
## 📈 13. 인덱스 전략
### 13.1 필수 인덱스
**모든 테이블:**
```sql
-- company_code 인덱스 (멀티테넌시 필수)
CREATE INDEX idx_{table_name}_company_code ON {table_name}(company_code);
```
### 13.2 복합 인덱스
**자주 함께 조회되는 컬럼:**
```sql
-- 회사별, 날짜별 조회
CREATE INDEX idx_sales_company_date ON sales_order_mng(company_code, order_date DESC);
-- 회사별, 상태별 조회
CREATE INDEX idx_work_orders_company_status ON work_orders(company_code, status);
-- 회사별, 거래처별 조회
CREATE INDEX idx_purchase_company_supplier ON purchase_order_master(company_code, partner_objid);
```
### 13.3 부분 인덱스
**특정 조건의 데이터만:**
```sql
-- 활성 상태의 메뉴만 인덱싱
CREATE INDEX idx_menu_active ON menu_info(company_code, menu_type)
WHERE status = 'active';
-- 미완료 작업지시만 인덱싱
CREATE INDEX idx_work_orders_pending ON work_orders(company_code, wo_number)
WHERE status IN ('PENDING', 'IN_PROGRESS');
```
### 13.4 JSONB 인덱스
**JSONB 컬럼 검색:**
```sql
-- GIN 인덱스 (JSONB 전체 검색)
CREATE INDEX idx_screen_layouts_config ON screen_layouts USING GIN (layout_config);
-- JSONB 특정 키 인덱스
CREATE INDEX idx_flow_step_action_type ON flow_step ((action_config->>'action_type'));
```
---
## 🔒 14. 데이터베이스 보안
### 14.1 암호화 컬럼
```sql
-- 외부 DB 비밀번호 암호화
external_db_connections.password_encrypted TEXT
-- 외부 REST API 인증 정보 암호화
external_rest_api_connections.auth_config JSONB
```
**암호화 방식:**
- AES-256-GCM
- 애플리케이션 레벨에서 암호화/복호화
- DB에는 암호화된 값만 저장
### 14.2 접근 제어
**회사별 데이터 격리:**
```sql
-- 모든 쿼리에 company_code 필터 필수
WHERE company_code = $1 AND company_code != '*'
```
**사용자별 권한 관리:**
```
user_info
→ authority_sub_user
→ authority_master
→ rel_menu_auth
→ 메뉴별 CRUD 권한
```
### 14.3 감사 로그
- 모든 변경 사항은 `{table_name}_log` 테이블에 기록
- IP 주소, 사용자 ID, 변경 시각 추적
- 변경 전후 전체 행 데이터 JSONB로 저장
---
## 🚀 15. 성능 최적화 전략
### 15.1 쿼리 최적화
**1. company_code 필터링 항상 포함**
```sql
-- ✅ Good
SELECT * FROM sales_order_mng
WHERE company_code = 'COMPANY_A'
AND order_date >= '2026-01-01';
-- ❌ Bad (전체 스캔)
SELECT * FROM sales_order_mng
WHERE order_date >= '2026-01-01';
```
**2. JOIN 시 company_code 매칭**
```sql
-- ✅ Good
SELECT so.*, c.customer_name
FROM sales_order_mng so
LEFT JOIN customer_mng c
ON so.customer_code = c.customer_code
AND so.company_code = c.company_code -- 필수!
WHERE so.company_code = 'COMPANY_A';
-- ❌ Bad (크로스 조인 발생)
SELECT so.*, c.customer_name
FROM sales_order_mng so
LEFT JOIN customer_mng c
ON so.customer_code = c.customer_code
WHERE so.company_code = 'COMPANY_A';
```
**3. 인덱스 활용**
```sql
-- 복합 인덱스 순서 중요
CREATE INDEX idx_sales_company_date_status
ON sales_order_mng(company_code, order_date, status);
-- ✅ Good (인덱스 활용)
WHERE company_code = 'COMPANY_A'
AND order_date >= '2026-01-01'
AND status = 'CONFIRMED';
-- ❌ Bad (인덱스 미활용)
WHERE status = 'CONFIRMED'
AND order_date >= '2026-01-01'
AND company_code = 'COMPANY_A';
```
### 15.2 대용량 데이터 처리
**파티셔닝:**
```sql
-- 날짜 기반 파티셔닝 (예시)
CREATE TABLE vehicle_location_history (
...
) PARTITION BY RANGE (recorded_at);
CREATE TABLE vehicle_location_history_2026_01
PARTITION OF vehicle_location_history
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
```
**배치 처리:**
```sql
-- 대량 삽입 시 COPY 사용
COPY table_name FROM '/path/to/file.csv' WITH (FORMAT csv, HEADER true);
-- 대량 업데이트 시 배치 단위로
UPDATE table_name
SET status = 'PROCESSED'
WHERE id IN (
SELECT id FROM table_name
WHERE status = 'PENDING'
LIMIT 1000
);
```
### 15.3 캐싱 전략
**애플리케이션 레벨 캐싱:**
- 메타데이터 (table_labels, column_labels) → Redis
- 공통 코드 (comm_code) → Redis
- 메뉴 정보 (menu_info) → Redis
- 사용자 권한 (rel_menu_auth) → Redis
**쿼리 결과 캐싱:**
- 통계 데이터
- 집계 데이터
- 읽기 전용 마스터 데이터
---
## 📝 16. 마이그레이션 가이드
### 16.1 마이그레이션 파일 목록
```
db/migrations/
├── 037_add_parent_group_to_screen_groups.sql
├── 050_create_work_orders_table.sql
├── 051_insert_work_order_screen_definition.sql
├── 052_insert_work_order_screen_layout.sql
├── 054_create_screen_management_enhancement.sql
├── 055_create_customer_item_prices_table.sql
└── plm_schema_20260120.sql (전체 스키마 덤프)
```
### 16.2 마이그레이션 실행 순서
**1. 테이블 생성**
```sql
CREATE TABLE {table_name} (
id VARCHAR(500) PRIMARY KEY DEFAULT gen_random_uuid()::text,
company_code VARCHAR(20) NOT NULL,
created_date TIMESTAMP DEFAULT NOW(),
updated_date TIMESTAMP DEFAULT NOW(),
writer VARCHAR(500),
-- 비즈니스 컬럼들...
);
```
**2. 인덱스 생성**
```sql
CREATE INDEX idx_{table_name}_company_code ON {table_name}(company_code);
CREATE INDEX idx_{table_name}_created_date ON {table_name}(created_date DESC);
-- 기타 필요한 인덱스들...
```
**3. 메타데이터 등록**
```sql
-- table_labels
INSERT INTO table_labels (table_name, table_label, description)
VALUES ('{table_name}', '{한글명}', '{설명}')
ON CONFLICT (table_name) DO UPDATE SET ...;
-- table_type_columns
INSERT INTO table_type_columns (table_name, column_name, company_code, input_type, ...)
VALUES ...;
-- column_labels (레거시 호환)
INSERT INTO column_labels (table_name, column_name, column_label, ...)
VALUES ...;
```
**4. 코멘트 추가**
```sql
COMMENT ON TABLE {table_name} IS '{테이블 설명}';
COMMENT ON COLUMN {table_name}.{column_name} IS '{컬럼 설명}';
```
**5. 화면 정의 (선택)**
```sql
-- screen_definitions
INSERT INTO screen_definitions (screen_code, screen_name, table_name, ...)
VALUES ...;
-- 트리거 자동 발동 → menu_info 자동 생성
```
### 16.3 마이그레이션 롤백
```sql
-- 화면 정의 삭제
DELETE FROM screen_definitions WHERE screen_code = '{screen_code}';
-- 메뉴 삭제 (자동 비활성화되었을 것)
DELETE FROM menu_info WHERE screen_code = '{screen_code}';
-- 메타데이터 삭제
DELETE FROM column_labels WHERE table_name = '{table_name}';
DELETE FROM table_type_columns WHERE table_name = '{table_name}';
DELETE FROM table_labels WHERE table_name = '{table_name}';
-- 인덱스 삭제
DROP INDEX IF EXISTS idx_{table_name}_company_code;
-- 테이블 삭제
DROP TABLE IF EXISTS {table_name};
```
---
## 🎯 17. 데이터베이스 설계 원칙 요약
### 17.1 ABSOLUTE MUST (절대 필수)
1. **모든 테이블에 company_code VARCHAR(20) NOT NULL**
2. **모든 쿼리에 company_code 필터 포함**
3. **JOIN 시 company_code 매칭 조건 포함**
4. **모든 테이블에 company_code 인덱스 생성**
5. **일반 회사는 company_code != '*' 필터 필수**
### 17.2 표준 테이블 구조
```sql
CREATE TABLE {table_name} (
-- 기본 컬럼 (표준 5종 세트)
id VARCHAR(500) PRIMARY KEY DEFAULT gen_random_uuid()::text,
created_date TIMESTAMP DEFAULT NOW(),
updated_date TIMESTAMP DEFAULT NOW(),
writer VARCHAR(500),
company_code VARCHAR(20) NOT NULL,
-- 비즈니스 컬럼들
...
);
-- 필수 인덱스
CREATE INDEX idx_{table_name}_company_code ON {table_name}(company_code);
```
### 17.3 메타데이터 등록 필수
동적 테이블 생성 시:
1. `table_labels` 등록
2. `table_type_columns` 등록 (회사별)
3. `column_labels` 등록 (레거시 호환)
4. 코멘트 추가
### 17.4 쿼리 패턴
```sql
-- ✅ 표준 SELECT
SELECT * FROM table_name
WHERE company_code = $1
AND company_code != '*'
ORDER BY created_date DESC;
-- ✅ 표준 JOIN
SELECT a.*, b.name
FROM table_a a
LEFT JOIN table_b b
ON a.ref_id = b.id
AND a.company_code = b.company_code -- 필수!
WHERE a.company_code = $1;
-- ✅ 표준 집계
SELECT
category,
COUNT(*) as total,
SUM(amount) as total_amount
FROM sales
WHERE company_code = $1
GROUP BY category;
```
---
## 📚 18. 참고 자료
### 18.1 관련 문서
```
docs/
├── DB_ARCHITECTURE_ANALYSIS.md -- 기존 상세 DB 분석 문서
├── backend-architecture-analysis.md -- 백엔드 아키텍처 분석
├── frontend-architecture-analysis.md -- 프론트엔드 아키텍처 분석
└── kjs/
├── 멀티테넌시_구현_현황_분석_보고서.md
├── 테이블_타입관리_성능최적화_결과.md
└── 카테고리_시스템_최종_완료_보고서.md
```
### 18.2 스키마 파일
```
db/
├── plm_schema_20260120.sql -- 전체 스키마 덤프
└── migrations/
├── 037_add_parent_group_to_screen_groups.sql
├── 050_create_work_orders_table.sql
├── 051_insert_work_order_screen_definition.sql
├── 052_insert_work_order_screen_layout.sql
├── 054_create_screen_management_enhancement.sql
└── 055_create_customer_item_prices_table.sql
```
### 18.3 백엔드 서비스 매핑
```typescript
// backend-node/src/services/
// 화면 관리
screenManagementService.ts screen_definitions, screen_layouts
// 테이블 관리
tableManagementService.ts table_labels, table_type_columns, column_labels
// 메뉴 관리
menuService.ts menu_info, menu_screen_groups
// 카테고리 관리
categoryTreeService.ts table_column_category_values
// 플로우 관리
flowDefinitionService.ts flow_definition, flow_step
flowExecutionService.ts flow_data_status, flow_audit_log
// 데이터플로우
dataflowService.ts dataflow_diagrams, screen_data_flows
// 외부 연동
externalDbConnectionService.ts external_db_connections
externalRestApiConnectionService.ts external_rest_api_connections
// 배치
batchService.ts batch_jobs, batch_execution_logs
// 인증/권한
authService.ts user_info, auth_tokens
roleService.ts authority_master, rel_menu_auth
```
---
## 🎬 19. 비즈니스 워크플로우 통합 예시
### 19.1 수주 → 생산 → 출하 전체 플로우
```
[영업팀]
1. 견적 요청 접수 (estimate_mgmt)
2. 견적서 작성 및 발송
3. 고객 승인
[영업팀]
4. 수주 등록 (sales_order_mng)
→ sales_order_detail (품목별 상세)
→ contract_mgmt (계약 체결)
[생산관리팀]
5. 생산 계획 수립 (order_plan_mgmt)
→ 자재 소요 계획 (MRP)
→ 공정별 계획
[구매팀]
6. 구매 요청 (sales_request_master)
→ 공급처 선정 (supplier_mng)
→ 발주서 작성 (purchase_order_master)
→ 발주서 상세 (purchase_order_part)
[자재팀]
7. 입고 예정 (delivery_history)
→ 검수 (check_report_mng)
→ 입고 확정 (receiving)
→ 재고 반영 (inventory_stock)
[생산팀]
8. 작업지시 발행 (work_orders)
→ 자재 출고 (material_release)
→ 생산 실행 (production_record)
[품질팀]
9. 품질 검사 (inspection_standard)
→ 합격/불합격 판정
→ 완제품 입고 (inventory_stock)
[물류팀]
10. 출하 계획 (shipment_plan)
→ 출하 지시 (shipment_instruction)
→ 차량 배차 (vehicles)
→ 출고 처리 (outbound_mng)
[운송팀]
11. 운행 시작
→ GPS 추적 (vehicle_location_history)
→ 운행 로그 (transport_logs)
[고객]
12. 납품 완료
→ 배송 상태 업데이트 (delivery_status)
→ 세금계산서 발행 (tax_invoice)
[재무팀]
13. 정산
→ 매출 인식
→ 원가 계산 (profit_loss)
```
### 19.2 데이터 흐름 추적
```
플로우 정의 (flow_definition): "수주-생산-출하 플로우"
├─ Step 1: 수주 접수 (flow_step)
│ └─ 데이터: sales_order_mng
│ └─ flow_data_status: STEP_1_COMPLETED
├─ Step 2: 생산 계획 (flow_step)
│ └─ 데이터: order_plan_mgmt
│ └─ flow_data_status: STEP_2_COMPLETED
├─ Step 3: 발주 처리 (flow_step)
│ └─ 데이터: purchase_order_master
│ └─ flow_data_status: STEP_3_COMPLETED
├─ Step 4: 입고 처리 (flow_step)
│ └─ 데이터: receiving, inventory_stock
│ └─ flow_data_status: STEP_4_COMPLETED
├─ Step 5: 생산 실행 (flow_step)
│ └─ 데이터: work_orders, production_record
│ └─ flow_data_status: STEP_5_COMPLETED
└─ Step 6: 출하 완료 (flow_step)
└─ 데이터: shipment_plan, outbound_mng
└─ flow_data_status: COMPLETED
각 단계 변경 이력: flow_audit_log
외부 시스템 연동: flow_integration_log
```
---
**문서 작성자**: Cursor AI (DB Specialist Agent)
**문서 버전**: 2.0
**작성일**: 2026-02-06
**기반 스키마**: plm_schema_20260120.sql (337 테이블)
**목적**: WACE ERP 전체 워크플로우 문서화를 위한 DB 구조 분석
---