[Spring] Paging
>> 페이징
- 게시판에서 글 페이지처리하는 것을 페이징이라고 하며 페이징을 위한 PageDto 가 있어야 한다.
- PageDTO에는 페이지에 관한 속성들이 존재한다.
>> 속성들을 하나씩 생각해보자
- totalCnt : 총 게시물의 숫자
- pageSize : 한페이지에 나타낼 게시물의 숫자
- naviSize : 페이지 이동할때 나타낼 페이지의 숫자 < 1 2 3 4 5 >
- totalPage : 총페이지 숫자
- page : 현재 페이지
- beginePage : 네비게이션에 나타낼 첫번쨰 페이지 숫자
- endPage : 네비게이션에 나타낼 마지막 페이지 숫자
- showPrev : 이전페이지 네비게이션을 보여줄지 말지 여부
- showNext : 다음페이지 네비게이션을 보여줄지 말지 여부
>> 여러 속성들중에 정해진 값은 PageSize 하나이고 받아올 값들은 totalCnt, page 만 받아오면 된다.
>> 이를 생성자를 통해서 나머지 값들을 구한다.
>> totalPage(총페이지수) 같은경우는 ==> 총 게시물수 / 페이지사이즈 하면되는데 이때 나머지가 나올수 있으므로,
올림처리와, 정수 나누기 정수는 정수이므로, (double) 또는 (Float)으로 형변환후 (int)로 다시 형변환 해준다.
totalPage = (int)Math.ceil(totalCnt / (double)pageSzie);
>>beginPage(네비의 첫번째 페이지) 같은경우는 naviSize에 따라 달라진다, 10이라고 가정하다면
page | beginPage |
5 | 1 |
10 | 1 |
13 | 11 |
17 | 11 |
22 | 21 |
25 | 21 |
beginPage = (page-1) / naviSize * naviSize + 1
* page-1 하는 이유는 경계값에서 10일때 10/10*10+1 -> 11 이 나오기 때문에 현재 페이지에서 -1 을 해줘야함
>>endPage의 경우는 begine페이지와 naviSize와 연관이 있다 왜냐하면 현재 begine페이지가 11이라면 마지막은 20이 되야 하므로 >> beginPage+naviPage-1 << 이되어야 맞으나 마지막 페이지일 경우는 마지막 페이지가 나와야 하므로 min을 통해 비교해준다.
endPage = Math.min( beginPage+naviPage-1, totalPage )
>>showPrev, showNext의 경우는 showPrev는 1이 아닐경우, showNext는 마지막 페이지가 아닐경우만 보여주면된다.
showPrev = beginPage != 1;
showNext = endPage != totalPage;
추가로 getter, setter를 생성하고, 실제로 사용해보도록하자
=======================================================================================
>> 사용자의 요청에 의해 board페이지로 이동할경우 /list 로 요청이 들어간다.
>> 이때 page, pageSize가 매개변수로 들어가게 되는데 이는 int로 하지 않는 이유는 null이 들어왔을떄 int로 형변환이 불가능 하기 때문에 홈페이지 에러가 발생한다 따라서 Integer를 사용하였다.
>>(@Value 를 사용해도 될듯?)
-- if문을 통해서 page, pageSize가 null일 경우 기본 값을 주입해주었다.
-- 또한 페이징하기 위하여 PageHandler를 통해서 page관련 속성들을 얻어 Model에 넘겨주었다.
-- 게시물을 뽑아내기 위하여 boardService를 통해서 List<BoardDto>를 얻어냈다.
-- 이때 사용한 map은 SQL문에서 #{offset}, #{pageSize} 에 값을 넣어주므로써 해당 페이지에 관련된 게시물을 얻을수 있다.
>> 이렇게 Model을 통해서 list, pageHanlder는 JSP로 넘어가게 되는데
>> JSP에서는 foreach를 통해서 넘겨받은 데이터를 사용한다