๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด 10, 20๊ฐ ๊น์ง๋ ํ ํ๋ฉด์์ ํ์ธํ๊ธฐ๊ฐ ํธํ์ง๋ง
๋ง์ฝ 30๋ง๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ํ ํ์ด์ง์ ๋ด์ ๊ฒฝ์ฐ ํ ๋์ ๋ณด๊ธฐ๋ ์ด๋ ต๊ณ , ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๋ถ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
์ด๋ด ๋ Paging์ ์ฌ์ฉํ๋ฉด ํน์ ๊ฐ์๋งํผ์ ํ์ด์ง๋ฅผ ๋๋์ด ๋ณด์ฌ์ค ์ ์๋ค.
ํ์ด์ง์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ์ค๋น๋์๋ค๋ฉด ์ด์ DB์์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ๊ฐ์๋งํผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฌธ์ ๋จผ์ ์ดํด๋ณด์
select * from bbs limit 0, 5;select * from bbs limit 5 offset 0;ํ์ด์ง์ ํ๊ธฐ ์ํด์๋
SELECT COUNT(idx) AS pages FROM bbs;SELECT ceil(COUNT(idx)/20) AS pages FROM bbs;html
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="css/common.css" type="text/css">
<!-- ํ์ด์ง ์ฌ์ฉ์ ์ํ ์ค์ -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"></script>
<script src="js/jquery.twbsPagination.js" type="text/javascript"></script>
</head>
<body>
<button onclick="location.href='writeForm'">๊ธ์ฐ๊ธฐ</button>
<table>
<thead>
<tr>
<th>๊ธ๋ฒํธ</th><th>์ ๋ชฉ</th><th>์์ฑ์</th><th>์กฐํ์</th><th>์์ฑ์ผ</th><th>์ญ์ </th>
</tr>
</thead>
<tbody id="list"></tbody>
<!-- ํ์ด์ง์ด ๊ทธ๋ ค์ง ๊ณณ -->
<tr>
<th colspan="6">
<!-- ํ์ด์ง ์ฌ์ฉ์ ์ํ ์ค์ -->
<div class="container">
<nav aria-label="Page navigation">
<ul class="pagination" id="pagination"></ul>
</nav>
</div>
</th>
</tr>
</table>
</body>
</html>
java script
<script>
var showPage = 1; // ๊ธฐ๋ณธ ํ์ด์ง
pageCall(showPage);
function pageCall(page){
$.ajax({
type: 'GET',
url: 'list.ajax',
data: {
'page' : page, // ๋ชํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๊ฑด์ง
'cnt' : 20, // ํ์ด์ง ๋น ๋ณด์ฌ์ค ๊ฒ์๋ฌผ ์
},dataType: 'json',
success: function(data) {
listPrint(data.list);
// ํ์ด์ง ํ๋ฌ๊ทธ์ธ ์ฒ๋ฆฌ
$('#pagination').twbsPagination({ // twbsPagination() ํจ์ ์คํ
startPage: 1, // ํ์ฌ ํ์ด์ง (์์ํ ํ์ด์ง)
totalPages: data.totalPage, // ์ต๋ ํ์ด์ง ์
visiblePages: 5, // ๋ณด์ฌ์ค ํ์ด์ง ์
onPageClick: function(evt, page){
console.log('evt',evt); // ํด๋ฆญ ์ด๋ฒคํธ์ ๋ชจ๋ ๋ด์ฉ
console.log('page',page); // ํด๋ฆญํ ํ์ด์ง ๋ฒํธ
pageCall(page); // ๋ช ๋ฒ ํ์ด์ง์ธ์ง ์๋ฒ์ ์ ๋ณด ์ ๋ฌ
}
});
},error: function(e){
console.log(e);
}
});
}
// ๋ฆฌ์คํธ๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์
function listPrint(list){
var content = '';
for (var item of list) {
content += '<tr>';
content += '<td>'+item.idx+'</td>';
content += '<td>'+item.subject+'</td>';
content += '<td>'+item.user_name+'</td>';
content += '<td>'+item.bHit+'</td>';
content += '<td>'+item.reg_date+'</td>';
content += '<td><a hrdf="#">์ญ์ </a></td>';
content += '</tr>';
}
$('#list').html(content);
}
</script>
showPage)pageCall() ํจ์ ์คํ (ํ์ด์ง ๋ฒํธ๋ 1๋ฒ)page) โก ํ์ด์ง ๋น ๋ณด์ฌ์ค ๊ฒ์๋ฌผ ์ (cnt) ๋ฅผ ์ค์ ํ๋ค.listPrint(data.list) ๋ก DB์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ค.pageCall(page) : ํ์ฌ ํ์ด์ง ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ผ๋ฏ๋ก, ํด๋น ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ๋ฌํ๋ค.@GetMapping(value="/list.ajax")
@ResponseBody
public Map<String, Object> list(String page, String cnt) {
int page_ = Integer.parseInt(page);
int cnt_ = Integer.parseInt(cnt);
return service.list(page_, cnt_);
}
public Map<String, Object> list(int page, int cnt) {
int limit = cnt; // ํ์ด์ง ๋น ๋ณด์ฌ์ค ๊ฒ์๋ฌผ ์
int offset = (page-1) * cnt; // ๋ช ๋ฒ ๊ฒ์๋ฌผ ๋ถํฐ ์์ํ ๊ฒ์ธ์ง ์ง์
int totalPages = dto.allCount(cnt);
Map<String, Object> result = new HashMap<String, Object>();
result.put("totalPage", totalPages); // ์ด ํ์ด์ง ์
// ๋์ค์ ํ์ํ ์๋ ์์ผ๋๊น ๋ง๋ค์ด์ค๋ค. (ํ์ฌ ํ์ x)
result.put("currPage", page); // ํ์ฌ ํ์ด์ง
result.put("list", dto.list(limit, offset));
return result;
}
20๊ฐ ์ฉ ๊ฒ์๋ฌผ์ ๋ณด์ฌ์ค ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ฌธ์ select * from bbs limit 20 offset 0; ์ด ๋๊ณ 2 ํ์ด์ง๋ก ๋์ด๊ฐ ๊ฒฝ์ฐ select * from bbs limit 20 offset 20; ๊ฐ ๋ ๊ฒ์ด๋ค.
โผ
๊ทธ๋ ๋ค๋ฉด ๋ณด์ฌ์ค ํ์ด์ง ์๋ ๊ณ์ ๋์ผํ๊ฒ ์ ์ง๋๊ณ ์์๋๋ ๋ฒํธ๋ 20 ์ฉ ์ฆ๊ฐํ๋ค.
โผ
์ธ๋ฑ์ค๋ 0 ๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ํ์ด์ง์ (page = 1) ์์ -1 ์ ํด์ฃผ๊ณ ๋ณด์ฌ์ค ํ์ด์ง ์ (cnt = 20) ์ ๊ณฑํด์ฃผ๋ ๊ฒ์ผ๋ก limit ์ offset ์ ์ง์ ํด์ค๋ค.
.allCount() ํจ์๋ฅผ ์คํํด ๊ฒฐ๊ณผ๊ฐ์ ๋ณ์์ ๋ด์์ค๋ค. (์ด ํ์ด์ง ์ / 20 ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ค์ด๊ฐ๋ค.)DTO
int allCount(int cnt);
mapper
<select id="allCount">
SELECT CEIL(COUNT(idx)/#{param1}) AS pages FROM bbs
</select>
์ด๋ ๊ฒ ์์ฑํด์ฃผ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.

๊ฒ์ํ์ ๋ณด๋ค๋ณด๋ฉด 5, 10, 15, 20 ๋ฑ ๋ค์ํ ๊ธฐ์ค์ผ๋ก ๊ฒ์๊ธ์ ๋ณผ ์ ์๋ค.
์์์ ๋ง๋ paging์ ๋ณด์ฌ์ค ํ์ด์ง๊ฐ 20 ์ผ๋ก๋ง ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ์ผ๋ก ์์ง์ผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ์ํ๋ ์ซ์๋งํผ ๊ฒ์๊ธ์ ๋ณผ ์ ์๊ฒ ํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์!
<body>
<button onclick="location.href='writeForm'">๊ธ์ฐ๊ธฐ</button>
<select id="pagePerNum" >
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20" selected>20</option>
</select>
๊ฐ ์ฉ ๋ณด๊ธฐ
<table>
<thead>
<tr>
<th>๊ธ๋ฒํธ</th>
<th>์ ๋ชฉ</th>
<th>์์ฑ์</th>
<th>์กฐํ์</th>
<th>์์ฑ์ผ</th>
<th>์ญ์ </th>
</tr>
</thead>
<tbody id="list">
</tbody>
<tr>
<th colspan="6">
<div class="container">
<nav aria-label="Page navigation">
<ul class="pagination" id="pagination"></ul>
</nav>
</div>
</th>
</tr>
</table>
</body>
<script>
var show = 1;
pageCall(show);
$('#pagePerNum').change(function(){
$('#pagination').twbsPagination('destroy');
pageCall(show);
});
function pageCall(page) {
$.ajax({
type:'GET',
url:'list.ajax',
data:{
'page':page,
'cnt': $('#pagePerNum').val(),
},
datatype:'JSON',
success:function(data){
console.log(data);
drawList(data.list)
$('#pagination').twbsPagination({ // ํ์ด์ง ๊ฐ์ฒด ๋ง๋ค๊ธฐ
startPage:1,
totalPages:data.totalPages,
visiblePages:5,
onPageClick:function(evt,page){
console.log('evt',evt);
console.log('page',page);
pageCall(page);
}
});
},
error:function(e){
console.log(e);
}
});
}
function drawList(list) {
var content ='';
list.forEach(function(view,idx){
content +='<tr>';
content +='<td>'+view.idx+'</td>';
content +='<td><a href="detail.go?idx='+view.idx+'">'+view.subject+'</a></td>';
content +='<td>'+view.user_name+'</td>';
content +='<td>'+view.bHit+'</td>';
content +='<td>'+view.reg_date+'</td>';
content +='<td><a href="del?idx='+view.idx+'">์ญ์ </a></td>';
content +='</tr>';
});
$('#list').html(content);
}
</script>
์๋ฒ์์ DB์ ์๋ ์ฟผ๋ฆฌ์ ์ด ๋ฐ์ดํฐ ์ / ๋ณด์ฌ์ค ๋ฐ์ดํฐ ์ ๋ฅผ ํด์ ์ด ํ์ด์ง ์๋ฅผ ๋ฐ์์ ๋ฃ์ด์ค๋ค.
select ์ change ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด destroy ๋ฅผ ํด์ค๋ค.
โถ ๊ธฐ์กด์ ์๋ ํ์ด์ง์ ํ๊ดดํ๋ค.
๋ณด์ฌ์ค ํ์ด์ง๋ select ์์ ๋ฐ์์จ ๊ฐ์ ๋ฃ์ด์ค๋ค.
ํ์ฌ๋ ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ฐ์ ๋ก 1๋ฒ ํ์ด์ง๋ก ์ด๋ํ๋๋ฐ, ๋ง์ฝ ๋ง์ง๋ง ํ์ด์ง๋ก ์ด๋ํ๊ณ ์ถ๋ค๋ฉด ์ต๋ ํ์ด์ง ์๋ฅผ page ์ ์ฃผ๋ฉด ๋๋ค.
@RequestMapping("/list.ajax")
@ResponseBody
public Map<String, Object> list(String page,String cnt){
int page_ = Integer.parseInt(page);
int cnt_ = Integer.parseInt(cnt);
return ser.list(page_, cnt_);
}
public Map<String, Object> list(int page, int cnt) {
int limit = cnt;
int offset = (page-1) * cnt;
int totalpage = dao.count(cnt);
Map<String, Object> result = new HashMap<String, Object>();
result.put("totalPages", totalpage);
result.put("currPage", page);
result.put("list",dao.list(limit,offset));
return result;
}
List<BoardDTO> list(int limit, int offset);
<select id="list" resultType="kr.co.gudi.dto.BoardDTO">
SELECT idx,subject,user_name,bHit,reg_date FROM bbs
ORDER BY idx DESC LIMIT #{param1} OFFSET #{param2}
</select>
<select id="count" resultType="int">
SELECT CEIL(COUNT(idx)/#{param1}) AS pages FROM bbs
</select>
limit ์ offset ์ ๋ณด๋ด์ค ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ ์ ํด์ค๋ค.์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฌ์ฉ์์ ์ ํ์ ๋ฐ๋ผ ๋ณด์ฌ์ฃผ๋ ๋ฐ์ดํฐ ์๊ฐ ๊ฒฐ์ ๋๋ ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๋ค!