Files
frontend/docs/st/08.리얼그리드활용.md

170 lines
8.3 KiB
Markdown

# 08. 리얼그리드(RealGrid) 활용
ST 앱에서 사용하는 엔터프라이즈급 그리드 라이브러리인 **RealGrid 2**의 구현 방식과 주요 함수, 속성을 정리합니다.
---
## 1. 개요 및 구조
ST 앱은 `realgrid-react`를 사용하여 리액트 환경에서 그리드를 구현하고 있으며, 공통 모듈인 `DataGrid.tsx`에서 복잡한 설정을 추상화하여 제공합니다.
### 주요 컴포넌트
- **`DataGrid.tsx`**: 가장 핵심이 되는 공통 그리드 컴포넌트.
- **`TabDataGrid.tsx`**: 탭별로 독립적인 `DataGrid`를 렌더링.
- **`SplitDataGrid.tsx`**: 좌우 5:5 분할 화면에 두 개의 그리드를 배치.
- **`CompactDataGrid.tsx`**: 간소화된 형태의 그리드.
---
## 2. 주요 설정 및 속성 (Props)
`DataGridProps` 인터페이스를 통해 그리드의 동작을 제어합니다.
| 속성명 | 타입 | 설명 |
|-------|------|------|
| `columnInfo` | `ColumnInfo` | 컬럼 정의(`columns`)와 레이아웃(`columnLayout`) 정보 |
| `rowData` | `Record[]` | 그리드에 표시할 실제 데이터 배열 |
| `fixedColumns` | `number` | 좌측에 고정할 컬럼 수 |
| `rowStartNum` | `number` | 엑셀 임포트 시 헤더가 시작되는 행 번호 |
| `isExcelImport` | `boolean` | 엑셀 가져오기 버튼 표시 여부 |
| `isExcelExport` | `boolean` | 엑셀 내보내기 버튼 표시 여부 |
| `showHeaderCheckbox`| `boolean` | 헤더 체크박스(CheckBar) 표시 여부 |
| `cellStyleCallback` | `Function` | 실시간 조건부 셀 스타일 적용 콜백 |
| `cellTooltipCallback`| `Function` | 셀 호버 시 표시할 툴팁 메시지 콜백 |
| `onRowClick` | `Function` | 행 클릭 시 실행될 이벤트 핸들러 |
---
## 3. 컬럼 정의 (`ColumnConfig`)
`src/components/type/DataGrid.type.ts`에 정의된 주요 컬럼 속성입니다.
```typescript
export type ColumnConfig = {
name: string; // 컬럼 고유 이름
fieldName: string; // 데이터 필드명
header: { text: string }; // 헤더 표시 텍스트
width?: number; // 컬럼 너비 (px)
editable?: boolean; // 편집 가능 여부
visible?: boolean; // 숨김 여부
styleName?: string; // 적용할 CSS 클래스
mergeCells?: boolean; // 셀 병합 여부 (내용이 같을 때)
valueType?: ValueType; // 데이터 타입 (TEXT, NUMBER 등)
footer?: FooterConfig; // 푸터 설정 (합계 등)
computed?: Computed; // 계산 필드 설정 (합계/평균/비율 등)
};
```
---
## 4. 핵심 기능 구현 상세
### 4-1. 커스텀 정렬 (`onSorting`)
기본 정렬 사용 시 "시군구" 등 병합된 셀의 그룹 순서가 깨지는 문제를 해결하기 위해 전용 핸들러를 사용합니다.
- **`createOnSortingHandler`**: 정렬 시 그룹(시군구) 내의 순서를 유지하며 그룹 간 정렬을 수행합니다.
- **`createNumberComparer`**: 숫자에 포함된 쉼표(,)를 제거하고 순수 숫자 값으로 비교하여 정확한 정렬을 보장합니다.
### 4-2. 계산 필드 (`Computed Field`)
`dataProvider.setFields` 시 `valueCallback`을 통해 실시간 계산 값을 생성합니다.
- **지원 유형**: 단순 합계(`sum`), 평균(`avg`), 보급률(`pblswrgPopltnSuprtRate`) 등 특수 비즈니스 로직.
- **매커니즘**: `getComputedValueCallback` 유틸을 통해 여러 필드의 값을 조합하여 결과를 반환합니다.
### 4-3. 엑셀 임포트/익스포트 (Smart Mapping)
일반적인 그리드와 달리, 엑셀 파일과 그리드 간의 정확한 필드 매칭을 위해 특수한 기법을 사용합니다.
- **익스포트 시**: 엑셀 헤더 텍스트 뒤에 `(fieldName)`을 임시로 붙여서 내보냅니다. (예: `인구수 (popltnCnt)`)
- **임포트 시**: 정규표현식 `/\(([a-zA-Z0-9_]+)\)$/`을 사용하여 헤더에서 `fieldName`을 추출, 데이터 파싱 시 정확한 객체 키로 매핑합니다.
### 4-4. 푸터(Footer) 및 레이아웃 합병
- **`footerUserSpans`**: `columnLayout` 설정을 통해 푸터 영역에서 여러 셀을 하나로 합치는 기능을 지원합니다.
- **멀티 푸터**: `gridView.setFooters`를 통해 2행 이상의 푸터를 설정하고, 각 행마다 다른 통계(합계, 평균 등)를 보여줍니다.
---
## 5. 자주 사용하는 유틸리티 함수
### `toGridRows<T>`
API 응답 객체 배열을 RealGrid가 처리하기 좋은 형태로 변환합니다.
- `null` 또는 `undefined` 값을 빈 문자열(`""`)로 치환하여 그리드 상에서 `null` 문구가 노출되지 않도록 합니다.
---
## 6. 스타일 가이드 (`styleName`)
그리드 셀에 적용되는 주요 CSS 클래스입니다 (프로젝트 관례).
- `rg-cell-readonly`: 읽기 전용 셀 배경색 처리
- `rg-cell-total`: 합계 행/열 강조
- `rg-cell-error`: 검증 오류 발생 셀 (빨간색 테두리 등)
- `rg-cell-required`: 필수 입력 셀 표시
---
## 7. RealGrid 원천 API 상세 (Native API)
프로젝트 코드(`DataGrid.tsx`, `CompactDataGrid.tsx`)에서 실제로 호출하고 있는 RealGrid의 원천 함수와 속성 목록입니다.
### 7-1. 전역 설정 (`realgrid`)
- **`RealGrid.setLicenseKey(key: string)`**: 라이선스 키를 등록합니다.
- **`ValueType`**: 필드 데이터 타입을 지정하는 열거형 (예: `ValueType.TEXT`, `ValueType.NUMBER`).
- **`GridFitStyle`**: 그리드 너비 맞춤 스타일 (예: `GridFitStyle.EVEN`).
### 7-2. 그리드 뷰 (`GridView`)
그리드의 시각적 요소와 이벤트를 제어합니다.
| API | 설명 |
|-----|-----|
| `setOptions(options)` | 그리드 전역 옵션 설정 (`checkBar.visible`, `summaryMode` 등) |
| `setDisplayOptions(options)` | 화면 표시 상세 설정 (`fitStyle`, `rowHeight` 등) |
| `setFixedOptions(options)` | 고정 컬럼 설정 (`colCount`) |
| `setFooters(heights)` | 멀티 푸터 행들의 높이를 배열로 설정 |
| `setColumns(columns)` | 컬럼 구성을 동적으로 재설정 |
| `setColumnLayout(layout)` | 컬럼의 시각적 배치(그룹 헤더 등) 적용 |
| `setColumnProperty(col, prop, val)` | 특정 컬럼의 속성(예: `renderer`)을 개별 변경 |
| `exportGrid(options)` | 엑셀 파일 내보내기 실행 |
| `setCurrent(index)` | 특정 행/셀로 포커스 이동 (`itemIndex` 사용) |
| `setFocus()` | 그리드 자체에 포커스 부여 |
| `refresh()` | 그리드 화면 강제 다시 그리기 (스타일 변경 시 유용) |
| `columnByName(name)` | 이름으로 특정 컬럼 객체 반환 |
**주요 이벤트 핸들러:**
- `onSorting`: 정렬 시점 발생. (커스텀 그룹 정렬 구현 시 사용)
- `onCellClicked`: 셀 클릭 시 발생. (행 선택 로직 구현)
- `onShowTooltip`: 툴팁 표시 직전 발생. (동적 툴팁 내용 생성)
### 7-3. 데이터 프로바이더 (`LocalDataProvider`)
그리드 내부의 실제 데이터를 관리합니다.
| API | 설명 |
|-----|-----|
| `setFields(fields)` | 데이터 필드(데이터 모델) 구조 정의 |
| `setRows(rows)` | 전체 데이터 로드 |
| `getRowCount()` | 전체 데이터 행 수 반환 |
| `getValue(row, field)` | 특정 행/필드의 데이터 값 조회 |
| `setDataComparer(field, fn)` | 특정 필드의 정렬 로직을 사용자 정의 함수로 위임 |
---
## 8. RealGrid-React 컴포넌트 (`realgrid-react`)
### 8-1. `<RealGridReact />` (메인 컨테이너)
- **`ref`**: 내부 `gridView`와 `dataProvider` 객체에 접근하기 위해 사용.
- **`rows`**: 리액트 상태(`rowData`)를 그리드 데이터와 바인딩.
- **`layout`**: 정의된 `columnLayout`을 적용.
- **`autoGenerateField`**: `true` 설정 시 행 데이터를 바탕으로 필드를 자동 생성.
- **`onInitialized(grid)`**: 그리드 초기화 완료 후 실행되는 콜백.
### 8-2. `<RGDataColumn />` (컬럼 속성 정의)
JSX 형태로 각 컬럼의 세부 속성을 설정합니다.
| 주요 Props | 설명 |
|-----------|-----|
| `name` / `fieldName` | 컬럼/필드 식별자 |
| `valueType` | 데이터 타입 (`TEXT`, `NUMBER`) |
| `numberFormat` | 숫자 표시 형식 (예: `#,##0.000`) |
| `header` | 헤더 설정 객체 (`{ text: "제목" }`) |
| `editable` | 해당 컬럼의 편집 가능 여부 |
| `styleName` | 해당 컬럼에 적용할 CSS 클래스명 |
| `renderer` | 셀 렌더러 설정 (예: `{ showTooltip: true }`) |
| `footer` | 푸터 합계/수식 설정 |
| `mergeRule` | 셀 병합 규칙 (`{ criteria: "value" }`) |
| `sortable` | 정렬 가능 여부 |