복습

게시판 페이징하기 - sql문 rownum 사용 본문

서버프로그램

게시판 페이징하기 - sql문 rownum 사용

ykm1256 2020. 6. 22. 16:57

페이징에 필요한 변수 선언

<%
request.setCharacterEncoding("utf-8");
int pageSize = 5;// 한 화면에 보여지는 수
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;

BoardDAO dao = BoardDAO.getInstance();
ArrayList<Board> arr = dao.boardList(startRow,endRow);
int count = dao.boardCount();
int number = count-(currentPage-1)*pageSize;
%>

pageSize : 한 페이지에 보여질 글의 수

pageNum : 출력될 페이지 번호(현재 페이지)

currentPage : 현재 페이지 번호

startRow : 페이지에 출력될 글의 시작 번호(DB에서 ref와 re_step을 모두 고려하여 순서대로 정렬 했을 때의 번호로 페이지의 가장 위에 출력될 글의 번호이다.)

endRow : startRow의 반대

count : 글의 총 갯수

number => 글의 총 갯수 - (현재페이지번호 -1) * 한 페이지에 보여질 글의 수

 : 실제 출력될 글의 번호로 가장 최근에 쓴 글(가장 위에 있는 글)의 번호이다.

 

 

 

boardList()의 select문 구현 - 글의 번호 매기기

public ArrayList<Board> boardList(int startRow, int endRow){
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		Board b = null;
		ArrayList<Board> arr = new ArrayList<Board>();
		try {
			con = getConnection();
			String sql = "select * from (select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa) where rn between ? and ?";
			ps = con.prepareStatement(sql);
			ps.setInt(1, startRow);
			ps.setInt(2, endRow);
			rs = ps.executeQuery();
            
          //  생략

sql문 rownum 키워드 사용

 

1. ref, re_step으로 정렬

aa.* from (select * from board order by ref desc, re_step asc) aa)

 

 - board 테이블의 데이터를 ref의 내림차순, re_step의 오름차순으로 정렬한다.

 

2. rownum으로 순번 매기기

(select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa)

 - 정렬한 데이터를 rownum을 사용하여 순번을 매기는데 열의 이름은 rn으로 한다.

 

3. 원하는 범위만큼 출력

sql = "select * from (select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa) where rn between ? and ?";

 - 정렬하여 순번을 매긴 데이터를 원하는 범위만큼 출력한다.

 - startRow~endRow 번호의 글을 출력한다.

 

 

페이지에 글 출력

<%for(Board b : arr) { %>
		<tr>
		<td><%=number-- %></td>	
		<td><a href="boardView.jsp?num=<%=b.getNum()%>"><%=b.getSubject() %></a></td>
		<td><%=b.getWriter() %></td>
		<td><%=b.getReg_date() %></td>
		<td><%=b.getReadcount() %></td>
		</tr>
		
		<%} %>
	

 - arr에 받아온 글의 데이터를 출력한다.

 - number는 가장 최근에 쓰여진 글의 번호(가장 마지막 번호)이므로 -1씩 하며 글의 번호를 매긴다.

 

 

페이지 이동 버튼 구현

<%
if(count>0){
	int pageCount = count/pageSize+(count%pageSize==0?0:1); // 총 페이지 개수
	int pageBlock = 3;	// 한 페이지당 표시될 페이지 번호 수
	int startPage = (int)((currentPage-1)/pageBlock)*pageBlock+1;
	int endPage = startPage+pageBlock-1;	// 계산상의 endPage
	
	if(endPage>pageCount){ 
    // 계산 상 가장 끝 번호의 페이지가 총 페이지 갯수보다 크면 끝 페이지의 번호는 총 페이지 갯수
		endPage = pageCount;
	}
	
	//이전
	if(startPage>pageBlock){
    // 현재 페이지의 첫 페이지가 한 페이지당 표시되는 페이지 갯수 보다 크면
    // 즉 첫 번째 페이지(1~3 페이지)가 아니라면
		%>
		<a href="list.jsp?pageNum=<%=startPage-1%>">[이전]</a>	
		<%
	}
	//페이지 번호 출력
	for(int i=startPage;i<=endPage;i++){
		if(i==currentPage){
			%>
            // 현재 페이지에서는 태그 출력하지 않음
			<%=i %>
			<%
		}else{
		%>
		<a href="list.jsp?pageNum=<%=i%>"><%=i %></a>
		<%
	}}
	//다음
	if(endPage<pageCount){// 현재 페이지의 가장 끝 페이지 번호가 가장 끝 페이지가 아니라면
		%>
        
		<a href="list.jsp?pageNum=<%=startPage+pageBlock%>">[다음]</a>
		<%
	}}
%>