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