
jqxGrid 와 JSONPlaceholder - 서버사이드 페이징/필터링
웹 애플리케이션에서 데이터 그리드는 대량의 데이터를 효율적으로 표시하고 관리하는 데 중요한 요소입니다. 이번 포스트에서는 jqxGrid를 사용하여 서버에서 데이터를 불러오고, 페이징, 필터링, 정렬 기능을 구현하는 방법에 대해 살펴보겠습니다. 특히 서버 사이드 페이징과 필터링을 적용하는 방법을 간단히 설명하고, 예제 코드를 기반으로 설명을 진행하겠습니다.
jqxGrid는 데이터 테이블을 쉽게 생성하고 관리할 수 있는 강력한 jQuery 위젯입니다. 페이징, 정렬, 필터링, 그리고 다양한 데이터 소스와의 통합 기능을 제공해 대량의 데이터를 처리할 수 있는 기능을 제공합니다. 오늘은 JSONPlaceholder API에서 데이터를 불러와 서버사이드 페이징 및 필터링을 구현하는 방법을 살펴보겠습니다.
우리가 사용할 기술은 다음과 같습니다:
HTML 파일의 기본 구조는 아래와 같이 설정됩니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Advanced jqxGrid with Server-Side Paging and Filtering</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/12.0.0/jqwidgets/styles/jqx.base.css">
</head>
<body>
<div id="jqxGrid"></div>
</body>
</html>
<div id="jqxGrid"></div>: jqxGrid가 표시될 영역입니다.<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxcore.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.js"></script>
jqxcore.js, jqxgrid.js 등 여러 jqWidgets 관련 스크립트를 추가하여 그리드가 정상적으로 작동할 수 있도록 설정합니다.서버에서 데이터를 받아오기 위한 소스를 설정합니다. JSONPlaceholder API를 사용하여 게시글 데이터를 불러옵니다.
var source = {
datatype: "json",
datafields: [
{ name: 'userId', type: 'number' },
{ name: 'id', type: 'number' },
{ name: 'title', type: 'string' },
{ name: 'body', type: 'string' }
],
url: apiUrl,
root: '',
beforeprocessing: function (data, status, xhr) {
var totalCount = xhr.getResponseHeader('x-total-count');
source.totalrecords = parseInt(totalCount);
},
filter: function () {
$("#jqxGrid").jqxGrid('updatebounddata', 'filter');
},
sort: function () {
$("#jqxGrid").jqxGrid('updatebounddata', 'sort');
}
};
datatype: 데이터를 JSON 형식으로 받습니다.datafields: 받아온 데이터에서 사용할 필드를 정의합니다.url: 데이터를 불러올 API 경로를 지정합니다.beforeprocessing: 서버로부터 받은 응답 헤더에서 총 레코드 수를 받아옵니다.dataAdapter 설정jqxGrid는 dataAdapter를 통해 데이터를 바인딩하고, 데이터 로딩 시 페이징, 필터링 및 정렬을 처리할 수 있습니다.
var dataAdapter = new $.jqx.dataAdapter(source, {
formatData: function (data) {
var grid = $("#jqxGrid");
var paginginfo = grid.jqxGrid('getpaginginformation');
var pagesize = paginginfo.pagesize;
var pagenum = paginginfo.pagenum;
data._start = pagenum * pagesize;
data._limit = pagesize;
var filterinfo = grid.jqxGrid('getfilterinformation');
if (filterinfo.length > 0) {
for (var i = 0; i < filterinfo.length; i++) {
var filterGroup = filterinfo[i].filter;
var filters = filterGroup.getfilters();
var datafield = filterinfo[i].datafield;
var filterValue = filters[0].value;
var filterCondition = filters[0].condition;
if (filterCondition === 'EQUAL') {
data[datafield] = filterValue;
}
}
}
return data;
}
});
formatData: 그리드의 상태를 기반으로 서버에 전달할 페이징 및 필터링 파라미터를 구성합니다.jqxGrid를 초기화하고, 서버 사이드 페이징과 필터링을 설정합니다.
$("#jqxGrid").jqxGrid({
width: '100%',
source: dataAdapter,
sortable: true,
pageable: true,
autoheight: true,
filterable: true,
showfilterrow: true,
virtualmode: true,
rendergridrows: function (params) {
return params.data;
},
pagesize: 10,
pagesizeoptions: ['10', '20', '50'],
columns: [
{ text: 'User ID', datafield: 'userId', width: '10%' },
{ text: 'Post ID', datafield: 'id', width: '10%' },
{ text: 'Title', datafield: 'title', width: '40%' },
{ text: 'Body', datafield: 'body', width: '40%' }
]
});
sortable: 칼럼을 기준으로 정렬을 허용합니다.pageable: 페이징 기능을 활성화합니다.virtualmode: 서버사이드 페이징을 활성화합니다.이 예제에서는 jqxGrid를 사용하여 서버에서 데이터를 가져오고, 페이징 및 필터링, 정렬 기능을 어떻게 적용하는지 살펴보았습니다. 실제로 대규모 데이터를 처리할 때, 서버사이드 페이징 및 필터링을 통해 클라이언트의 부하를 줄일 수 있습니다. jqxGrid는 이러한 기능을 쉽게 구현할 수 있는 도구로, 웹 개발 시 데이터 관리를 효율적으로 할 수 있습니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Advanced jqxGrid with Server-Side Paging and Filtering</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/12.0.0/jqwidgets/styles/jqx.base.css">
<!-- jQuery 및 jqWidgets 관련 스크립트 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxcore.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxdata.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxscrollbar.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxbuttons.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxmenu.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.pager.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.sort.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.selection.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxdropdownlist.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxlistbox.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqwidgets/20.0.0/jqwidgets/jqxgrid.filter.js"></script>
</head>
<body>
<div id="jqxGrid"></div>
<script>
$(document).ready(function () {
var apiUrl = "https://jsonplaceholder.typicode.com/posts";
var source = {
datatype: "json",
datafields: [
{ name: 'userId', type: 'number' },
{ name: 'id', type: 'number' },
{ name: 'title', type: 'string' },
{ name: 'body', type: 'string' }
],
url: apiUrl,
root: '',
beforeprocessing: function (data, status, xhr) {
// 서버로부터 총 레코드 수를 가져옵니다.
var totalCount = xhr.getResponseHeader('x-total-count');
source.totalrecords = parseInt(totalCount);
},
filter: function () {
// 필터 적용 시 데이터 업데이트
$("#jqxGrid").jqxGrid('updatebounddata', 'filter');
},
sort: function () {
// 정렬 적용 시 데이터 업데이트
$("#jqxGrid").jqxGrid('updatebounddata', 'sort');
}
};
var dataAdapter = new $.jqx.dataAdapter(source, {
formatData: function (data) {
// 그리드의 현재 상태를 기반으로 서버에 보낼 파라미터를 구성합니다.
var grid = $("#jqxGrid");
// 여기에서 수정되었습니다.
var paginginfo = grid.jqxGrid('getpaginginformation');
var pagesize = paginginfo.pagesize;
var pagenum = paginginfo.pagenum;
data._start = pagenum * pagesize;
data._limit = pagesize;
// 필터링 파라미터 추가
var filterinfo = grid.jqxGrid('getfilterinformation');
if (filterinfo.length > 0) {
for (var i = 0; i < filterinfo.length; i++) {
var filterGroup = filterinfo[i].filter;
var filters = filterGroup.getfilters();
var datafield = filterinfo[i].datafield;
// 간단한 필터링만 지원되므로 첫 번째 필터만 사용
var filterValue = filters[0].value;
var filterCondition = filters[0].condition;
// JSONPlaceholder는 정확한 일치만 지원하므로 'EQUAL' 조건만 처리
if (filterCondition === 'EQUAL') {
data[datafield] = filterValue;
}
}
}
return data;
},
loadComplete: function (data, status, xhr) {
// 데이터 로드 완료 후 총 레코드 수 업데이트
var totalCount = xhr.getResponseHeader('x-total-count');
source.totalrecords = parseInt(totalCount);
},
loadError: function (xhr, status, error) {
console.log("Data loading failed: " + error);
}
});
// jqxGrid 초기화 및 설정
$("#jqxGrid").jqxGrid({
width: '100%',
source: dataAdapter,
sortable: true,
pageable: true,
autoheight: true,
filterable: true,
showfilterrow: true,
virtualmode: true, // 서버 사이드 페이징을 위해 virtualmode 활성화
rendergridrows: function (params) {
return params.data;
},
pagesize: 10,
pagesizeoptions: ['10', '20', '50'],
columns: [
{ text: 'User ID', datafield: 'userId', width: '10%' },
{ text: 'Post ID', datafield: 'id', width: '10%' },
{ text: 'Title', datafield: 'title', width: '40%' },
{ text: 'Body', datafield: 'body', width: '40%' }
]
});
});
</script>
</body>
</html>
jqwidgets 의 gqxgrid 데모
https://www.jqwidgets.com/jquery-widgets-demo/demos/jqxgrid/index.htm
jqwidgets 의 cdn 경로
https://cdnjs.com/libraries/jqwidgets
jqwidgets - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers
jQWidgets is an advanced jQuery, Angular, React, ASP .NET MVC, Custom Elements and HTML5 UI framework. - Simple. Fast. Reliable. Content delivery at its finest. cdnjs is a free and open-source CDN service trusted by over 12.5% of all websites, serving over
cdnjs.com
jqwidgets 다운로드
https://www.jqwidgets.com/download/
| AG Grid (무료 버전) 33.2.1 버전 with jQuery 3.6.0 (0) | 2025.04.04 |
|---|---|
| 스마트폰에서 canvas로 그려진 이미지를 꾹 눌러 저장 또는 공유하기 (0) | 2024.12.02 |
| jquery select 태그의 option 비활성화 disabled 또는 선택막기 ✔ (3) | 2024.08.15 |
| fullCalendar 의 좌측 시분 hour minute 표기 hh:mm 형태로 변경하기 (0) | 2024.08.15 |
| jsGrid를 이용한 CRUD 웹 애플리케이션 개발 (0) | 2024.06.28 |