bboks.net™

JSP 페이징 로직 본문

Java/JSP | Servlet

JSP 페이징 로직

bboks.net 2011. 2. 15. 15:26

총 데이터 수가 37개인 데이터를 페이징 처리 해보자.

데이터는 DB에서 가져오거나 xml파일을 읽어올 것이다.

페이지를 3 페이지씩 보여줄 수도 있고 [1] [2] [3] [다음]

혹은 10페이지씩 보여줄 수도 있다. [1] [2] [3] [4] [5] ...[10] [다음]

값 셋팅에 따라 달라질 수 있도록 페이지그룹 사이즈(pageGroupSize) 변수를 사용하겠다.

셋팅할 수 있는 값이 페이지그룹 사이즈 말고 또 무엇이 있을까?

한 페이지 당 보여주는 리스트 갯수도 변할 가능성이 많다.

이것은 페이지 사이즈(pageSize) 변수로 놓자.

그러면, 페이징 로직의 결과를 예측하기 위해서 이 두개의 변수에 값을 넣어보자.


총 데이터 갯수 (count): 37
페이지그룹 사이즈 (페이지그룹을 몇개씩 묶을 것인가) : 3
페이지 사이즈 (한 페이지 당 리스트 갯수): 4

이렇게 셋팅을 할 경우, 나오는 결과는?

총 페이지 수(pageCount)는 37 / 4 = 9.25 니까 10 페이지 되겠다.

pageCount = (count / pageSize ) + ( count % pageSize == 0 ? 0 : 1); 
=> count % pageSize == 0 ? 0 : 1 이 수식을 풀어서 쓰면

            if(count % pageSize == 0)
                return 0;
            else
                return 1;

이렇게 표현된다.

=============================================================================
                                                [1][2][3]   [4][5][6]   [7][8][9]   [10]
페이지그룹넘버(numPageGroup) :   - 1 -           - 2 -           - 3 -      - 4 -
=============================================================================
 
페이지 그룹은 위와같이 총 4개로 나올 것이다. (pageGroupCount : 4)

이 페이지 그룹을 본 후, 현재페이지가 호출될 경우를 생각해보면

5페이지가 호출된다면 numPageGroup이 2인 상태로 페이지바가 보여질 것이다.

그렇다면, 호출된 현재페이지를 가지고 페이지그룹넘버를 구하고,

페이지그룹넘버값으로 페이지바의 첫번째 페이지를 계산해보자.

numPageGroup = 올림(currentPage/pageGroupSize)
=> int numPageGroup = (int) Meth.ceil ((double)currentPage/pageGroupSize)                   
=> numPageGroup : 올림(5/3) = 2

startPage = (numPageGroup - 1)*pageGroupSize + 1; 
=> stratPage : (2-1)*3+1 = 4

이제 시작페이지를 가지고 마지막 페이지도 구해보자
endPage = startPage + pageGroupSize -1 => 4+3-1 = 6

이런식으로 시작페이지와 마지막페이지를 구했다면, for문을 돌려서 페이지바를 출력할 수 있을 것이다.
그런데, 마지막 페이지그룹을 위 공식대로 계산하면 endPage가 12페이지가 나온다.
총 페이지수가 10개인데 12페이지까지 출력되면 안 될것이다.
따라서, if문 처리를 추가해주자.
if( 마지막페이지 > 총페이지 )
  마지막페이지 = 총 페이지    => endPage = 10


자바 클래스
// 한 페이지 당 보여줄 글 갯수
private final static int pageSize = 4;

// 페이지그룹안의 페이지 갯수
//ex) [이전] 1 2 3 4 5 [다음] 일 경우 페이지 갯수는 5
private final static int pageGroupSize = 3;

//페이지 번호
String pageNum = request.getParameter("pageNum");

if (pageNum == null) {
	pageNum = "1";
}

int currentPage = Integer.parseInt(pageNum);
//한 페이지의 시작글 번호
int startRow = (currentPage - 1) * pageSize + 1;
//한 페이지의 마지막 글번호
int endRow = currentPage * pageSize;
int count = 0;
int number = 0;

ArrayList articleList = new ArrayList();
BoardDAO dbPro = BoardDAO.getInstance();// DB연동
count = dbPro.getTotalCnt();// 전체 글의 수

if (count > 0) {
	if (endRow > count) {
		endRow = count;
	}
	
	// 현재 페이지에 해당하는 글 목록
	articleList = dbPro.select(startRow, endRow);

} else {
	articleList = null;
}

//글목록에 표시할 글번호
number = count - (currentPage - 1) * pageSize;

// 페이지그룹의 갯수
// ex) pageGroupSize가 3일 경우
//'[1][2][3]'가 pageGroupCount 개 만큼 있다.
int pageGroupCount = 
	count / (pageSize * pageGroupSize) + 
	(count % (pageSize * pageGroupSize) == 0 ? 0 : 1);
// 페이지 그룹 번호
// ex) pageGroupSize가 3일 경우
//'[1][2][3]'의 페이지그룹번호는 1 이고 '[2][3][4]'의
// 페이지그룹번호는 2 이다.
int numPageGroup = (int) Math
		.ceil((double) currentPage / pageGroupSize);

// 해당 뷰에서 사용할 속성
request.setAttribute("currentPage", new Integer(currentPage));
request.setAttribute("startRow", new Integer(startRow));
request.setAttribute("endRow", new Integer(endRow));
request.setAttribute("count", new Integer(count));
request.setAttribute("pageSize", new Integer(pageSize));

request.setAttribute("number", new Integer(number));
request.setAttribute("pageGroupSize", new Integer(pageGroupSize));
request.setAttribute("numPageGroup", new Integer(numPageGroup));
request.setAttribute("pageGroupCount", new Integer(pageGroupCount));
request.setAttribute("articleList", articleList);

return "./list.jsp";// 해당 뷰

JSP 부분
<c:if test="${count > 0}">
 <c:set var="pageCount"
  value="${count / pageSize + ( count % pageSize == 0 ? 0 : 1)}" />
 <c:set var="startPage" value="${pageGroupSize*(numPageGroup-1)+1}" />
 <c:set var="endPage" value="${startPage + pageGroupSize-1}" />

 <c:if test="${endPage > pageCount}">
  <c:set var="endPage" value="${pageCount}" />
 </c:if>

 <c:if test="${numPageGroup > 1}">
  <a href="./list.do?pageNum=${(numPageGroup-2)*pageGroupSize+1 }">[이전]</a>
 </c:if>

 <c:forEach var="i" begin="${startPage}" end="${endPage}">
  <a href="list.do?pageNum=${i}">[
   <font color="#000000">
   <c:if test="${currentPage == i}"></c:if> ${i} </font>] </a>
 </c:forEach>
 
 <c:if test="${numPageGroup < pageGroupCount}">
  <a href="./list.do?pageNum=${numPageGroup*pageGroupSize+1}">[다음]</a>
 </c:if>
</c:if>


[출처] [JSP] 게시판 페이징 처리 로직