MyBatis에서 페이징 처리를 하기 위해서는 RowBounds
객체를 사용한다. DB에 접근해서 페이지에 가져올 갯수를 지정할 때 RowBounds
객체에 시작 페이지 숫자와 출력할 게시글 갯수를 매개변수로 넘겨서 RowBounds
객체를 생성할 수 있다.
paging 처리하는 공식은 고정이므로 외워서 사용한다. 아래 코드는 서블릿에서 게시글 리스트를 출력할 때 10개씩 출력되도록 페이징 처리한 doGet()
메소드이다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int cPage,numPerpage;
try {
cPage=Integer.parseInt(request.getParameter("cPage"));
}catch(Exception e) {
cPage=1;
}
numPerpage=10;
List<Student> list=new StudentService().selectStudentPage(cPage,numPerpage);
// System.out.println(list.size());
// list.stream().forEach(System.out::println);
request.setAttribute("students", list);
int totalData=new StudentService().selectStudentCount();
int totalPage=(int)Math.ceil((double)totalData/numPerpage);
int pageBarSize=5;
int pageNo=((cPage-1)/pageBarSize)*pageBarSize+1;
int pageEnd=pageNo+pageBarSize-1;
//출력될 페이지바 html 코드로 작성해서 넘기기
String pageBar="<ul class='pagination justify-content pagination-sm'>";
if(pageNo==1) {
//15버전 이상일때만 " 3개를 사용해서 문자열 작성 가능함
//부트스트랩 사용 예정으로 클래스를 지정해주었다.
pageBar+="""
<li class='page-item disabled'>
<a class='page-link' href='#'>이전</a>
</li>
""";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo-1)+"'>이전</a></li>";
}
while(!(pageNo>pageEnd||pageNo>totalPage)) {
if(cPage==pageNo) {
pageBar+="<li class='page-item disabled'>";
pageBar+="<a class='page-link' href='#'>"+pageNo+"</a></li>";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo)+"'>"+pageNo+"</a></li>";
}
pageNo++;
}
if(pageNo>totalPage) {
pageBar+="""
<li class='page-item disabled'>
<a class='page-link' href='#'>다음</a>
</li>
""";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo+1)+"'>다음</a></li>";
}
pageBar+="</ul>";
request.setAttribute("pageBar", pageBar);
request.getRequestDispatcher("/views/studentPage.jsp").forward(request, response);
}
아래 코드는 DB에 접근해서 sql문을 실행하는 DAO에서 RowBounds 객체를 넘겨주는 코드이다.
selectList()
호출 시 세번째 매개변수에 RowBounds 클래스를 생성해서 전달해준다. 먼저 매개변수 있는 생성자를 이용해서 객체 생성하고 첫번째 매개변수로 시작 번호를 넘겨준다.
시작 번호 공식은 다음과 같다. (cPage-1)*numPerpage
두번째 매개변수로 출력될 범위를 넘겨준다. numPerpage
💡 이때, selectList()
메소드 실행 시 매개변수 순서를 맞추는데 주의한다. 리스트 전체를 출력하기 때문에 페이징처리 할 RowBounds 객체 외에 넘길 매개변수가 없다고 하더라도 매개변수 위치를 맞춰주어야 원하는 값으로 제대로 받아올 수 있다.
public List<Student> selectStudentPage(SqlSession session, int cPage, int numPerpage) {
RowBounds rb=new RowBounds((cPage-1)*numPerpage, numPerpage);
return session.selectList("student.selectStudentPage", null, rb);
//매개변수 순서 맞춰야함
}