Post

게시판의 페이징 처리를 위한 헬퍼 클래스 만들어 보기

개요

이 글에서 만들어 보려는 페이징처리 형태는 아래와 같습니다.

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;
    }

}
  1. 먼저 생성자를 통해 pageNum, totalCount, pageCount, rowCount를 받아서 변수를 초기화 합니다.
  2. 끝 페이지와 시작 페이지를 계산합니다. 저의 경우에는 끝페이지를 먼저 계산하는 것이 편해서 끝 페이지를 먼저 계산하고 시작 페이지를 계산했습니다.
    계산하는 방식은 다음과 같습니다.
    • 끝 페이지 = (현재 페이지 번호 / 한 페이지에 나타낼 페이지 수) * 한 페이지에 나타낼 페이지 수
    • 시작 페이지 = 끝 페이지 - 한 페이지에 나타낼 페이지 수 + 1
  3. 실제 끝 페이지를 계산합니다. 만약 끝 페이지가 전체 페이지 수보다 크다면 끝 페이지를 전체 페이지 수로 설정합니다.
  4. getter 메소드를 통해서 페이징 처리에 필요한 정보를 불러올 수 있게 합니다.
  5. 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.