Mybatis에서 페이징 처리하기
RowBounds
를 사용해서 페이징 처리
RowBounds(시작 인덱스, 페이지 당 글의 수)
RowBounds
는 index 0부터 시작
구현하기
option.properties
# 페이징
## 페이지 당 글의 개수
page.listcnt = 10
BoardController
요청 url
: /board/main?board_info_idx=${board_info_idx}&page=${page}
page parameter
: 디폴트 값은 1로 설정한다.
boardService.getContentList(board_info_idx, page);
: page파라미터를 전체 게시글 리스트를 반환하는 서비스 메서드에 넘겨준다.
@GetMapping("/main")
public String main(@RequestParam int board_info_idx, Model model,
@RequestParam(value = "page", defaultValue = "1") int page) {
...생략...
List<Content> list = boardService.getContentList(board_info_idx, page);
model.addAttribute("list", list);
return "board/main";
}
BoardService
- 게시글 목록을 반환하는 메서드에
RowBounds
를 추가한다.
RowBounds(시작 인덱스, 페이지 당 글의 수)
- dao에 rowBounds를 파라미터로 넘겨준다.
@Service
@PropertySource("/WEB-INF/properties/option.properties")
public class BoardService {
... 생략 ...
@Value("${page.listcnt}")
private int page_listcnt;
public List<Content> getContentList(int content_board_idx, int page) {
int startIndex = (page - 1) * page_listcnt;
RowBounds rowBounds = new RowBounds(startIndex, page_listcnt);
return boardDao.getContentList(content_board_idx, rowBounds);
}
}
BoardDao
... 생략 ...
public List<Content> getContentList(int content_board_idx, RowBounds rowBounds) {
return boardMapper.getContentList(content_board_idx, rowBounds);
}
BoardMapper
...생략...
@Select("select c.content_idx, c.content_subject, u.user_name as content_writer_name, "
+ "to_char(c.content_date, 'YYYY-MM-DD') as content_date "
+ "from content_table c join user_table u on c.content_writer_idx = u.user_idx "
+ "where c.content_board_idx = #{content_board_idx} "
+ "order by c.content_idx desc")
List<Content> getContentList(int content_board_idx, RowBounds rowBounds);

DTO
- 생성자에서
전체 페이지 수
, 페이지네이션의 최소 페이지 번호
, 최대 페이지 번호
, 이전 버튼 페이지 번호
, 다음 버튼 페이지 번호
를 구한다.
package com.community.dto;
public class Page {
private int min;
private int max;
private int prevPage;
private int nextPage;
private int pageCnt;
private int currentPage;
public Page(int contentCnt, int currentPage, int contentPageCnt, int paginationCnt) {
this.currentPage = currentPage;
pageCnt = contentCnt / contentPageCnt;
if(contentCnt % contentPageCnt > 0) {
pageCnt++;
}
min = ((currentPage - 1) / paginationCnt ) * paginationCnt + 1;
max = min + paginationCnt - 1;
if(max > pageCnt) {
max = pageCnt;
}
prevPage = min - 1;
nextPage = max + 1;
if(nextPage > pageCnt) {
nextPage = pageCnt;
}
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
public int getPrevPage() {
return prevPage;
}
public int getNextPage() {
return nextPage;
}
public int getPageCnt() {
return pageCnt;
}
public int getCurrentPage() {
return currentPage;
}
}
BoardMapper
...생략...
@Select("select count(*) from content_table where content_board_idx = #{content_board_idx}")
int getContentCnt(int content_board_idx);
BoardDao
...생략...
public int getContentCnt(int content_board_idx) {
return boardMapper.getContentCnt(content_board_idx);
}
BoardService
boardDao.getContentCnt(content_board_idx);
로 전체 글의 개수를 리턴받는다.
- page의 생성자로
전체 페이지 수
, 페이지네이션의 최소 페이지 번호
, 최대 페이지 번호
, 이전 버튼 페이지 번호
, 다음 버튼 페이지 번호
를 구한다.
@Service
@PropertySource("/WEB-INF/properties/option.properties")
public class BoardService {
...생략...
@Value("${page.listcnt}")
private int page_listcnt;
@Value("${page.paginationcnt}")
private int page_paginationcnt;
public Page getContentCnt(int content_board_idx, int currentPage) {
int content_cnt = boardDao.getContentCnt(content_board_idx);
Page page = new Page(content_cnt, currentPage, page_listcnt, page_paginationcnt);
return page;
}
}
BoardController
...생략...
@GetMapping("/main")
public String main(@RequestParam int board_info_idx, Model model,
@RequestParam(value = "page", defaultValue = "1") int page) {
...생략...
model.addAttribute("board_info_idx", board_info_idx);
List<Content> list = boardService.getContentList(board_info_idx, page);
model.addAttribute("list", list);
Page paging = boardService.getContentCnt(board_info_idx, page);
model.addAttribute("page", paging);
return "board/main";
}
JSP
...생략...
<div class="d-none d-md-block">
<ul class="pagination justify-content-center">
<c:choose>
<c:when test="${page.prevPage <= 0 }">
<li class="page-item disabled">
<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.prevPage}" class="page-link">이전</a>
</li>
</c:when>
<c:otherwise>
<li class="page-item">
<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.prevPage}" class="page-link">이전</a>
</li>
</c:otherwise>
</c:choose>
<c:forEach var="idx" begin="${page.min }" end="${page.max }">
<c:choose>
<c:when test="${idx == page.currentPage }">
<li class="page-item active">
<a href="${root}board/main?board_info_idx=${board_info_idx}&page=${idx}" class="page-link">${idx }</a>
</li>
</c:when>
<c:otherwise>
<li class="page-item">
<a href="${root}board/main?board_info_idx=${board_info_idx}&page=${idx}" class="page-link">${idx }</a>
</li>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${page.max >= page.pageCnt }">
<li class="page-item disabled">
<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.nextPage}" class="page-link">다음</a>
</li>
</c:when>
<c:otherwise>
<li class="page-item">
<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.nextPage}" class="page-link">다음</a>
</li>
</c:otherwise>
</c:choose>
</ul>
</div>
...생략...