jqxGrid 와 JSONPlaceholder - 서버사이드 페이징/필터링
jqxGrid
와 JSONPlaceholder - 서버사이드 페이징/필터링
소개
웹 애플리케이션에서 데이터 그리드는 대량의 데이터를 효율적으로 표시하고 관리하는 데 중요한 요소입니다. 이번 포스트에서는 jqxGrid
를 사용하여 서버에서 데이터를 불러오고, 페이징, 필터링, 정렬 기능을 구현하는 방법에 대해 살펴보겠습니다. 특히 서버 사이드 페이징과 필터링을 적용하는 방법을 간단히 설명하고, 예제 코드를 기반으로 설명을 진행하겠습니다.
jqxGrid란?
jqxGrid
는 데이터 테이블을 쉽게 생성하고 관리할 수 있는 강력한 jQuery 위젯입니다. 페이징, 정렬, 필터링, 그리고 다양한 데이터 소스와의 통합 기능을 제공해 대량의 데이터를 처리할 수 있는 기능을 제공합니다. 오늘은 JSONPlaceholder API에서 데이터를 불러와 서버사이드 페이징 및 필터링을 구현하는 방법을 살펴보겠습니다.
사용 기술 개요
우리가 사용할 기술은 다음과 같습니다:
- jQuery: DOM 요소의 선택 및 조작을 쉽게 해주는 JavaScript 라이브러리.
- jqxGrid: jqWidgets에서 제공하는 고급 데이터 그리드 컴포넌트.
- JSONPlaceholder API: 예제 데이터를 제공하는 간단한 REST API로서, 개발 테스트에 유용합니다.
코드 분석
1. HTML 구조 설정
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
가 표시될 영역입니다.
2. jQuery 및 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 관련 스크립트를 추가하여 그리드가 정상적으로 작동할 수 있도록 설정합니다.
3. 데이터 소스 설정
서버에서 데이터를 받아오기 위한 소스를 설정합니다. 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
: 서버로부터 받은 응답 헤더에서 총 레코드 수를 받아옵니다.
4. 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
: 그리드의 상태를 기반으로 서버에 전달할 페이징 및 필터링 파라미터를 구성합니다.
5. jqxGrid 초기화
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 다운로드
https://www.jqwidgets.com/download/