화면 구성 — 시각화 (tree/graph)
기본 화면 문법은 화면 구성 (기본), 고급 문법은 화면 구성 (고급)을 참조하세요.
개요
tree와 graph screenType은 config-driven 시각화 아키텍처를 따릅니다. 캔버스 디자이너에서 설정한 treeConfig 또는 graphConfig가 런타임에서 자동으로 렌더링되며, 코드 수정 없이 다양한 솔루션에 재사용할 수 있습니다.
핵심 설계 원칙:
- 선언적 구성: JSON config만으로 트리/그래프 화면 생성
- 동적 컬럼 접근:
parentColumn,childColumn등으로 테이블 컬럼을 동적 참조 (getField패턴) - 솔루션 독립: MES LOT 계보, ERP BOM, EAM 설비 계층 등 동일 엔진으로 처리
데이터 흐름
캔버스 디자이너에서 런타임 렌더링까지의 전체 파이프라인입니다.
┌─────────────────────────┐
│ Canvas Designer │
│ ScreenViewNodePanel │
│ (treeConfig/graphConfig│
│ 설정 UI) │
└──────────┬──────────────┘
│ JSON 저장
▼
┌─────────────────────────┐
│ runtimeStore │
│ (screenType, config │
│ 로드 및 상태 관리) │
└──────────┬──────────────┘
│ props 전달
▼
┌─────────────────────────┐
│ ScreenModal │
│ (screenType 분기) │
│ tree → RuntimeTreeView │
│ graph → RuntimeGraphView│
└──────────┬──────────────┘
│ config 해석
▼
┌─────────────────────────┐
│ 시각화 컴포넌트 │
│ - LotGenealogyTree │
│ - LotTraceGraph │
│ (React Flow 기반 렌더링)│
└─────────────────────────┘
데이터 흐름 요약
- 디자이너에서
treeConfig/graphConfig를 JSON으로 저장 runtimeStore가 해당 설정을 로드하여 상태 관리ScreenModal이screenType에 따라 적절한 뷰 컴포넌트로 분기- 뷰 컴포넌트가 config의 컬럼명을 기반으로 데이터를 동적 조회하여 시각화
treeConfig 상세
트리뷰 화면의 전체 설정 구조입니다.
전체 JSON 예시
{
"refId": "scr_lot_genealogy_tree",
"label": "LOT 계보 트리",
"screenType": "tree",
"menuIcon": "ApartmentOutlined",
"menuOrder": 5,
"boundTableRef": "lot_genealogy",
"parentMenuRef": "menu_mes_production",
"treeConfig": {
"parentColumn": "parent_lot_id",
"childColumn": "child_lot_id",
"labelColumn": "lot_number",
"badgeColumn": "relation_type",
"detailColumns": ["consumed_qty", "produced_qty", "linked_at"],
"direction": "TB",
"maxDepth": 10,
"searchEnabled": true,
"detailPanelEnabled": true
},
"listConfig": {
"columns": [
{ "columnName": "parent_lot_id", "width": 150, "sortable": true },
{ "columnName": "child_lot_id", "width": 150, "sortable": true },
{ "columnName": "relation_type", "width": 100, "filterable": true }
],
"defaultSort": { "columnName": "linked_at", "order": "descend" },
"pageSize": 20
}
}
treeConfig 필드 명세
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
parentColumn | string | 필수 | — | 부모 레코드를 가리키는 FK 컬럼명 |
childColumn | string | 필수 | — | 자식 레코드를 가리키는 FK 컬럼명 |
labelColumn | string | 필수 | — | 트리 노드에 표시할 라벨 컬럼 (마스터 테이블) |
badgeColumn | string | 선택 | — | 관계유형 뱃지 컬럼 (ENUM 권장) |
detailColumns | string[] | 선택 | [] | 노드 클릭 시 표시할 보조 정보 컬럼들 |
direction | string | 선택 | "TB" | 트리 방향: TB (상→하), LR (좌→우), BT (하→상) |
maxDepth | number | 선택 | 10 | 최대 탐색 깊이 (순환 참조 방지) |
searchEnabled | boolean | 선택 | true | 검색 바 표시 여부 |
detailPanelEnabled | boolean | 선택 | true | 노드 클릭 시 상세 패널 표시 여부 |
동작 원리
parentColumn과 childColumn은 boundTableRef 테이블의 실제 컬럼명입니다. 런타임에서 getField 패턴으로 동적 컬럼에 접근하여 트리 구조를 구성합니다.
parentColumn: "parent_lot_id" → record[getField("parent_lot_id")]
childColumn: "child_lot_id" → record[getField("child_lot_id")]
labelColumn: "lot_number" → 마스터 테이블에서 표시용 값 조회
direction 옵션
TB(Top → Bottom): 부모가 위, 자식이 아래 — BOM, 조직도에 적합LR(Left → Right): 부모가 좌, 자식이 우 — 프로세스 흐름에 적합BT(Bottom → Top): 자식이 위, 부모가 아래 — 역추적에 적합
graphConfig 상세
네트워크 그래프 화면의 전체 설정 구조입니다.
전체 JSON 예시
{
"refId": "scr_lot_trace_graph",
"label": "LOT 추적 그래프",
"screenType": "graph",
"menuIcon": "DeploymentUnitOutlined",
"menuOrder": 6,
"boundTableRef": "lot_genealogy",
"parentMenuRef": "menu_mes_production",
"graphConfig": {
"sourceColumn": "parent_lot_id",
"targetColumn": "child_lot_id",
"labelColumn": "lot_number",
"edgeLabelColumn": "relation_type",
"edgeWeightColumn": "consumed_qty",
"layout": "elk",
"detailPanelEnabled": true,
"zoomControlEnabled": true,
"minimapEnabled": true
},
"listConfig": {
"columns": [
{ "columnName": "parent_lot_id", "width": 150, "sortable": true },
{ "columnName": "child_lot_id", "width": 150, "sortable": true },
{ "columnName": "relation_type", "width": 100, "filterable": true },
{ "columnName": "consumed_qty", "width": 100 }
],
"defaultSort": { "columnName": "linked_at", "order": "descend" },
"pageSize": 20
}
}
graphConfig 필드 명세
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
sourceColumn | string | 필수 | — | 소스(출발) 노드 FK 컬럼명 |
targetColumn | string | 필수 | — | 타겟(도착) 노드 FK 컬럼명 |
labelColumn | string | 필수 | — | 노드 라벨 컬럼 (마스터 테이블) |
edgeLabelColumn | string | 선택 | — | 엣지(간선) 라벨 컬럼 |
edgeWeightColumn | string | 선택 | — | 엣지 가중치 컬럼 (선 두께에 반영) |
layout | string | 선택 | "elk" | 레이아웃 엔진 |
detailPanelEnabled | boolean | 선택 | true | 노드 클릭 시 상세 패널 표시 여부 |
zoomControlEnabled | boolean | 선택 | true | 확대/축소 컨트롤 표시 여부 |
minimapEnabled | boolean | 선택 | true | 미니맵 표시 여부 |
layout 옵션
| 레이아웃 | 설명 | 적합한 데이터 |
|---|---|---|
elk | 계층형 레이아웃 | LOT 계보, BOM 구조 등 방향성 있는 데이터 (기본값) |
force | 자유 네트워크 | 거래처 관계, 부서 간 협업 등 비계층 데이터 |
circular | 원형 레이아웃 | 순환 프로세스, 주기적 관계 시각화 |
레이아웃 선택 기준
- 방향성이 있는 데이터 (부모→자식, 공급→소비):
elk권장 - 동등한 관계의 네트워크:
force권장 - 순환/주기 구조:
circular권장