게시판에 페이징을 구성할 때 클래스로 미리 만들어 놓고 간단하게 호출해서 사용하곤 했는데, 그렇게 쓰다 보니 점차 불편한 점이 보였다.
- 페이징을 클래스로 만들다 보니 적용후에는 웹서버를 재시작할 필요가 생겼다. 개발서버라면 크게 문제가 되지 않지만 실서버일 경우 함부로 서버를 내릴 수 없다.
- 디자인을 포함하다보니 디자인을 수정하기가 쉽지 않다.
그래서 jsp로 재편을 했다. 다른 라이브러리를 사용할 수 없는 경우가 있을 수도 있어서 JSTL은 사용하지 않았다.
페이징을 구성하기 위해서는 우선 게시물의 총 갯수를 알아야 한다. 그래서 페이지를 나눌 수 있다.
한 페이지에 표시할 목록의 갯수가 필요하고, 페이지를 이동할 수 있도록 현재 페이지 번호가 필요하다.
또 검색을 포함한 경우 페이지를 이동했을때 검색어에 대한 정보도 필요하다.
페이지가 너무 많으면 단락별로 이동이 가능하도록 한 단락에 표시할 수 있는 페이지의 갯수도 필요하다.
[페이징을 위한 변수선언]
<%
String tmpPage = request.getParameter("pageNum");
int pageNum = tmpPage == null || tmpPage.equals("") ? 1 : Integer.parseInt(tmpPage);
int listRow = 10;
int pageRow = 10;
String link = "";
String keyword = request.getParameter("keyword");
String search = request.getParameter("search");
HashMap<String, Object> param = new HashMap<String, Object>();
if(keyword != null && !keyword.equals("")){
param.put("keyword", keyword);
link = "&keyword="+keyword;
}
if(search != null && !search.equals("")){
param.put("search", search);
link = "&search="+search;
}
param.put("offset", (pageNum-1) * listRow);
param.put("limit", listRow);
List memberList = mManager.getMemberList(param);
int total = mManager.getMemberListCount(param);
%>
[페이징 구현부분]
<%
int page_total = (int)Math.ceil((float)total/listRow);
StringBuilder sb_page = new StringBuilder();
String uri = request.getRequestURI();
int co = (int)((float)pageNum/pageRow);
if((pageNum % pageRow) != 0)
co++;
int start_page = ((co-1) * pageRow) + 1;
int end_page = start_page + pageRow - 1;
// 맨처음
sb_page.append("<a href=\""+uri+"?pageNum=1"+link+"\" >첫페이지</a>");
// 이전단락
if(pageNum > pageRow){
int pre = end_page - pageRow;
sb_page.append(" <a href=\""+uri+"?pageNum="+pre+link+"\" class='prev'>이전단락</a>");
}
// 페이지
if(page_total < end_page)
end_page = page_total;
for(int i = start_page; i <= end_page; i++){
if(i == pageNum){
sb_page.append(" <span style=\"color:red;\">"+i+"</span>");
}
else{
sb_page.append(" <a href=\""+uri+"?pageNum="+i+link+"\" class='page_type'>"+i+"</a>");
}
// 마지막 페이지에는 페이지 구분문자('|')를 붙이지 않는다.
if(i != end_page){
//sb_page.append(" | ");
}
}
// 다음단락
if(end_page < page_total){
int next = end_page+1;
sb_page.append(" <a href=\""+uri+"?pageNum="+next+link+"\" class='prev'>다음단락</a>");
}
// 맨마지막
sb_page.append(" <a href=\""+uri+"?pageNum="+page_total+link+"\" >마지막페이지</a>");
// 페이징이 필요한 경우에만 표시
if(start_page <= end_page){
out.println(sb_page.toString());
}
%>
mysql 경우 limit 쿼리를 이용해 페이징을 분리할 수 있는데,
분리가 되는 오프셋은
(pageNum-1) * listRow 로 구할 수 있다.
즉, 현재 페이지가 1이면 오프셋은 0이 되고 1페이지이면 오프셋이 listRow가 된다.