Archive

JSP - 페이징 처리

|

JSP - 페이징 처리


게시판의 페이징 처리를 구현해보자.

먼저, DAO의 게시판 글 리스트를 긁어오는 메소드를 작성한다.

이때 매개변수는 시작과 끝을 명시하는 int를 받는다. 한 페이지에 게시글을 5개만 보여주기로 했다면 쿼리문에서는 ref 내림차순, step 오름차순으로 정렬한 데이터에 번호를 매겨 차례로 5개씩 끊어와야한다. 이를 위해서 where 조건에 시작과 끝을 삽입해준다.

// 게시판 글 불러오기(전체)
	public List<BoardVO> getArticles(int start, int end) {
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		List<BoardVO> articleList = null;
		try {
			conn = ConnUtil.getConnection();
			pstm = conn.prepareStatement("select * from (select rownum rnum, 
                num, subject, ref, step, depth, content from 
                (select * from board order by ref desc,step asc)) 
                where rnum>=? and rnum<=?");
			pstm.setInt(1, start);
			pstm.setInt(2, end);
			rs = pstm.executeQuery();
			if(rs.next()) {
				articleList = new ArrayList<BoardVO>(end-start+1);
				do {
					BoardVO article = new BoardVO();
					article.setNum(rs.getInt("num"));
					article.setSubject(rs.getString("subject"));
					article.setRef(rs.getInt("ref"));
					article.setStep(rs.getInt("step"));
					article.setDepth(rs.getInt("depth"));
					article.setContent(rs.getString("content"));
					articleList.add(article);
				} while(rs.next());
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try {rs.close();} catch(SQLException e) {}
			if(pstm != null) try {pstm.close();} catch(SQLException e) {}
			if(conn != null) try {conn.close();} catch(SQLException e) {}
		}
		return articleList;
	}


게시글을 보여줄 list.jsp 에 한 페이지에 보여줄 게시글의 개수(pageSize)를 선언한다.

현재 페이지를 뜻하는 currentPage는 파라미터로 넘어온 pageNum을 int로 형변환하여 대입한다.

아무것도 넘어온 값이 없으면 pageNum의 초기 설정은 1로 한다.

<% 
	int pageSize = 5;
	String pageNum = request.getParameter("pageNum");
	if(pageNum == null) {
        pageNum = "1";
    }
	int currentPage = Integer.parseInt(pageNum);
%>


만약 한 페이지에 보여줄 글 개수를 5개로 정했다면 1페이지에는 1~5번의 글이 보여지고 2 페이지에서는 6~10번 글이 보여져야한다.

int startRow = (currentPage - 1) * pageSize + 1; // 시작점
int endRow = currentPage * pageSize; // 끝점


전체 총 글 개수(count)를 DAO에서 불러오고 만약 글 개수가 0보다 크면 위의 시작점(startRow)과 끝점(endRow)을 토대로 DAO에서 글 리스트를 긁어오고 제일 첫번째 글의 글번호(number)를 계산한다.

<%
	int count = 0; // 총 글개수
	int number = 0; // 글번호
	List<BoardVO> articleList = null;
	BoardDAO dao = BoardDAO.getInstance();
	count = dao.getArticleCount(); 
	if(count > 0) {
		articleList = dao.getArticles(startRow, endRow);
	}
	number = count - (currentPage - 1) * pageSize; 
%>


전체 총 글개수가 0보다 클 때 페이징 처리를 할 수 있는데, 만약 보여줄 글 개수가 5개고 총 게시글 수가 11개라고 치자. 2페이지까지 1~10번의 글을 보여주고 마지막 11번째 글은 3페이지에 위치하게 된다. 즉, 전체 총 글개수를 보여줄 글 개수로 나누었을 때 나누어 떨어지느냐가 관건이다. 나누어 떨어지지 않는다면 한 페이지를 더 생성해야 할 것이다. 이를 temp라고 하자. 삼항 연산자로 temp는 나누어떨어지면 0, 그렇지 않으면 1로 설정하고 페이지 개수를 계산한다.

전체 총 글개수를 보여줄 글개수로 나누고 temp를 더한다.(pageCount)

<%
	if(count>0) {
		int temp = count % pageSize == 0 ? 0 : 1; 
		int pageCount = count / pageSize + temp; // 페이지 개수
%>


그 다음, 페이지를 몇 개로 나누어 보여줄지(pageBlock)를 정한다.

pageBlock이 3이라면 처음 페이징은 1, 2, 3을 보여주고 next 버튼을 눌렀을때 4, 5, 6이 나오게 된다. 즉, 현재 페이지가 1이건 2건 3이건 페이징은 1, 2, 3이 나와야 한다. 현재 페이지 - 1을 pageBlock으로 나누었을때 현재 페이지가 4는 되어야 계산값이 1을 넘길 것이다. 마찬가지로 7은 되어야 계산값이 2를 넘긴다. 이를 수식으로 풀면 다음과 같다.

<%
	int pageBlock = 3;
	int startPage = (int)((currentPage-1)/pageBlock) * pageBlock + 1;
	int endPage = startPage + pageBlock - 1;
	if(endPage > pageCount) endPage = pageCount;
%>


여기에 반복문으로 페이징 숫자를 출력하고 추가적으로 이전, 다음과 같은 버튼을 넣어준다.

<%
	if(startPage > pageBlock) {
%>
		<a href="list.jsp?pageNum=<%=startPage - pageBlock %>">[이전]</a>
<%
		}
		for(int i=startPage; i<=endPage; i++) {
%>
		<a href="list.jsp?pageNum=<%=i %>">[<%=i %>]</a>
<%
		}
		if(endPage < pageCount) {
%>
		<a href="list.jsp?pageNum=<%=currentPage+1 %>">[다음]</a>
<%
		}
%>



참고 자료


KG 아이티뱅크 강의 자료

처음해보는 JSP&Servlet 웹 프로그래밍