[java] DataTable 사용법(1)
개요
- datatables 는 html 에서의 테이블을 편리하게 생성하고, 유용한 기능들을 제공해주는 라이브러리이다. UI가 그렇게 훌륭한 편은 아니라, 관리자 시스템등의 화면 개발시에 사용하면 도움이 될 것으로 보인다.
스프링 부트 기본 프로그램 작성
- 다른 부분은 생략하고, controller의 요청 처리 부분이다. Records를 List 로 만들어, 응답으로 보낸다.
List<Records> findAll = recordsService.findAll();
DataTable<Records> dataTable = new DataTable<>();
dataTable.setData(findAll);
return ResponseEntity.ok(dataTable);
- DataTable 은 다음과 같이 만들었다. Http Body에 실릴 데이터 구조를 정의한 것이다.
@Data
public class DataTable<T> {
private int draw;
private int start;
private long recordsTotal;
private long recordsFiltered;
private List<T> data;
}
- 아래는 실제 json 형태의 응답 body 메시지이다.
{"draw":0,
"start":0,
"recordsTotal":0,
"recordsFiltered":0,
"data":[{"createDate":"2022-07-07T18:55:26.489","modifiedDate":"2022-07-07T18:55:26.489","id":1,"title":"first0","content":"content0","category":"notice"},{"createDate":"2022-07-07T18:55:26.512","modifiedDate":"2022-07-07T18:55:26.512","id":2,"title":"first1","content":"content1","category":"notice"},
- 아래는 html 코드이다.
<table id="mainTable" width="100%">
<thead id="sql_result_head">
<tr>
<th scope="col">id</th>
<th>category</th>
<th>title</th>
<th>content</th>
<th>createDate</th>
</tr>
</thead>
<tfoot id="sql_result_foot">
<tr>
<th>id</th>
<th>category</th>
<th>title</th>
<th>content</th>
<th>createDate</th>
</tr>
</tfoot>
</table>
- 아래는 javascript 소스코드이다. 페이지가 로딩이 다 된후 실행된다.
$(document).ready(function() {
/*1. datatable 생성 파라미터 객체 정의*/
var dtObj = {
"ajax": {
"url": "/api/records",
"method":"POST", //기본은 GET
"dataSrc": function (response) { // 응답 메시지 처리
var data = response.data; // your data list
var all = [];
for (var i = 0; i < data.length; i++) {
var row = {
rows: response.start + i + 1,
id: data[i].id, // name ... ,
category: data[i].category,
title: data[i].title,
content: data[i].content,
createDate: data[i].createDate
};
all.push(row);
}
return all;
}
},
"columns": [
{ "data": "id"},
{ "data": "category"},
{ "data": "title"},
{ "data": "content"},
{ "data": "createDate"}
]
};
/*2. 페이지 로딩 후, datatable 생성*/
$('#mainTable').DataTable(dtObj);
});
-
지금까지는 전체 데이터를 전부 가져와서 화면에서 페이징 처리를 하는 방식이다. 다음은 서버에서 페이징하여 데이터를 조회하는 방식에 대해 설명하겠다.
-
화면에 페이지 번호를 클릭하면, start 와 legnth 가 파라미터로 넘어간다. start 는 조회할 데이터 순번이고, length 는 한 페이지에 보여줄 데이터 수이다. 100번째 데이터를 10개씩 보여준다고 하면, page 는 10페이지가 된다.
-
Spring Data Jpa 에서는 페이징 처리를 위한 api 를 제공한다.
@PostMapping("/api/records2")
public ResponseEntity<DataTable<Records>> records2(Model model,
@RequestParam("draw") int draw,
@RequestParam("start") int start,
@RequestParam("length") int length){
System.out.println("draw:" + draw + ", start:" + start + ", length: "+length);
int page = start / length; //Calculate page number
Pageable pageable = PageRequest.of(
page,
length,
Sort.by("id").descending()
) ;
Page<Records> responseData = recordsRepository.findAll(pageable);
DataTable<Records> dataTable = new DataTable<>();
dataTable.setData(responseData.getContent());
dataTable.setRecordsTotal(responseData.getTotalElements());
dataTable.setRecordsFiltered(responseData.getTotalElements());
dataTable.setDraw(draw);
dataTable.setStart(start);
return ResponseEntity.ok(dataTable);
}
- 자바스크립트에서는 일부 속성들을 추가로 선언해야 한다. 공식 홈페이지에서는 데이터가 10만개 이상이면 서버사이드로 처리하라고 한다.
$(document).ready(function() {
/*1. datatable 생성 파라미터 객체 정의*/
var dtObj = {
"processing": true,
"serverSide": true, //서버사이드 페이징 사용
"pageLength": 10, // 한 화면에 보여줄 데이터 수
"searching": false,
"info" : true,
"ajax": {
"url": "/api/records2",
"method":"POST",
"data":function(d){
console.log(d);
},
"dataSrc": function (response) {
console.log(response);
var data = response.data; // your data list
var all = [];
for (var i = 0; i < data.length; i++) {
var row = {
rows: response.start + i + 1,
id: data[i].id, // name ... ,
category: data[i].category,
title: '<b>' + data[i].title + '</b>',
content: data[i].content,
createDate: data[i].createDate
};
all.push(row);
}
return all;
}
},
"columns": [
{ "data": "id"},
{ "data": "category"},
{ "data": "title"},
{ "data": "content"},
{ "data": "createDate"}
]
};
/*2. 페이지 로딩 후, datatable 생성*/
$('#mainTable').DataTable(dtObj);
});
Leave a comment