게시판의 페이징 처리를 위한 헬퍼 클래스 만들어 보기
개요
이 글에서 만들어 보려는 페이징처리 형태는 아래와 같습니다.
1
<< 처음 < 이전 11 12 13 14 15 16 17 18 19 20 > 다음 마지막 >>
위 방식은 네이버 카페 등 국내 게시판에서 많이 사용되기 때문에 이 방식으로 만들어 보려고 합니다.
페이징 처리를 위해서는 아래와 같은 정보가 필요합니다.
- 현재 페이지 번호
- 한 페이지에 보여줄 글목록 수
- 한 페이지에 나타낼 페이지 수
- 전체 글 수
현재 페이지 번호
, 한 페이지에 보여줄 글목록 수
, 한 페이지에 나타낼 페이지 수
는 리퀘스트 파라미터로 받아서 처리할 수 있습니다.
전체 글 수
는 DB에서 조회해서 가져올 수 있습니다.
이 글에서는 SQL은 따로 작성하지 않고, 페이징 처리를 위한 정보를 계산하는 방법에 대해서만 다룹니다.
그럼 페이징 처리를 위한 클래스를 만들어 보겠습니다.
PageHelper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package org.example.page;
public class PageHelper {
private int pageNum; // 페이지 번호
private int pageCount; // 한페이지에 나타낼 페이지 수
private int startPage; // 시작 페이지 번호
private int endPage; // 끝 페이지 번호
private int rowCount; // 한 페이지에 보여줄 글목록 수
private long totalCount; // 전체 글 수
private int totalPageCount; // 전체 페이지 수
public static final int DEFAULT_PAGE_COUNT = 10;
public static final int DEFAULT_ROW_COUNT = 10;
public PageHelper(int pageNum, long totalCount, int pageCount, int rowCount) {
if ( pageNum < 1 ) {
return;
}
this.totalCount = totalCount;
this.pageNum = pageNum;
this.pageCount = pageCount;
// 끝 페이지 계산
this.endPage = (int)Math.ceil(pageNum / (double)pageCount) * pageCount;
// 시작 페이지
this.startPage = this.endPage - pageCount + 1;
this.rowCount = rowCount;
// 실제 끝 페이지 설정
this.totalPageCount = (int)Math.ceil(this.totalCount / (double)rowCount);
if ( this.endPage > this.totalPageCount ) {
this.endPage = this.totalPageCount;
}
}
public int getPageNum() {
return this.pageNum;
}
public int getPageCount() {
return this.pageCount;
}
public int getStartPage() {
return this.startPage;
}
public int getEndPage() {
return this.endPage;
}
public int getTotalPageCount() {
return this.totalPageCount;
}
public boolean isPrevBlock() {
return startPage > 1;
}
public boolean isNextBlock() {
return endPage < totalPageCount;
}
}
- 먼저 생성자를 통해 pageNum, totalCount, pageCount, rowCount를 받아서 변수를 초기화 합니다.
- 끝 페이지와 시작 페이지를 계산합니다. 저의 경우에는 끝페이지를 먼저 계산하는 것이 편해서 끝 페이지를 먼저 계산하고 시작 페이지를 계산했습니다.
계산하는 방식은 다음과 같습니다.- 끝 페이지 = (현재 페이지 번호 / 한 페이지에 나타낼 페이지 수) * 한 페이지에 나타낼 페이지 수
- 시작 페이지 = 끝 페이지 - 한 페이지에 나타낼 페이지 수 + 1
- 실제 끝 페이지를 계산합니다. 만약 끝 페이지가 전체 페이지 수보다 크다면 끝 페이지를 전체 페이지 수로 설정합니다.
- getter 메소드를 통해서 페이징 처리에 필요한 정보를 불러올 수 있게 합니다.
- isPrevBlock, isNextBlock 메소드를 통해서 이전 블록과 다음 블록이 있는지 확인할 수 있습니다.
- 이전 블록이 있는지 확인하는 방법은 시작 페이지가 1보다 큰지 확인하면 됩니다.
- 다음 블록이 있는지 확인하는 방법은 끝 페이지가 전체 페이지 수보다 작은지 확인하면 됩니다.
저는 위와 같은 방법으로 계산했지만, 페이징 처리에 필요한 정보를 계산하는 방법은 여러가지가 있을 수 있습니다.
pageCount를 파라미터로 받지 않는 경우를 위해 코드를 리팩토링 했습니다.
리팩토링 코드는 아래 링크에서 확인할 수 있습니다.
https://gist.github.com/hyeongmug/a070640123ebd4b096689563de533834
테스트
테스트를 통해서 정보가 잘 계산되는지 확인해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.example.page.PageHelper;
import org.junit.Test;
public class PageTest {
@Test
public void pageTest() {
PageHelper pageHelper = new PageHelper(11, 115, PageHelper.DEFAULT_PAGE_COUNT, PageHelper.DEFAULT_ROW_COUNT);
System.out.println("pageHelper.getPageNum() " + pageHelper.getPageNum() );
System.out.println("pageHelper.getPageCount() " + pageHelper.getPageCount() );
System.out.println("pageHelper.getStartPage() " + pageHelper.getStartPage() );
System.out.println("pageHelper.getEndPage() " + pageHelper.getEndPage() );
System.out.println("pageHelper.getTotalPageCount() " + pageHelper.getTotalPageCount() );
System.out.println("pageHelper.isPrevBlock() " + pageHelper.isPrevBlock() );
System.out.println("pageHelper.isNextBlock() " + pageHelper.isNextBlock() );
}
}
페이지 번호를 11로 설정하였고, 전체 글 수는 115개이고, 한 페이지에 보여줄 글목록 수는 10개, 한 페이지에 나타낼 페이지 수는 10개로 설정했습니다.
결과
1
2
3
4
5
6
7
pageHelper.getPageNum() 11
pageHelper.getPageCount() 10
pageHelper.getStartPage() 11
pageHelper.getEndPage() 12
pageHelper.getTotalPageCount() 12
pageHelper.isPrevBlock() true
pageHelper.isNextBlock() false
페이징 정보가 잘 계산된 것을 확인할 수 있습니다.
다음 글에서는 Oracle DB에서 페이징 처리를 위한 SQL을 작성해 보겠습니다.
그런 후에 페이징 처리를 위한 JSP를 만들어볼 예정입니다.
This post is licensed under CC BY 4.0 by the author.