code-mo
code-mo
code-mo
전체 방문자
오늘
어제
  • Recode (46)
    • - Programming -
    • Language (0)
      • Java (0)
    • - Framework -
    • Spring (4)
    • - DATA -
    • DBMS (26)
      • DataBase (5)
      • SQL (20)
      • MySQL (0)
      • MariaDB (1)
    • Server (0)
    • - Dev Kit -
    • IDE (0)
      • Eclipse (0)
    • WEB (0)
    • ETC (5)
    • - Side-Project -
    • 게시판 만들기 (9)
      • JSP ➜ Spring (9)
      • Spring ✚ Ajax (0)
    • nordia (0)
    • Diablo4 (0)
      • 야만용사 (0)
    • 쿠폰 (2)

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
code-mo
게시판 만들기/JSP ➜ Spring

[Spring] 게시판 구현 페이징 처리

게시판 만들기/JSP ➜ Spring

[Spring] 게시판 구현 페이징 처리

2023. 2. 8. 07:30
728x90

페이징 처리

게시판 페이징은 게시판에서 많은 수의 게시글을 정리하고 관리할 수 있도록 하는 기능입니다. 일반적으로 게시판 페이징은 게시글을 여러 페이지로 나누고, 각 페이지마다 일정 수의 게시글을 노출합니다. 이렇게 함으로써 게시글을 관리하기
쉽고, 사용자가 게시글을 찾기 쉽게 할 수 있습니다.

 

PageVO

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
private int nowPage;    // 현제페이지
private int pageSize;   // 한 페이지에 보여줄 글 개수
private int pageBlock;  // 페이지 목록 단위 수
 
private int startRow;   // 시작글
private int endRow;     // 마지막 글
 
private int startPage;  // 시작 페이지
private int endPage;    // 마지막 페이지
 
private int count;      // 전체 글수
private int pageCount;  // 전체 페이지
 
public void rowCalculate(int nowPage) {
    this.nowPage = nowPage;
    startRow = (nowPage - 1) * pageSize;
    endRow = startRow + pageSize - 1;
}
 
public void pageCalculate(Integer count) {
    this.count = count;
    startPage = (nowPage - 1) / pageBlock * pageBlock + 1;
    endPage = startPage + pageBlock - 1;
    pageCount = count / pageSize + (count % pageSize == 0 ? 0 : 1);
    if (endPage > pageCount) {
        endPage = pageCount;
    }        
}
cs

 

게시판 페이지 Controller 

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
//페이지 - 게시판
@RequestMapping(value = "/board", method = RequestMethod.GET)
public String board(HttpServletRequest request, HttpServletResponse response,
        Model model,
        @RequestParam(defaultValue = "1") int nowPage) {
                    
    int pageSize = 10;
    int pageBlock = 10;
    
    PageVO pageVO = new PageVO();
    pageVO.setPageSize(pageSize);
    pageVO.setPageBlock(pageBlock);        
    pageVO.rowCalculate(nowPage);
            
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("limit", pageSize);
    map.put("offset", pageVO.getStartRow());
    
    List<BoardDTO> boardList=boardSvc.selectBoardList(map);        
    
    int count = boardSvc.selectBoardCount();                
    pageVO.pageCalculate(count);
        
    model.addAttribute("boardList",boardList);
    model.addAttribute("pageVO", pageVO);
                    
    return "board/board";
}
cs

 

게시판 페이징을 구현하기 위해서는 일반적으로 다음과 같은 절차를 따릅니다.

 

1. 전체 게시글 수를 조회합니다. 이는 게시글을 페이지로 나눌 수 있는 정보가 됩니다.

    사용구분의 조건을 주어 전체 게시글 조회
    int count = boardSvc.selectBoardCount();
1
2
3
4
5
<!-- 전체 글 수 조회 -->
<select id="selectBoardCount" resultType="java.lang.Integer">
    SELECT COUNT(*) FROM bbs.bbs
    WHERE bbsAvailable =  1
</select>
cs

 

2. 각 페이지가 보여줄 게시글 수를 정합니다. 일반적으로 게시판 페이징에서는 한 페이지에 10개 정도의 게시글을 노출합니다.

Controller에서 보여줄 게시글 수를 지정한 이유는 혹시 다른 곳에서 페이징 처리를 할 수 있기에 각각 Controller에서
지정할 수 있도록 하였다.
현재 페이지의 값을 받아 해당페이지의 첫 번째 글과 마지막글 순번을 계산하는 함수를 만들었다
예를 들어서 2번째 페이지의 첫 번째 글은 (2-1) * 10 = 10으로 시작순번이 1이 작게 계산이 된다.
이유는 SQL쿼리 LIMIT OFFSET을 사용하기 때문에 글의 순번 1이 아니라 테이블의 행을 0번부터 조회한다.
1
2
3
4
5
6
7
int pageSize = 10;
 
