CF coForward Grid Component
Project Collaboration Guide

coForward Grid

데이터 조회와 편집을 위한 고기능 테이블 컴포넌트입니다.

Grid는 대량 데이터를 효율적으로 표시하며 정렬, 필터, 페이징, 컬럼 설정 등 다양한 기능을 제공합니다.

운영 화면과 관리 시스템에서 사용할 수 있도록 높은 확장성과 사용자 설정 기능을 제공합니다.

📊

정렬 및 필터

컬럼 정렬과 조건 검색, 범위 필터를 지원합니다.

📑

페이징

페이지 단위 데이터 조회와 이동을 지원합니다.

📌

컬럼 설정

컬럼 순서 변경, 숨김, 고정 기능을 제공합니다.

☑️

행 선택

전체 선택, 개별 선택 및 선택 데이터 조회를 지원합니다.

↕️

드래그 정렬

행과 컬럼 순서를 드래그로 변경할 수 있습니다.

🧩

그룹 및 고정

그룹 행, 고정 컬럼, 사용자 설정 기능을 제공합니다.

적용 준비

HTML 영역

<div id="gridToolbar"></div>
<div id="gridContainer"></div>
<div id="gridPagination"></div>
요소 용도
gridToolbar 설정 버튼을 자동 생성할 영역
gridContainer 테이블이 렌더링될 영역
gridPagination 페이지 이동 버튼이 렌더링될 영역

클래스 import

import coForward_grid from './Grid.js';

Grid.js 는 기본 export를 사용합니다. 일반 <script> 전역 등록은 코드에서 확인되지 않았습니다.
위치: Grid.js:1909

CSS와 의존성

Grid 스타일은 __grid.scss 에 정의되어 있습니다. 프로젝트의 Sass 빌드에 포함하여 CSS로 컴파일한 후 사용합니다.

다음은 Grid.js 에서 생성되며 __grid.scss 에 스타일이 정의된 주요 CSS 클래스입니다.

CSS 클래스 예 위치
coForward-grid Grid.js:617
coForward-grid-page-navigation Grid.js:125
coForward-grid-setting-button Grid.js:247
coForward-grid-setting-dialog Grid.js:262
coForward-grid-no-data Grid.js:635
coForward-grid-added-row Grid.js:792
coForward-grid-updated-cell Grid.js:922

필수 브라우저 API로는 HTMLElement , <dialog> , CustomEvent 가 사용됩니다. 위치: Grid.js:52-58 , Grid.js:260-351 , Grid.js:665-666

기본 생성과 렌더링

기본 순서

import coForward_grid from './Grid.js';

const container = document.getElementById('gridContainer');

if (!container) {
                                throw new Error('그리드 컨테이너를 찾을 수 없습니다.');
}

const grid = new coForward_grid();

grid.setHeader(header);
grid.setData(rows);
grid.render(container);

권장 호출 순서는 new coForward_grid() setHeader(header) setData(rows) render(container) 입니다.

단계 실제 메서드 위치
인스턴스 생성 new coForward_grid() Grid.js:8 , Grid.js:11
헤더 등록 setHeader(header) Grid.js:211-215
데이터 등록·교체 setData(data) Grid.js:220-239
최초 렌더링 render(container) Grid.js:594-645
같은 컨테이너 재렌더링 render() Grid.js:594-597
tbody만 재렌더링 renderTbody() Grid.js:580-589

컨테이너 연결

setContainer(container) HTMLElement 만 허용합니다. 문자열 선택자나 ID 문자열은 허용하지 않습니다. 잘못된 값이면 콘솔에 오류를 출력합니다.
위치: Grid.js:52-58

grid.setContainer(document.getElementById('gridContainer'));

render(container) 에 컨테이너를 전달하면 내부에서 setContainer(container) 를 호출합니다.
위치: Grid.js:594-597

3-3. 테이블 ID와 클래스

grid.setId('employeeGrid');
grid.setClass('compact-grid');
메서드 설명 위치
setId(id) 생성되는 <table> id 설정 Grid.js:42-44 , Grid.js:615
setClass(className) 생성되는 <table> 에 CSS 클래스 추가 Grid.js:45-47 , Grid.js:618-622

4. 헤더 정의

헤더는 컬럼 객체 배열입니다. setHeader(header) 호출 시 header[].key 를 기준으로 원본 컬럼 순서와 현재 컬럼 순서를 초기화합니다.
위치: Grid.js:211-215

