# WACE ERP 화면 구성 시스템 전체 분석 > **최종 업데이트**: 2026-03-13 > **용도**: LLM 챗봇 / AI 에이전트가 화면 개발 요청을 받았을 때 참조하는 시스템 구조 레퍼런스 > **핵심 규칙**: 사용자 업무 화면은 React 코드(.tsx)로 직접 만들지 않는다. DB 등록(screen_definitions + screen_layouts_v2 + menu_info)으로 구현한다. --- ## 1. 시스템 아키텍처 요약 ### 1.1 화면 렌더링 파이프라인 ``` [DB] screen_definitions (화면 정의) + screen_layouts_v2 (레이아웃 JSON) + menu_info (메뉴 등록) │ ▼ [Backend API] GET /api/screens/:screenId │ ▼ [Frontend] /screens/[screenId]/page.tsx │ ▼ [Converter] layoutV2Converter.ts → V2 JSON을 Legacy 포맷으로 변환 │ ▼ [Renderer] ResponsiveGridRenderer → RealtimePreview → DynamicComponentRenderer │ ▼ [Registry] ComponentRegistry.getComponent(componentType) → 실제 React 컴포넌트 렌더링 ``` ### 1.2 화면 유형 분류 | 구분 | 구현 방식 | 코드 위치 | 예시 | |------|----------|----------|------| | **사용자 업무 화면** | DB 등록 (SQL INSERT) | screen_definitions + screen_layouts_v2 | 수주관리, 품목정보, BOM관리 | | **관리자 메뉴** | React 코드 직접 작성 | frontend/app/(main)/admin/*/page.tsx | 사용자관리, 권한관리, 시스템설정 | **절대 규칙**: 사용자 업무 화면(생산, 영업, 구매, 물류, 품질 등)은 React 하드코딩 금지. 반드시 DB 등록 방식으로 구현. --- ## 2. V2 컴포넌트 전체 목록 (32개) > 모든 컴포넌트는 `v2-` 접두사를 사용한다. 접두사 없는 컴포넌트는 레거시이므로 사용 금지. ### 2.1 입력 컴포넌트 (9개) | ID | 용도 | 핵심 설정 | |----|------|----------| | `v2-input` | 텍스트, 숫자, 비밀번호, textarea, 슬라이더, 컬러, 버튼 | inputType, format(email/tel/url/currency/biz_no), required, readonly, maxLength | | `v2-select` | 드롭다운, 콤보박스, 라디오, 체크박스, 태그, 토글, 스왑 | mode, source(static/code/db/api/entity/category/distinct/select), searchable, multiple, cascading | | `v2-date` | 날짜, 시간, 날짜시간, 날짜범위, 월, 연도 | dateType(date/time/datetime), format, range, minDate, maxDate | | `v2-file-upload` | 파일/이미지 업로드, 다중 업로드 | accept, maxSize, multiple | | `v2-media` | 이미지, 비디오, 오디오 표시 | mediaType | | `v2-location-swap-selector` | 출발지/도착지 선택 및 교환 | - | | `v2-rack-structure` | 창고 랙 위치 일괄 생성 | columns, rows | | `v2-process-work-standard` | 품목별 공정 작업기준 관리 (Pre/In/Post-Work) | - | | `v2-item-routing` | 품목별 라우팅 버전 및 공정 순서 관리 (3단계 계층) | - | ### 2.2 표시/데이터 컴포넌트 (10개) | ID | 용도 | 핵심 설정 | |----|------|----------| | `v2-table-list` | 데이터 테이블 (조회/편집, 페이지네이션, 정렬, 필터) | selectedTable, columns, pagination, displayMode(table/card), checkbox, linkedFilters | | `v2-table-grouped` | 그룹화 테이블 (접기/펼치기, 그룹별 집계) | groupConfig(groupByColumn, summary), v2-table-list 기반 확장 | | `v2-table-search-widget` | 테이블 검색/필터/그룹 바 | autoSelectFirstTable, showTableSelector | | `v2-pivot-grid` | 다차원 피벗 분석 (행/열/데이터/필터 영역) | fields(area, summaryType, groupInterval), dataSource | | `v2-text-display` | 라벨, 제목, 설명 텍스트 표시 | fontSize, fontWeight, color, textAlign | | `v2-card-display` | 테이블 데이터를 카드 형태로 표시 | cardsPerRow, columnMapping(title/subtitle/image/status), cardStyle | | `v2-aggregation-widget` | 합계, 평균, 개수, 최대, 최소 집계 카드 | items, filters, layout | | `v2-status-count` | 상태별 건수 카드 표시 | statusField, countField | | `v2-numbering-rule` | 자동 코드/번호 채번 (접두사+날짜+순번) | rule, prefix, format | | `v2-category-manager` | 트리 기반 카테고리 관리 (3단계 계층) | - | ### 2.3 레이아웃 컴포넌트 (8개) | ID | 용도 | 핵심 설정 | |----|------|----------| | `v2-split-panel-layout` | 마스터-디테일 좌우 분할 | splitRatio, leftPanel(displayMode/tableName), rightPanel(relation/foreignKey), additionalTabs | | `v2-tabs-widget` | 탭 전환, 탭 내 컴포넌트 배치 | tabs(id/label/components), defaultTab, orientation | | `v2-section-card` | 제목+테두리가 있는 그룹화 컨테이너 | title, collapsible | | `v2-section-paper` | 배경색 기반 미니멀 그룹화 컨테이너 | backgroundColor, padding | | `v2-divider-line` | 영역 구분선 | orientation, thickness | | `v2-split-line` | 캔버스 좌우 분할용 드래그 가능 세로선 | - | | `v2-repeat-container` | 데이터 수만큼 내부 컴포넌트 반복 렌더링 | dataSourceType, layout, gridColumns | | `v2-repeater` | 인라인/모달/버튼 모드 반복 데이터 관리 | mode(inline/modal/button) | ### 2.4 특수/비즈니스 컴포넌트 (5개) | ID | 용도 | 핵심 설정 | |----|------|----------| | `v2-button-primary` | 저장/삭제/조회 등 액션 버튼 | text, actionType, variant, webTypeConfig.dataflowConfig | | `v2-timeline-scheduler` | 간트차트형 일정/계획 시각화 (드래그/리사이즈) | selectedTable, resourceTable, fieldMapping, zoomLevel, editable | | `v2-approval-step` | 결재 단계 스테퍼 시각화 | - | | `v2-bom-tree` | BOM 계층 트리 표시 (정전개/역전개) | - | | `v2-bom-item-editor` | BOM 하위품목 트리 편집 | - | --- ## 3. 화면 UI 패턴 분류 (7가지) > AI가 화면 개발 요청을 받았을 때, 아래 패턴 중 해당하는 것을 선택하여 구현한다. ### 패턴 A: 기본 마스터 (검색 + 테이블) **적용 비율**: 약 50% (가장 흔함) **적용 화면**: 코드관리, 부서정보, 창고정보, 검사기준, 불량관리, 공급업체관리 등 ``` ┌─────────────────────────────────────────────────┐ │ v2-table-search-widget │ │ [검색필드1] [검색필드2] [조회] [엑셀] │ ├─────────────────────────────────────────────────┤ │ v2-table-list │ │ 제목 [신규] [삭제] │ │ ─────────────────────────────────────────────── │ │ □ | 코드 | 이름 | 상태 | 등록일 │ └─────────────────────────────────────────────────┘ ``` **필수 컴포넌트**: `v2-table-search-widget` (1개) + `v2-table-list` (1개) ### 패턴 B: 마스터-디테일 (좌우 분할) **적용 비율**: 약 25% **적용 화면**: 공정관리, 수주관리, 견적관리, 품목라우팅 등 ``` ┌──────────────────┬──────────────────────────────┐ │ 마스터 테이블 │ 디테일 테이블/폼 │ │ (좌측 패널) │ (우측 패널) │ │ □ A001 항목1 │ [상세 정보 테이블] │ │ □ A002 항목2 ← │ │ └──────────────────┴──────────────────────────────┘ v2-split-panel-layout ``` **필수 컴포넌트**: `v2-split-panel-layout` (1개) ### 패턴 C: 마스터-디테일 + 탭 **적용 비율**: 약 10% **적용 화면**: 거래처관리, 설비정보, 품목정보 등 ``` ┌──────────────────┬──────────────────────────────┐ │ 마스터 테이블 │ [기본] [이력] [첨부] │ │ │ ┌────────────────────────┐ │ │ □ A001 거래처1 │ │ 탭별 컨텐츠 │ │ │ □ A002 거래처2 ← │ └────────────────────────┘ │ └──────────────────┴──────────────────────────────┘ ``` **필수 컴포넌트**: `v2-split-panel-layout` (1개, rightPanel에 additionalTabs 설정) ### 패턴 D: 카드 뷰 **적용 비율**: 약 5% **적용 화면**: 설비정보, 대시보드, 상품 카탈로그 등 ``` ┌─────────────────────────────────────────────────┐ │ v2-table-search-widget │ ├─────────────────────────────────────────────────┤ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ [이미지]│ │ [이미지]│ │ [이미지]│ │ │ │ 제목 │ │ 제목 │ │ 제목 │ │ │ │ 설명 │ │ 설명 │ │ 설명 │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ v2-card-display │ └─────────────────────────────────────────────────┘ ``` **필수 컴포넌트**: `v2-card-display` (1개) + `v2-table-search-widget` (선택) ### 패턴 E: 피벗 분석 **적용 비율**: 약 3% **적용 화면**: 매출분석, 재고현황, 생산실적 분석 등 **필수 컴포넌트**: `v2-pivot-grid` (1개) ### 패턴 F: 그룹화 테이블 **적용 비율**: 약 5% **적용 화면**: 품목정보(카테고리별), 입출고관리(구분별), 작업지시(공정별) 등 ``` ┌─────────────────────────────────────────────────┐ │ [전체 펼치기] [전체 접기] │ ├─────────────────────────────────────────────────┤ │ ▼ □ 그룹A 수량: 150 3건 │ │ ├─ □ 항목1 50개 │ │ ├─ □ 항목2 50개 │ │ └─ □ 항목3 50개 │ │ ► □ 그룹B 수량: 200 2건 │ └─────────────────────────────────────────────────┘ ``` **필수 컴포넌트**: `v2-table-grouped` (1개) ### 패턴 G: 타임라인/간트차트 **적용 비율**: 약 2% **적용 화면**: 생산계획관리, 설비가동현황 등 ``` ┌────────────┬─────────────────────────────────────┐ │ │ 15(수) │ 16(목) │ 17(금) │ 18(토) │ ├────────────┼─────────────────────────────────────┤ │ 설비A │ ████████████████ │ │ 설비B │ █████████████████████ │ │ 설비C │ ████████████████ │ └────────────┴─────────────────────────────────────┘ ``` **필수 컴포넌트**: `v2-timeline-scheduler` (1개) --- ## 4. 패턴 판단 의사결정 트리 > AI가 화면 요청을 받았을 때 이 트리를 따라 패턴을 결정한다. ``` Q1. 시간축 기반 일정/간트차트가 필요한가? ├─ YES → 패턴 G (타임라인) └─ NO ↓ Q2. 다차원 집계/피벗 분석이 필요한가? ├─ YES → 패턴 E (피벗) └─ NO ↓ Q3. 데이터를 그룹별로 묶어서 접기/펼치기가 필요한가? ├─ YES → 패턴 F (그룹화 테이블) └─ NO ↓ Q4. 이미지+정보를 카드 형태로 표시하는가? ├─ YES → 패턴 D (카드 뷰) └─ NO ↓ Q5. 마스터 테이블 선택 시 연관 디테일이 필요한가? ├─ YES → Q5-1. 디테일에 탭이 필요한가? │ ├─ YES → 패턴 C (마스터-디테일+탭) │ └─ NO → 패턴 B (마스터-디테일) └─ NO → 패턴 A (기본 마스터) ``` --- ## 5. 화면 구현 불가능/제한 사항 ### 5.1 현재 불가능 (별도 React 개발 필요) | 기능 | 상태 | 대안 | |------|------|------| | 칸반 보드 (드래그앤드롭) | 미지원 | 별도 React 컴포넌트 | | 모바일 네이티브 앱 스타일 | 미지원 | 별도 개발 | | 복잡한 차트 (line, bar, pie) | 미지원 | 외부 라이브러리 연동 | ### 5.2 이전에 불가능했으나 현재 지원되는 기능 | 기능 | 지원 컴포넌트 | 추가 시점 | |------|-------------|----------| | 그룹화 테이블 | `v2-table-grouped` | 2026-01 | | 타임라인/간트차트 | `v2-timeline-scheduler` | 2026-01 | | BOM 트리 (정전개/역전개) | `v2-bom-tree` | 2026-02 | | BOM 하위품목 편집 | `v2-bom-item-editor` | 2026-02 | | 결재 스테퍼 | `v2-approval-step` | 2026-02 | ### 5.3 권장하지 않는 조합 | 조합 | 이유 | |------|------| | 3단계 이상 중첩 분할 | 화면 복잡도 증가, 성능 저하 | | 탭 안에 탭 | 사용성 저하 | | 한 화면에 3개 이상 테이블 | 데이터 로딩 성능 | | 피벗 + 상세 테이블 동시 | 데이터 과부하 | --- ## 6. 화면별 구현 현황 (메뉴 분류) ### 6.1 기준정보 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 회사정보 | A | 완전 지원 | | | 부서정보 | A | 완전 지원 | | | 품목정보 | F 또는 A | 완전 지원 | 카테고리별 그룹화 시 F | | BOM관리 | B + v2-bom-tree | 완전 지원 | v2-bom-tree로 트리 구현 | | 공정정보관리 | B | 완전 지원 | | | 공정작업기준 | A | 완전 지원 | v2-process-work-standard 활용 가능 | | 품목라우팅 | B | 완전 지원 | v2-item-routing 활용 가능 | ### 6.2 영업관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 수주관리 | B | 완전 지원 | | | 견적관리 | B | 완전 지원 | | | 거래처관리 | C | 완전 지원 | 탭(기본/이력/첨부) | | 판매품목정보 | A | 완전 지원 | | | 출하계획관리 | A | 완전 지원 | | ### 6.3 생산관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 생산계획관리 | G | 완전 지원 | v2-timeline-scheduler | | 생산관리 | A | 완전 지원 | | | 생산실적관리 | A | 완전 지원 | | | 작업지시 | F | 완전 지원 | 공정별 그룹화 | | 공정관리 | B | 완전 지원 | | ### 6.4 구매관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 발주관리 | A | 완전 지원 | | | 공급업체관리 | A | 완전 지원 | | | 구매입고 | A | 완전 지원 | | ### 6.5 설비관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 설비정보 | C 또는 D | 완전 지원 | 카드뷰 또는 탭 | ### 6.6 물류관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 창고정보관리 | A | 완전 지원 | | | 입출고관리 | F | 완전 지원 | 구분별 그룹화 | | 재고현황 | A 또는 E | 완전 지원 | 피벗 분석도 가능 | ### 6.7 품질관리 | 화면명 | 패턴 | 구현 가능 | 비고 | |--------|------|----------|------| | 검사기준 | A | 완전 지원 | | | 검사정보관리 | C | 완전 지원 | 탭(수입검사/공정검사/출하검사) | | 검사장비관리 | A | 완전 지원 | | | 불량관리 | A | 완전 지원 | | | 클레임관리 | A | 완전 지원 | | --- ## 7. 컴포넌트 커버리지 요약 | 항목 | 수치 | |------|------| | 전체 분석 대상 화면 | 26개 | | V2 컴포넌트로 구현 가능 | **26개 (100%)** | | 등록된 V2 컴포넌트 수 | 32개 | | 화면 UI 패턴 수 | 7가지 (A~G) | **이전 대비 변경 사항**: - BOM 트리 지원 추가 (v2-bom-tree) → BOM관리 완전 지원 - 그룹화 테이블 지원 추가 (v2-table-grouped) → 품목정보, 입출고 등 완전 지원 - 타임라인 지원 추가 (v2-timeline-scheduler) → 생산계획관리 완전 지원 - 결재 스테퍼 추가 (v2-approval-step) → 결재 프로세스 시각화 가능 - 전체 커버리지: 65% → **100%** 달성 --- ## 8. UI vs 비즈니스 로직 분리 구조 ``` ┌───────────────────────────────┬───────────────────────────────────┐ │ UI 레이아웃 │ 제어관리 (비즈니스 로직) │ │ screen_layouts_v2 (JSON) │ dataflow_diagrams (JSONB) │ ├───────────────────────────────┼───────────────────────────────────┤ │ - 컴포넌트 배치/크기/위치 │ - 버튼 클릭 시 액션 (INSERT 등) │ │ - 검색 필드 구성 │ - 조건부 실행 │ │ - 테이블 컬럼 표시/숨김 │ - 다중 행 일괄 처리 │ │ - 카드/탭/분할 레이아웃 │ - 테이블 간 데이터 이동 │ │ - 페이지네이션/정렬 설정 │ - 외부 시스템 호출 │ └───────────────────────────────┴───────────────────────────────────┘ ``` **핵심**: V2 컴포넌트는 UI만 담당한다. 버튼 클릭 시 INSERT/UPDATE/DELETE 같은 비즈니스 로직은 `dataflow_diagrams` 테이블에서 별도 설정한다. ### 비즈니스 로직 실행 흐름 ``` v2-button-primary 클릭 → webTypeConfig.dataflowConfig 확인 → ImprovedButtonActionExecutor 실행 1. Before 제어 실행 (조건 체크) 2. Main 액션 실행 (save/delete/update) 3. After 제어 실행 (후처리) ``` --- ## 9. 화면 개발 순서 (AI 에이전트용) ``` Step 1: DB 테이블 생성 └─ 모든 컬럼 VARCHAR(500), 기본 5개 컬럼 필수 (id, created_date, updated_date, writer, company_code) └─ table_labels, table_type_columns, column_labels 메타데이터 등록 Step 2: screen_definitions INSERT └─ screen_code = '{company_code}_{순번}' └─ table_name = 메인 테이블명 Step 3: screen_layouts_v2 INSERT └─ layout_data = V2 레이아웃 JSON (version: "2.0", components 배열) └─ 패턴(A~G)에 맞는 컴포넌트 배치 Step 4: dataflow_diagrams INSERT (비즈니스 로직이 필요한 경우) └─ 버튼별 액션 정의 (INSERT/UPDATE/DELETE) └─ 조건, 필드 매핑 설정 Step 5: menu_info INSERT └─ menu_url = '/screen/{screen_code}' └─ 적절한 parent_id로 메뉴 트리에 배치 ``` --- ## 10. DB 테이블 구조 레퍼런스 ### screen_definitions | 컬럼 | 타입 | 설명 | |------|------|------| | screen_id | integer PK (시퀀스) | 화면 고유 ID | | screen_name | varchar(100) | 화면명 | | screen_code | varchar(50) UNIQUE | 화면 코드 (`{company_code}_{순번}`) | | table_name | varchar(100) | 기본 테이블명 | | company_code | varchar(50) | 회사 코드 | | description | text | 설명 | | is_active | char(1) | Y/N/D | ### screen_layouts_v2 | 컬럼 | 타입 | 설명 | |------|------|------| | layout_id | integer PK | 레이아웃 ID | | screen_id | integer FK | 화면 ID | | company_code | varchar(20) | 회사 코드 | | layer_id | integer | 레이어 ID (1=기본) | | layout_data | jsonb | 전체 레이아웃 JSON | ### layout_data JSON 구조 ```json { "version": "2.0", "components": [ { "id": "comp_xxx", "url": "@/lib/registry/components/v2-table-list", "position": { "x": 0, "y": 150, "z": 1 }, "size": { "width": 1920, "height": 600 }, "displayOrder": 0, "overrides": { "label": "품목 목록", "tableName": "item_info", "columns": [ { "columnName": "item_code", "displayName": "품목코드", "visible": true } ], "pagination": { "enabled": true, "pageSize": 20 } } } ], "gridSettings": { "columns": 12, "gap": 16, "padding": 16 }, "screenResolution": { "width": 1920, "height": 1080 } } ``` ### menu_info (주요 컬럼) | 컬럼 | 설명 | |------|------| | objid / menu_id | 메뉴 PK | | screen_id | 연결된 화면 ID | | menu_url | 메뉴 URL (`/screen/{screen_code}`) | | company_code | 회사 코드 |