# 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 구조 분석 ---