4-1. 기본 스키마

const header = [
                                { key: 'select', caption: '', type: 'check', setting: 'lock' },
                                { key: 'name', caption: '이름', type: 'text', sort: '' },
                                { key: 'department', caption: '부서', type: 'text' },
                                { key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' },
                                { key: 'salary', caption: '급여', type: 'number', format: ',' }
];
속성 필수 설명 위치
key 행 데이터의 셀 key 와 매칭되는 컬럼 키 Grid.js:213-214 , Grid.js:738 , Grid.js:914
caption 권장 헤더 표시 텍스트 Grid.js:698 , Grid.js:724
type 권장 셀 렌더링 방식. 생략 시 일부 코드에서 오류 가능 Grid.js:708-724 , Grid.js:747-748 , Grid.js:949-1091
sort 선택 값이 undefined 가 아니면 정렬 버튼 생성 Grid.js:696-706
sortKey 선택 실제 정렬에 사용할 다른 key Grid.js:1300 , Grid.js:1317-1320
format 선택 date , number , 기본 타입에서 표시 형식 또는 함수 Grid.js:1013-1027 , Grid.js:1043-1061 , Grid.js:1084-1086
function 선택 셀 값을 버튼으로 만들고 클릭 시 콜백 실행 Grid.js:1029-1031 , Grid.js:1064-1065 , Grid.js:1080-1081 , Grid.js:1158-1165
fixed 선택 'left' , 'right' , 'none' 계열 고정 상태 Grid.js:440-461 , Grid.js:1224-1274
display 선택 false 또는 'none' 이면 컬럼 숨김 Grid.js:1198-1207
setting 선택 설정 화면 제어. none , lock , 또는 미지정 Grid.js:363 , Grid.js:383-384 , Grid.js:401
dataset 선택 <th> 에 data 속성 추가 Grid.js:739-744
headerDataset 선택 헤더 내부 요소에 data 속성 추가 Grid.js:728-734
contentDataset 선택 셀 내부 콘텐츠 요소에 data 속성 추가 Grid.js:1094-1099
relKey 선택 체크박스 상태/비활성화 판단에 참조할 셀 key Grid.js:961-977
checkedValue 선택 relKey 값이 배열에 포함되면 체크 Grid.js:963-968
readOnlyValue 선택 relKey 값이 배열에 포함되면 체크박스 비활성화 Grid.js:970-975

주의: makeTableHeader() if(headerItem.type.fixed) 코드가 있어 type 이 완전히 생략되면 오류가 날 수 있습니다. 일반 텍스트 컬럼도 type: 'text' 처럼 문자열을 지정하는 방식을 권장합니다.
위치: Grid.js:747-748

4-2. 지원되는 type

type 동작 위치
text 또는 그 외 문자열 기본 텍스트 셀 Grid.js:1080-1091
check 헤더 전체 선택 체크박스와 행 체크박스 생성 Grid.js:709-717 , Grid.js:949-984
drag 행 드래그 핸들 생성 Grid.js:718-721 , Grid.js:986-990 , Grid.js:1111-1143
html cell.caption 또는 cell.value innerHTML 로 삽입 Grid.js:992-999
htmlElement cell.value HTMLElement 이면 그대로 삽입 Grid.js:1001-1008
date 날짜 형식 처리 Grid.js:1011-1039
number 숫자 형식 처리 Grid.js:1039-1078

보안상 외부 데이터 표시 예제에서는 html 타입을 사용하지 않습니다. 외부 데이터는 기본 텍스트 타입 또는 직접 만든 안전한 HTMLElement htmlElement 타입으로 전달합니다.

5. 행 데이터 구조와 데이터 변경

5-1. 행 데이터 기본 형식

setData(data) 는 행 배열의 배열을 받습니다. 각 행은 셀 객체 배열입니다.
위치: Grid.js:220-239 , Grid.js:874-896

const rows = [
                                [
                                                                { key: 'checked', value: 'EMP-001' },
                                                                { key: 'name', value: '김민수' },
                                                                { key: 'department', value: '개발팀' },
                                                                { key: 'hireDate', value: '2026-07-01' },
                                                                { key: 'salary', value: 4200000 }
                                ],
                                [
                                                                { key: 'checked', value: 'EMP-002' },
                                                                { key: 'name', value: '이서연' },
                                                                { key: 'department', value: '기획팀' },
                                                                { key: 'hireDate', value: '2026-07-03' },
                                                                { key: 'salary', value: 3900000 }
                                ]
];

5-2. 셀 객체 스키마

속성 설명 위치
key 헤더 key 와 매칭되는 셀 키 Grid.js:914 , Grid.js:940
value 실제 값. td.dataset.value 에도 사용 Grid.js:938 , Grid.js:946
caption 표시 텍스트. 없으면 value 사용 Grid.js:946
tooltip 셀 내부 요소의 title 로 사용 Grid.js:955 , Grid.js:998 , Grid.js:1003 , Grid.js:1036 , Grid.js:1074 , Grid.js:1090
dataset 셀 내부 콘텐츠 요소에 data 속성 추가 Grid.js:1100-1106
tag 셀 태그명. 없으면 td Grid.js:916
sub 그룹 서브 행 데이터 Grid.js:825-847

5-3. idx 의 의미

setData(data) 는 행에 { key: 'idx', value: 번호 } 셀이 없으면 자동으로 추가합니다. 자동 번호는 setData() 호출 시 0부터 다시 부여됩니다.
위치: Grid.js:223-232

idx 는 행의 data-sequence , 행 드래그 순서 갱신, setValue(sequence, key, value) , 변경 셀 추적에 사용됩니다.
위치: Grid.js:807 , Grid.js:1137-1141 , Grid.js:1865-1880 , Grid.js:1902-1905

5-4. 데이터 등록, 추가, 삭제, 초기화

작업 메서드 동작 위치
전체 교체 setData(data) data , originalData 를 깊은 복사로 교체하고 페이지를 1로 초기화 Grid.js:220-239
행 추가 addData(newData) 배열 형태 행만 추가, idx 재부여, addRowIdx 기록 후 렌더링 Grid.js:1474-1498
체크 행 삭제 removeCheckedData() 체크된 행을 현재 데이터에서 제거하고 렌더링 Grid.js:1450-1468
단일 행 삭제 removeRow(row) 현재 data 에서 행 제거. 렌더링은 직접 호출 필요 Grid.js:1729-1734
행 참조 삭제 deleteData(rowData) originalData , data 에서 같은 참조 제거. 렌더링은 직접 호출 필요 Grid.js:1501-1504
원본 복원 resetData(isRender) 필터/범위 초기화 후 originalData 로 복원 Grid.js:1856-1863

6. 페이징

6-1. 페이징 활성화

grid.setPagingRows(10);
grid.setPageNavigationContainer(document.getElementById('gridPagination'));
grid.setPageNavigationCount(5);
설정 설명 위치
pagingRows 한 페이지에 표시할 행 수 Grid.js:17 , Grid.js:90-93
pagingRows = 0 페이징을 적용하지 않고 전체 데이터 표시 Grid.js:790-804
page 1부터 시작 Grid.js:19 , Grid.js:63-71 , Grid.js:131-185
setPage(page) 페이지 이동 후 렌더링과 내비게이션 갱신 Grid.js:63-71
pageNavigationCount 한 번에 표시할 페이지 번호 버튼 수 Grid.js:24 , Grid.js:96-99 , Grid.js:151-169

renderPageNavigation() pageNavigationContainer 가 없으면 아무것도 하지 않습니다. totalPage < 1 이면 내비게이션을 만들지 않습니다.
위치: Grid.js:109-119

조건 결과 위치
pageNavigationContainer 없음 페이지 UI 생성 안 함 Grid.js:109-110
totalPage < 1 페이지 UI 생성 안 함 Grid.js:112-114
totalPage <= pageNavigationCount 숫자 버튼만 생성 Grid.js:128-148 , Grid.js:151-169 , Grid.js:171-191
totalPage > pageNavigationCount 처음/이전/다음/마지막 버튼 생성 Grid.js:128-148 , Grid.js:171-191

7. 체크박스와 체크 행 처리

7-1. 체크박스 컬럼 선언

{ key: 'checked', caption: '', type: 'check', setting: 'lock' }

type: 'check' 헤더는 헤더에 전체 선택 체크박스를 만들고, 각 행에는 체크박스를 만듭니다.
위치: Grid.js:709-717 , Grid.js:949-984

행에 checked 셀이 없으면 체크박스 렌더링 중 { key: 'checked', value: false, readOnly: false } 가 추가됩니다.
위치: Grid.js:956-982

7-2. 체크 상태 조회와 설정

메서드 설명 위치
getCheckedData() 체크된 행과 체크된 서브 행 반환 Grid.js:1427-1447
checkData(key, value, isChecked) 조건에 맞는 행의 checked 값을 설정 Grid.js:1409-1424
resetCheckAll() 모든 행의 checked 값을 false로 변경 Grid.js:1589-1599
removeCheckedData() 체크된 행 삭제 후 렌더링 Grid.js:1450-1468

7-3. pagingCheck

setPage(page) 호출 시 pagingCheck true 이면 현재 체크 상태를 기준으로 전체 선택 체크박스 상태만 갱신합니다. false 이면 모든 체크를 초기화합니다.
위치: Grid.js:63-71 , Grid.js:1566-1586 , Grid.js:1589-1599

grid.pagingCheck = true;

7-4. checkRowFix

checkRowFix true 이면 행 체크 시 체크된 <tr> position: sticky top 을 적용해 헤더 아래에 고정합니다. 정렬·필터·페이징 후 고정 상태를 자동으로 재적용하는 전용 로직은 확인되지 않았습니다.
위치: Grid.js:204-206 , Grid.js:1535-1554

grid.setCheckRowFix(true);

8. 정렬과 필터

8-1. 정렬 가능한 컬럼

헤더 객체에 sort 속성을 undefined 가 아닌 값으로 넣으면 헤더 텍스트가 버튼으로 렌더링되고 클릭 정렬이 가능해집니다.

{ key: 'name', caption: '이름', type: 'text', sort: '' }

위치: Grid.js:696-706 , Grid.js:1294-1312

8-2. 초기 정렬 설정

grid.setSort('salary', 'desc');

setSort(key, direction) sortSetting = { key, direction } 을 저장합니다. 실제 적용은 render() 시점에 이루어집니다.
위치: Grid.js:606-611 , Grid.js:1642-1644

정렬 방향은 asc , desc 를 사용합니다. 값이 없으면 asc 가 기본입니다.
위치: Grid.js:1314-1324

8-3. 값 필터

grid.setFilter('department', '개발팀', 'origin', true);
grid.render(container);
메서드 설명 위치
setFilter(key, value, target, exactly) 필터 설정 배열에 추가. 적용은 render() 시점 Grid.js:1656-1660 , Grid.js:599-601
filter(key, value, exactly) 현재 데이터에 즉시 필터 적용 후 렌더링 Grid.js:1666-1672
filterByOriginalData(key, value, exactly) 원본 데이터 기준 필터 결과를 data 에 반영 Grid.js:1674-1676
resetFilter() 필터 설정 초기화 Grid.js:1662-1664
filterByArray(filterArray, dataType) 여러 조건을 모두 만족하는 행 반환 Grid.js:1707-1724

target / dataType 'current' 또는 'origin' 을 사용합니다. value 는 단일 값 또는 배열을 사용할 수 있습니다. exactly = true 면 완전 일치, false includes() 부분 일치를 사용합니다.
위치: Grid.js:1678-1704

주의: setFilter() 내부의 exactly = exactly || true 구현 때문에 false 를 넘겨도 true 로 바뀝니다. 부분 일치를 바로 적용하려면 filter(key, value, false) 또는 filterData() 를 사용해야 합니다.
위치: Grid.js:1656-1660

8-4. 범위 필터

grid.setRange('salary', 3000000, 5000000, 'origin');
grid.render(container);

범위 필터는 헤더 타입이 number 또는 date 인 컬럼에만 적용됩니다.
위치: Grid.js:1754-1819

메서드 설명 위치
setRange(key, min, max, dataType) 범위 설정 배열에 추가. 적용은 render() 시점 Grid.js:1754-1772 , Grid.js:602-604
range(key, min, max, dataType) 즉시 범위 필터 적용 후 렌더링 Grid.js:1778-1783
rangeByOriginalData(key, min, max) 원본 데이터 기준 범위 필터 Grid.js:1785-1787
resetRange() 범위 설정 초기화 Grid.js:1774-1776

9. 그룹과 서브 행

grouping 은 별도 그룹 기준 컬럼을 지정하는 기능이 아니라, 각 행 안의 sub 데이터를 열고 닫는 그룹 컬럼을 추가하는 기능입니다.

grid.setGrouping('close'); // 초기 서브 행 닫힘
grid.setGrouping('open');  // 초기 서브 행 열림
동작 위치
false 그룹 컬럼 없음 Grid.js:29 , Grid.js:681-691 , Grid.js:808-819
'close' 서브 행을 처음에 숨김 Grid.js:830-831
'open' 서브 행을 처음에 표시 Grid.js:830-831

서브 행은 셀 객체의 sub 속성에 행 배열 목록을 넣어 표현합니다.
위치: Grid.js:825-847

[
                                { key: 'name', value: '상위 행' },
                                {
                                                                key: 'children',
                                                                value: '',
                                                                sub: [
                                                                                                [
                                                                                                                                { key: 'name', value: '하위 행 1' },
                                                                                                                                { key: 'department', value: '개발팀' }
                                                                                                ]
                                                                ]
                                }
]

10. 컬럼 표시, 순서, 설정 버튼

10-1. 컬럼 순서

setHeader(header) 호출 시 columnOrderOriginal columnOrder header[].key 배열로 초기화됩니다.
위치: Grid.js:211-215

grid.updateColumnOrder(['checked', 'department', 'name', 'hireDate', 'salary']);
grid.render();

updateColumnOrder(orderArray) 는 전달된 key 순서대로 this.header 를 재정렬합니다.
위치: Grid.js:570-575

10-2. 숨김 컬럼

hiddenColumns 는 컬럼 key 문자열 배열입니다. 설정 화면의 체크박스 해제 시 해당 key가 추가되고, 체크 시 제거됩니다.
위치: Grid.js:545-553 , Grid.js:751-756 , Grid.js:941-945

grid.hiddenColumns = ['salary'];
grid.render(container);

직접 배열을 수정할 수는 있지만, 설정 화면과 동기화가 필요하므로 초기 상태 지정 정도로만 사용하는 것을 권장합니다.

10-3. 설정 버튼 생성 조건

grid.setSettingButtonContainer(document.getElementById('gridToolbar'));
grid.settingButtonCaption = '컬럼 설정';
grid.settingButtonToolTip = '표시 컬럼과 순서를 설정합니다.';
grid.render(container);

settingButtonContainer 가 있고 그 컨테이너의 innerHTML 이 빈 문자열이면 render() 시 설정 버튼을 자동 생성합니다.
위치: Grid.js:642-644

설정 버튼은 button.title settingButtonToolTip 을 적용합니다.
위치: Grid.js:245-255

10-4. 설정 다이얼로그 동작

설정 버튼 클릭 시 showSettingModal() 이 호출됩니다. 현재 구현은 settingType 값을 분기하지 않습니다.

조건 동작 위치
settingButtonContainer 없음 document.body 에 dialog 추가 후 showModal() Grid.js:346-349
settingButtonContainer 있음 컨테이너에 dialog 추가 후 show() inner 클래스 추가 Grid.js:350-351

settingType = 'modal' 은 생성자 기본값으로 존재하지만 실제 코드에서 사용되는 곳은 확인되지 않았습니다. 문서에서는 직접 설정 항목으로 안내하지 않습니다.
위치: Grid.js:38 , 전체 검색 결과 settingType 사용 없음

10-5. 헤더 setting

동작 위치
미지정 표시 여부, 순서, 고정 설정 가능 Grid.js:401-501
'lock' 표시 체크박스 비활성화, 순서/고정 UI 없음 Grid.js:383-384 , Grid.js:401-501
'none' 설정 목록에서 제외 Grid.js:363

11. 셀 표시 형식과 편집성 갱신

11-1. 안전한 표시 방식

외부 데이터를 표시할 때는 기본 텍스트 타입을 사용합니다.

{ key: 'name', caption: '이름', type: 'text' }

기본 타입은 textContent 로 표시합니다.
위치: Grid.js:1084-1088

DOM 요소가 필요하면 htmlElement 타입에 직접 만든 HTMLElement를 전달합니다.

const button = document.createElement('button');
button.type = 'button';
button.textContent = '보기';

const rows = [
                                [
                                                                { key: 'action', value: button }
                                ]
];

위치: Grid.js:1001-1008

11-2. 주의가 필요한 표시 방식

type: 'html' innerHTML 을 사용합니다. 외부 입력값을 그대로 넣는 예제는 사용하지 않습니다.
위치: Grid.js:992-999

format 함수가 문자열을 반환하면 formatElement() 에서 innerHTML 로 삽입합니다. 외부 데이터 기반 문자열을 반환하지 말고, 가능하면 HTMLElement 를 반환합니다.
위치: Grid.js:1146-1155

11-3. 값 변경과 변경 표시

메서드 설명 위치
setValue(sequence, key, value) 원본 데이터에서 idx = sequence 행의 셀 값 변경 Grid.js:1865-1880
setValueByRowData(rowData, columnKey, values) 전달한 행 참조의 셀 값 변경 Grid.js:1883-1899
regUpdateCell(rowIdx, key) 변경 셀을 updateCells 에 기록 Grid.js:1902-1905

변경된 셀은 다음 렌더링 시 coForward-grid-updated-cell 클래스가 붙고, 표시 후 updateCells 에서 제거됩니다.
위치: Grid.js:920-927

추가된 행은 addData() 후 다음 렌더링 시 coForward-grid-added-row 클래스가 붙고, 표시 후 addRowIdx 에서 제거됩니다.
위치: Grid.js:791-793 , Grid.js:1474-1498

변경 정보를 별도로 조회하거나 초기화하는 공개 메서드는 확인되지 않았습니다. 개발 담당자 확인 필요.

12. 이벤트

12-1. 렌더 완료 이벤트

makeTbody() 끝에서 fireRenderEvent() 가 호출됩니다. 렌더 완료 시 다음 이벤트가 발생합니다.

대상 이벤트명 detail 위치
window coForwardGridRendered 테이블 상태 정보 Grid.js:648-666
container render 테이블 상태 정보 Grid.js:648-666

detail 에는 id , columnOrder , hiddenColumns , sortSetting , filterSetting , rangeSetting , 원본/현재 행 수, 현재 페이지, 전체 페이지, 시작/끝 인덱스가 포함됩니다.
위치: Grid.js:648-663

12-2. 체크 이벤트

대상 이벤트명 발생 시점 detail 위치
container coForwardGridCheckedData 헤더 전체 선택 체크박스 클릭 체크된 행 배열 Grid.js:1356-1372
container checkRow 개별 행 체크박스 클릭 { checked, data } Grid.js:1511-1560

13. 오류 처리와 주의사항

상황 처리 위치
컨테이너가 HTMLElement가 아님 console.error('유효한 HTML 요소가 아닙니다.') Grid.js:52-58
render() 전에 컨테이너 없음 별도 방어 코드 없음. this.container.innerHTML 에서 오류 가능 Grid.js:630
데이터 없음 coForward-grid-no-data 문구 표시 Grid.js:633-638
행 데이터 형식 오류 console.error('Invalid row data:', row) Grid.js:1492
추가 데이터 형식 오류 console.error('Invalid data format:', newData) Grid.js:1496
범위 필터 min/max 누락 콘솔 오류 후 중단 Grid.js:1754-1758
범위 필터 min > max 콘솔 오류 후 중단 Grid.js:1760-1762
범위 필터 타입 오류 콘솔 오류 후 중단 Grid.js:1764-1769
범위 필터 대상 컬럼 타입 오류 콘솔 오류 후 중단 Grid.js:1794-1799
setValue() 의 잘못된 idx/key 콘솔 오류 후 중단 Grid.js:1865-1875
setValueByRowData() 의 잘못된 행/key 콘솔 오류 후 중단 Grid.js:1883-1894

보안 주의: noDataMessage innerHTML 에 들어갑니다. 사용자 입력을 그대로 넣지 않습니다.
위치: Grid.js:636

14. 최소 예제

HTML

<div id="gridContainer"></div>

<script type="module" src="./grid-basic.js"></script>

JavaScript

import coForward_grid from './Grid.js';

const container = document.getElementById('gridContainer');

if (!container) {
                                throw new Error('그리드 컨테이너를 찾을 수 없습니다.');
}

const header = [
                                { key: 'name', caption: '이름', type: 'text' },
                                { key: 'department', caption: '부서', type: 'text' },
                                { key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' }
];

const rows = [
                                [
                                                                { key: 'name', value: '김민수' },
                                                                { key: 'department', value: '개발팀' },
                                                                { key: 'hireDate', value: '2026-07-01' }
                                ],
                                [
                                                                { key: 'name', value: '이서연' },
                                                                { key: 'department', value: '기획팀' },
                                                                { key: 'hireDate', value: '2026-07-03' }
                                ]
];

const grid = new coForward_grid();

grid.setHeader(header);
grid.setData(rows);
grid.render(container);

15. 통합 예제

아래 예제는 페이징, 설정 버튼, 체크박스, 정렬, 필터, 값 변경을 포함합니다.

HTML

<div id="gridToolbar"></div>
<div id="gridContainer"></div>
<div id="gridPagination"></div>
<button id="showChecked" type="button">체크 행 확인</button>
<button id="filterDev" type="button">개발팀만 보기</button>
<button id="resetData" type="button">초기화</button>
<button id="updateFirst" type="button">첫 행 이름 변경</button>

<script type="module" src="./grid-page.js"></script>

JavaScript

import coForward_grid from './Grid.js';

const toolbar = document.getElementById('gridToolbar');
const container = document.getElementById('gridContainer');
const pagination = document.getElementById('gridPagination');

if (!toolbar || !container || !pagination) {
                                throw new Error('그리드 적용에 필요한 HTML 요소가 없습니다.');
}

const header = [
                                { key: 'checked', caption: '', type: 'check', setting: 'lock' },
                                { key: 'name', caption: '이름', type: 'text', sort: '' },
                                { key: 'department', caption: '부서', type: 'text' },
                                { key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' },
                                { key: 'salary', caption: '급여', type: 'number', format: ',' }
];

const rows = [
                                [
                                                                { key: 'select', value: 'EMP-001' },
                                                                { key: 'name', value: '김민수' },
                                                                { key: 'department', value: '개발팀' },
                                                                { key: 'hireDate', value: '2026-07-01' },
                                                                { key: 'salary', value: 4200000 }
                                ],
                                [
                                                                { key: 'select', value: 'EMP-002' },
                                                                { key: 'name', value: '이서연' },
                                                                { key: 'department', value: '기획팀' },
                                                                { key: 'hireDate', value: '2026-07-03' },
                                                                { key: 'salary', value: 3900000 }
                                ],
                                [
                                                                { key: 'select', value: 'EMP-003' },
                                                                { key: 'name', value: '박지훈' },
                                                                { key: 'department', value: '개발팀' },
                                                                { key: 'hireDate', value: '2026-07-05' },
                                                                { key: 'salary', value: 5100000 }
                                ]
];

const grid = new coForward_grid();

grid.setId('employeeGrid');
grid.setClass('employee-grid');
grid.setHeader(header);
grid.setData(rows);
grid.setPagingRows(2);
grid.setPageNavigationContainer(pagination);
grid.setPageNavigationCount(5);
grid.setSettingButtonContainer(toolbar);
grid.settingButtonCaption = '컬럼 설정';
grid.settingButtonToolTip = '표시 컬럼과 순서를 설정합니다.';
grid.pagingCheck = true;
grid.setCheckRowFix(true);
grid.render(container);

container.addEventListener('checkRow', (event) => {
                                console.log('체크 행:', event.detail);
});

container.addEventListener('render', (event) => {
                                console.log('렌더 완료:', event.detail);
});

document.getElementById('showChecked').addEventListener('click', () => {
                                console.log('체크된 데이터:', grid.getCheckedData());
});

document.getElementById('filterDev').addEventListener('click', () => {
                                grid.filterByOriginalData('department', '개발팀');
                                grid.setPagingRows(2);
                                grid.render();
});

document.getElementById('resetData').addEventListener('click', () => {
                                grid.resetData(true);
});

document.getElementById('updateFirst').addEventListener('click', () => {
                                grid.setValue(0, 'name', '김민수 수정');
                                grid.resetData(true);
});

통합 예제 실행 화면

정렬, 필터, 체크, 페이징, 컬럼 표시와 데이터 수정을 직접 확인할 수 있습니다.

LIVE DEMO
직원 목록 전체 0건

16. API 요약

사용자 설정 메서드

메서드 인자 반환값 설명 위치
setId id 없음 table id 설정 Grid.js:42-44
setClass className 없음 table class 추가 Grid.js:45-47
setContainer HTMLElement 없음 렌더링 컨테이너 설정 Grid.js:52-58
setHeader header 없음 헤더 등록 및 컬럼 순서 초기화 Grid.js:211-215
setData data 없음 데이터 교체 및 idx 자동 보정 Grid.js:220-239
render container? 없음 전체 테이블 렌더링 Grid.js:594-645
renderTbody 없음 없음 tbody 재생성 Grid.js:580-589
setPagingRows pagingRows 없음 페이지 행 수 설정 Grid.js:90-93
setPage page 없음 페이지 이동 Grid.js:63-71
setPageNavigationContainer HTMLElement 없음 페이지 UI 영역 지정 Grid.js:101-104
setPageNavigationCount number 없음 표시 페이지 버튼 수 설정 Grid.js:96-99
setSettingButtonContainer HTMLElement 없음 설정 버튼 영역 지정 Grid.js:105-107
setCheckRowFix boolean 없음 체크 행 sticky 고정 사용 여부 Grid.js:204-206
setGrouping false/open/close 없음 서브 행 그룹 UI 설정 Grid.js:78-80
setNoDataMessage string 없음 데이터 없음 문구 설정 Grid.js:82-84

데이터 조회·변경 메서드

메서드 설명 위치
getData(key, value, isOrigial=false) 조건에 맞는 행 배열 반환 Grid.js:1377-1383
getDataByArray(keyValueArray, isOrigial=false) 여러 조건을 모두 만족하는 행 배열 반환 Grid.js:1392-1404
rowsByValue(key, value, dataType='origin') 값 기준 행 조회 Grid.js:1737-1750
getColumnData(columnName, isUnique) 원본 데이터의 컬럼 값 배열 반환 Grid.js:1826-1850
addData(newData) 행 추가 후 렌더링 Grid.js:1474-1498
removeRow(row) 현재 데이터에서 행 제거 Grid.js:1729-1734
deleteData(rowData) 원본/현재 데이터에서 같은 참조 제거 Grid.js:1501-1504
resetData(isRender) 원본 데이터로 복원 Grid.js:1856-1863
setValue(sequence, key, value) idx 기준 셀 값 변경 Grid.js:1865-1880
setValueByRowData(rowData, columnKey, values) 행 참조 기준 셀 값 변경 Grid.js:1883-1899

정렬·필터 메서드

메서드 설명 위치
setSort(key, direction) 초기 정렬 설정 저장 Grid.js:1642-1644
sortDataByKey(sortObject) 데이터 정렬 후 반환 Grid.js:1314-1349
setFilter(key, value, target, exactly) 렌더 시 적용할 필터 추가 Grid.js:1656-1660
filter(key, value, exactly=true) 현재 데이터 즉시 필터 Grid.js:1666-1672
filterByOriginalData(key, value, exactly=true) 원본 데이터 기준 필터 Grid.js:1674-1676
resetFilter() 필터 설정 초기화 Grid.js:1662-1664
setRange(key, min, max, dataType) 렌더 시 적용할 범위 필터 추가 Grid.js:1754-1772
range(key, min, max, dataType) 즉시 범위 필터 Grid.js:1778-1783
rangeByOriginalData(key, min, max) 원본 기준 범위 필터 Grid.js:1785-1787
resetRange() 범위 필터 초기화 Grid.js:1774-1776

17. 부록: 내부 상태

다음 속성은 코드에서 내부 상태로 사용됩니다. 화면 상태와 데이터 상태가 어긋날 수 있으므로 직접 수정하지 않는 것을 권장합니다.

속성 기본값 의미 위치
data [] 현재 표시·가공 데이터 Grid.js:9 , Grid.js:233
originalData [] 원본 데이터 Grid.js:10 , Grid.js:234
container null 렌더링 컨테이너 Grid.js:15
page 1 현재 페이지 Grid.js:19
totalPage 0 전체 페이지 수 Grid.js:20
startIndex 0 현재 페이지 시작 인덱스 Grid.js:21
endIndex 0 현재 페이지 끝 인덱스 Grid.js:22
pageNavigation null 생성된 페이지 UI 참조 Grid.js:24 , Grid.js:193
isRendered false 렌더링 완료 여부 Grid.js:31 , Grid.js:640
columnOrder [] 현재 컬럼 key 순서 Grid.js:32 , Grid.js:213-214
columnOrderOriginal [] 최초 컬럼 key 순서 Grid.js:33 , Grid.js:213
sortSetting false 현재 정렬 설정 Grid.js:34 , Grid.js:1314-1323
filterSetting [] 렌더 시 적용할 필터 설정 Grid.js:35 , Grid.js:599-601
rangeSetting [] 렌더 시 적용할 범위 설정 Grid.js:36 , Grid.js:602-604
hiddenColumns [] 숨긴 컬럼 key 목록 Grid.js:37 , Grid.js:545-553
settingType 'modal' 생성자에 있으나 실제 분기 사용 없음 Grid.js:38
addRowIdx [] 추가 행 표시용 idx 목록 Grid.js:39 , Grid.js:791-793 , Grid.js:1489
updateCells {} 변경 셀 표시용 상태 Grid.js:40 , Grid.js:920-927 , Grid.js:1902-1905

© team coForward