public void rowCalculate(int nowPage) {
    this.nowPage = nowPage;
    startRow = (nowPage - 1) * pageSize;
    endRow = startRow + pageSize - 1;
}
cs

 

3. 전체 페이지 수를 계산합니다. 전체 게시글 수와 한 페이지가 보여줄 게시글 수를 이용해서 전체 페이지 수를 계산합니다. 

전체 페이지의 숫자는 전체글을 코드 블럭으로 나누어 떨어지지 않을 경우 몫에 1을 더하면 
마지막 페이지가 된다.
예를 들어 게시글이 15개이면 15 / 10 = 1이 된다 이런 경우 나머지의 5개의 글을 보여주기 위해 
1페이지가 더필요하게 된다 그래서 몫으로 계산되 1에 1을 더하게 된다

pageCount = count / pageSize + (count % pageSize == 0 ? 0 : 1);
if (endPage > pageCount) {
    endPage = pageCount;
}
1
2
3
4
5
6
7
8
9
10
11
int pageBlock = 10;
 
public void pageCalculate(Integer count) {
    this.count = count;
    startPage = (nowPage - 1) / pageBlock * pageBlock + 1;
    endPage = startPage + pageBlock - 1;
    pageCount = count / pageSize + (count % pageSize == 0 ? 0 : 1);
    if (endPage > pageCount) {
        endPage = pageCount;
    }        
}
cs

 

4. 페이지 링크를 생성합니다. 전체 페이지 수를 이용해서 이전 페이지, 현재 페이지, 다음 페이지 등의 링크를 생성할 수 있습니다. 이때 각 페이지 링크는 쿼리 문자열을 이용해서 현재 페이지 번호를 전달할 수 있습니다.

 

5. 각 페이지에 해당하는 게시글을 조회합니다. 현재 페이지 번호를 이용해서 각 페이지에 해당하는 게시글을 조회할 수 있습니다. 이는 쿼리문을 이용해서 게시글을 조회하고, 조회된 게시글 목록을 각 페이지에 출력할 수 있습니다.

 

6. 게시글 전체 목록을 조회하는 것 대신, 각 페이지에 해당하는 게시글만 조회할 수 있는 쿼리문을 작성할 수 있습니다. 이를 위해서는 각 페이지의 시작과 끝 게시글 번호를 계산해서 쿼리문에 적용할 수 있습니다.

SQL쿼리 LIMIT OFFSET을 사용하면 LIMIT에 pageSize를 넣고 해당페이지의 게시글 시작번호를 OFFSET에 넣어
사용할 수 있다.
1
2
3
4
5
6
7
<!-- 게시글 리스트 -->
<select id="selectBoardList" parameterType="java.util.Map" resultType="com.board.BoardDTO">
    SELECT * FROM bbs.bbs
    WHERE bbsAvailable = 1
    ORDER BY bbsID DESC
    LIMIT #{limit} OFFSET #{offset}
</select>
cs

 

7. 게시글 조회 쿼리문과 게시글 전체 개수를 조회하는 쿼리문을 분리할 수 있습니다. 이를 위해서는 게시글 전체 개수를 저장하고 있는 변수를 생성해서 게시글 전체 개수를 저장할 수 있습니다. 이렇게 함으로써 게시글 조회 쿼리문과 게시글 전체 개수를 조회하는 쿼리문을 분리할 수 있습니다.

 

'게시판 만들기 > JSP ➜ Spring' 카테고리의 다른 글

[Spring]2. 게시판 구현 CRUD - 글 보기  (0) 2023.02.10
[Spring]1. 게시판 구현 CRUD - 글쓰기  (0) 2023.02.09
[Spring] 메인 페이지/내비게이션 <jsp:include>  (0) 2023.02.07
[Spring] 로그인/로그아웃 구현  (0) 2023.02.06
[Spring] 회원 가입 구현  (0) 2023.02.05
  • 페이징 처리
  • PageVO
  • 게시판 페이지 Controller 
'게시판 만들기/JSP ➜ Spring' 카테고리의 다른 글
  • [Spring]2. 게시판 구현 CRUD - 글 보기
  • [Spring]1. 게시판 구현 CRUD - 글쓰기
  • [Spring] 메인 페이지/내비게이션 <jsp:include>
  • [Spring] 로그인/로그아웃 구현
code-mo
code-mo

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.