[Spring] 페이징(paging)

나옹·2022년 11월 30일
0
select t.* from 
(select sub.*, rownum as rnum from
(select * from bboard order by num desc) sub) t 
where rnum between #{startNo} and #{endNo}

최신순으로 정렬해서 rownum으로 원하는 글들을 출력해내는
쿼리문

페이징을 구현하기 위한 VO 변수들

페이징을 구현하기 위한 계산 메서드

 private void calcPage() {
      startNo = (this.page - 1) * perPageNum+ 1; 

DB쿼리에서 사용... 시작데이터번호 = (jsp클릭한 페이지번호-1) 페이지당 보여지는 개수
page 변수는 현재 jsp에서 클릭한 페이지번호
만약 2페이지라면 11-20번글이 와야하기 때문에 첫글번호는 (2-1)
10+1=11
시작글번호는 변함이 없으니 이대로 고정

int tempEnd = (int) (Math.ceil(page / (double)
this.perPageNum) * this.perPageNum);

1-10번째 페이지만 처음에 출력되고 11-20까지는 다음버튼을 눌렀을 시 나온다.
126개의 게시물이 있다면 100개까진 첫화면에 26개는 2번째 화면에 출력
ceil함수는 천장 함수로 1.1 = 2, 2.1 = 3 으로 출력된다.
jsp에서 클릭한 페이지번호를 기준으로 끝 페이지를 계산한다.

      this.startPage = (tempEnd - this.perPageNum) + 1;

시작페이지 계산 클릭한 page번호 10일때까지 시작페이지는 1

      if (tempEnd * this.perPageNum > this.totalCount) {
         this.endPage = (int) Math.ceil(this.totalCount / (double) this.perPageNum);
				if(endPage!=page) { 
       	  		this.endNo = startNo + this.perPageNum-1;
         		}else {
       	  		this.endNo = startNo + this.totalCount % 10-1;
         }

클릭한 page번호로 계산된 게시물수가 실제 게시물개수 totalCount 클때
현재 페이지가 마지막 페이지라면 게시글 갯수가 10개가 되지 않을수도 있으니 확인후 보정

      } else {
         this.endPage = tempEnd;
         this.endNo = startNo + this.perPageNum -1;
      }

클릭한 page번호로 계산된 게시물수가 실제게시물개수 totalCount 작을때

this.prev = this.startPage != 1;

시작페이지 1보다 크면 무조건 이전 페이지가 있음. true

this.next = this.endPage * this.perPageNum 
< this.totalCount;

클릭한 page번호로 계산된 게시물수가 실제 게시물 개수보다 작다면 다음페이지가 있음. true!

controller 메서드

	@RequestMapping(value = "/bbsList", method = RequestMethod.GET)
	public String bbsList(Locale locale, Model model, @ModelAttribute("pageVO")PageVO pageVO )throws Exception {
		System.out.println("현재 페이지 정보: "+pageVO.getPage());
		if(pageVO.getPage()==null) { //클라이언트가 페이지정보를 넘겨주지 않는다면 기본값 1로 셋팅
			pageVO.setPage(1);
		}
		//page 계산하기 위해서는 첫번째 페이지 정보 (클라이언트가 넘겨줍니다.), 두번쨰는 전체 페이지수, 세번째는 페이지당 그리고  페이지 그룹당 수
		int totalpageCnt=brsv.countBoard();
		System.out.println(totalpageCnt+"건 등록됨");
		pageVO.setTotalCount(totalpageCnt);
		
		List<BoardVO> list=brsv.selectAll(pageVO);
		System.out.println(list.size()+"ddsfsd");
		model.addAttribute("bList",list);
		model.addAttribute("pageVO",pageVO);//페이지 객체를 view에게 전달
		
		return "bbs/bbsList";
	}

view jsp 코드

         <tr>
         	<td colspan=6> 
         		<c:if test="${pageVO.prev}">
 					<a href="bbsList?page=${pageVO.startPage -1}">이전 페이지 그룹  </a>		
         		</c:if>
         	
         		<c:forEach begin="${pageVO.startPage}" end="${pageVO.endPage}" var="idx">
         			<c:if test="${pageVO.page == idx}">*</c:if>
         			<a href="bbsList?page=${idx}" }>${idx}</a>
         		
         		</c:forEach>   
         		<c:if test="${pageVO.next}">
 					<a href="bbsList?page=${pageVO.endPage +1}"> 다음 페이지 그룹</a>        		
 					
         		</c:if>         		      	
         	</td>
         </tr>

forEach문을 이용해 10개씩 10번 출력을 해주었고,
if문을 이용해 [이전페이지] , [다음페이지] 를 출력해주었다.

profile
최고의 개발을 위해 !

0개의 댓글