검색된 게시물이 많아지면 페이지네이션에서 노출되는 페이지 번호가 많아집니다. 그래서 노출되는 페이지 번호의 수를 조절하지 않으면 페이지네이션 UI에 문제점가 발생합니다.
예를 들어, 검색된 결과가 350건이고 페이지 크기가 5이면 페이지네이션에 노출되는 페이지 번호가 70개가 됩니다.
이렇게 사용하는 게 문제가 없으면 상관은 없습니다.
그러나 페이지네이션에서 노출되는 페이지 번호 수가 많으면 복잡해 보일 수 도 있습니다.
그래서 페이지네이션에서 노출되는 페이지 번호 수를 조절하여 처리되도록 페이지네이션 클래스를 생성하도록 하겠습니다.
페이지네이션에서 노출될 페이지 번호 개수를 페이지 사이즈(pageSize)라고 하고 노출될 페이지 사이즈의 시작 번호를 페이지 시작 번호(pageStartNo), 노출될 페이지 사이즈의 종료 번호를 페이지 종료 번호(pageEndNo)라고 합니다.
페이지 사이즈(pageSize)는 대부분 10개로 많이 사용합니다. 원하시는 페이지 사이즈를 정하시면 됩니다.
페이지 사이즈를 10으로 하면 첫 번째 페이지네이션의 페이지 시작 번호는 1이고 페이지 종료 번호는 10이 됩니다. 그리고 두 번째 페이지네이션의 페이지 시작 번호는 11이고 페이지 종료 번호는 20이 됩니다.
그럼 계산으로 페이지 시작 번호(pageStartNo)와 페이지 종료 번호(pageEndNo)를 계산해 보도록 하겠습니다.
페이지 시작 번호(pageStartNo)는 현재 페이지 번호(pageNo)를 페이지 사이즈(pageSize)로 나눈 몫과 페이지 사이즈(pageSize)를 곱하고 1을 더하면 됩니다. 단, 나머지가 없으면 페이지 번호(pageNo)와 페이지 사이즈(pageSize)가 같기 때문에 나눈 몫(start)에서 1을 빼야 합니다.
int pageStartNo = 1;
int start = pageNo / pageSize;
if (start >= 1) {
if (pageNo % pageSize == 0) {
start--;
}
pageStartNo = (start * pageSize) + 1;
}
예를 들어, 현재 페이지 번호(pageNo)가 4이고 페이지 사이즈(pageSize)가 10이면 나눈 몫(start)이 0으로 페이지 시작 번호(pageStartNo)는 초기값인 1이 됩니다.
그러나 현재 페이지 번호(pageNo)가 페이지 사이즈(pageSize) 보다 큰 14이면 나눈 몫(start)이 1로 페이지 시작 번호(pageStartNo)는 나눈 몫(start)과 페이지 사이즈(pageSize)를 곱하고 1을 더해 11이 됩니다.
그리고 현재 페이지 번호(pageNo)가 20이면 나눈 몫(start)이 2가 되나 페이지 번호(pageNo)를 페이지 사이즈(pageSize)로 나눈 나머지가 없기 때문에 나눈 몫(start)에서 1을 빼서 1이 됩니다. (나눈 몫(start)에서 1을 빼는 이유는 현재 페이지 번호(pageNo)가 페이지 종료 번호(pageEndNo)와 같기 때문입니다.) 그래서 페이지 시작 번호(pageStartNo)는 나눈 몫(start)과 페이지 사이즈(pageSize)를 곱하고 1을 더해 11이 됩니다.
페이지 종료 번호(pageEndNo)는 페이지 시작 번호(pageStartNo)에서 1을 빼고 페이지 사이즈(pageSize)를 더하면 됩니다. (페이지 시작 번호(pageStartNo)에서 1을 빼는 이유는 페이지 시작 번호는 항상 페이지 사이즈보다 1이 크기 때문입니다.) 그러나 페이지 종료 번호가 페이지 마지막 번호보다 크면 페이지 마지막 번호로 변경해 줍니다.
int pageEndNo = (pageStartNo - 1) + pageSize;
if (pageEndNo > pageLastNo) {
pageEndNo = pageLastNo;
}
그럼 Pagination(페이지네이션) 클래스를 생성하겠습니다.
Pagination(페이지네이션) 클래스는 이전에 만든 Paging 클래스를 계승(상속) 받아서 생성하겠습니다. (Paging 클래스를 계승(상속) 받는 이유는 Paging 클래스에 있는 변수와 계산 공식을 사용하기 위해서입니다.)
Maven Spring Project에 Common Pagination 추가하기
1. Java Resource > src/main/java에 com.home.study.common.search 패키지에 있는 Paging.java 파일을 오픈하고 private로 되어 있는 변수와 process() 메서드를 protected로 수정합니다.
- 변수를 private에서 protected로 수정하는 이유는 계승(상속) 받은 클래스에서 쉽게 변수에 접근하기 위해서고 process() 메서드를 protected로 수정하는 이유는 process() 메서드를 Override(오버라이드)하여 사용하기 위해서입니다.
- 그리고 process() 메서드에서 현재 페이지 번호(pageNo)가 페이지 마지막 번호(pageLastNo) 보다 크면 오류가 발생하지 않게 계산을 하지 않았습니다. 그러나 현재 페이지 번호가 페이지 마지막 번호와 같을 때 삭제가 발생할 경우 전체 레코드 수가 줄어들어 페이지 마지막 번호가 줄어들 수 있습니다. 그래서 우리는 현재 페이지 번호가 페이지 마지막 번호보다 크면 현재 페이지 번호를 페이지 마지막 번호로 변경하여 처리하겠습니다. 만약, process() 메서드를 처리하기 전에 현재 페이지 번호를 검사하여 예외 처리를 할 거라면 기존의 소스를 유지하시면 됩니다.
package com.home.study.common.search;
import java.io.Serializable;
public class Paging implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 5531728426097598480L;
/**
* 전체 레코드 수
*/
protected int recordTotalCount = 0;
/**
* 페이지 레코드 수(기본값 : 10)
*/
protected int recordCountPerPage = 10;
/**
* 페이지 번호
*/
protected int pageNo = 1;
/**
* 페이지의 레코드 시작 번호
*/
protected int pageStartRecordNo = 0;
/**
* 페이지의 레코드 종료 번호
*/
protected int pageEndRecordNo = 0;
/**
* 페이지 마지막 번호
*/
protected int pageLastNo = 0;
/**
* 전체 레코드 수를 가져옵니다.
* @return 전체 레코드 수
*/
public int getRecordTotalCount() {
return recordTotalCount;
}
/**
* 전체 레코드 수를 설정합니다.
* @param recordTotalCount 전체 레코드 수
*/
public void setRecordTotalCount(int recordTotalCount) {
this.recordTotalCount = recordTotalCount;
}
/**
* 페이지 레코드 수를 가져옵니다.
* @return 페이지 레코드 수
*/
public int getRecordCountPerPage() {
return recordCountPerPage;
}
/**
* 페이지 레코드 수를 설정합니다.
* @param recordCountPerPage 페이지 레코드 수
*/
public void setRecordCountPerPage(int recordCountPerPage) {
if (recordCountPerPage <= 0) {
recordCountPerPage = 10;
}
this.recordCountPerPage = recordCountPerPage;
}
/**
* 페이지 번호를 가져옵니다.
* @return 페이지 현재 번호
*/
public int getPageNo() {
return pageNo;
}
/**
* 페이지 번호를 설정합니다.
* @param pageNo 페이지 현재 번호
*/
public void setPageNo(int pageNo) {
if (pageNo <= 0) {
pageNo = 1;
}
this.pageNo = pageNo;
}
/**
* 페이지의 레코드 시작 번호를 가져옵니다.
* @return 페이지의 레코드 시작 번호
*/
public int getPageStartRecordNo() {
return pageStartRecordNo;
}
/**
* 페이지의 레코드 종료 번호를 가져옵니다.
* @return 페이지의 레코드 종료 번호
*/
public int getPageEndRecordNo() {
return pageEndRecordNo;
}
/**
* 페이지 마지막 번호를 가져옵니다.
* @return 페이지 마지막 번호
*/
public int getPageLastNo() {
return pageLastNo;
}
/**
* one 베이스(oracle)로 페이징을 처리합니다.
*/
public void processOne() {
process(false);
}
/**
* zero 베이스(mariaDB, mySQL)로 페이징을 처리합니다.
*/
public void processZero() {
process(true);
}
/**
* 페이징을 처리합니다.
* @param zero 제로 베이스 여부 (true : mariaDB, mySQL은 zero 베이스, false : oracle은 1 베이스)
*/
protected void process(boolean zero) {
// 레코드 번호
int startBase = 1;
int endBase = 0;
// 제로 베이스
if (zero) {
startBase = 0;
endBase = -1;
}
// 페이지 마지막 번호 설정
// 나머지가 있으면 페이지 마지막 번호를 증가 시킨다.
pageLastNo = (recordTotalCount / recordCountPerPage) + (recordTotalCount % recordCountPerPage == 0 ? 0 : 1);
if (pageLastNo > 0) {
// 현재 페이지 번호가 페이지 마지막 번호도 크면 페이지 마지막 번호로 변경
// 현재 페이지 번호가 페이지 마지막 번호와 같을 때 삭제가 발생할 경우 전체 레코드 수가 줄어 들어 페이지 마지막 번호가 줄어 들 경우 페이지 마지막 번호로 변경
if (pageNo > pageLastNo) {
pageNo = pageLastNo;
}
// 페이지의 레코드 시작 번호 설정
pageStartRecordNo = ((pageNo - 1) * recordCountPerPage) + startBase;
// 페이지의 레코드 종료 번호 설정
pageEndRecordNo = pageNo * recordCountPerPage + endBase;
// 페이지의 레코드 종료 번호가 전체 레코드 수보다 크면 전체 레코드 수로 변경
if (pageEndRecordNo > (recordTotalCount + endBase)) {
pageEndRecordNo = recordTotalCount + endBase;
}
} else {
pageStartRecordNo = 0;
pageEndRecordNo = 0;
pageLastNo = 0;
}
}
}
2. Java Resource > src/main/java에 com.home.study.common.search 패키지에 Paging 클래스를 계승(상속) 받아서 Pagination 클래스를 생성합니다. (Pagination.java)
- Pagination 클래스에 Paging 클래스가 계승(상속)되도록 class에 extends로 Paging를 입력합니다.
- Pagination 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
- 페이지 사이즈(pageSize), 페이지 시작 번호(pageStartNo), 페이지 종료 번호(pageEndNo) 변수를 생성하고 Getter, Setter를 생성합니다.
- 계산하기 위해 process() 메서드를 Override(오버라이드)하여 생성하고 계산 공식을 추가합니다.
package com.home.study.common.search;
public class Pagination extends Paging {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1014943426267041010L;
/**
* 페이지 사이즈(기본값 10)
*/
private int pageSize = 10;
/**
* 페이지 시작 번호
*/
private int pageStartNo = 1;
/**
* 페이지 종료 번호
*/
private int pageEndNo = 1;
/**
* 페이지 사이즈를 가져옵니다.
* @return 페이지 사이즈
*/
public int getPageSize() {
return pageSize;
}
/**
* 페이지 사이즈를 설정합니다.
* @param pageSize 페이지 사이즈
*/
public void setPageSize(int pageSize) {
if (pageSize <= 0) {
pageSize = 10;
}
this.pageSize = pageSize;
}
/**
* 페이지 시작 번호를 가져옵니다.
* @return 페이지 시작 번호
*/
public int getPageStartNo() {
return pageStartNo;
}
/**
* 페이지 종료 번호를 가져옵니다.
* @return 페이지 종료 번호
*/
public int getPageEndNo() {
return pageEndNo;
}
@Override
protected void process(boolean zero) {
super.process(zero);
// 페이지 시작 번호 설정
// 몫만큼 페이지 시작 번호 변경한다.
int start = pageNo / pageSize;
if (start >= 1) {
// 나머지가 없으면 페이지 번호가 페이지 마지막 번호와 같아 몫을 감소 시킨다.
if (pageNo % pageSize == 0){
start--;
}
pageStartNo = (start * pageSize) + 1;
}
if (pageLastNo > 0) {
// 페이지 종료 번호 설정
pageEndNo = (pageStartNo - 1) + pageSize;
// 페이지 종료 번호가 페이지 마지막 번호보다 크면 페이지 마지막 번호로 변경
if (pageEndNo > pageLastNo) {
pageEndNo = pageLastNo;
}
}
}
}
현재 Search 클래스에서 Paging 클래스를 변수로 사용하고 있습니다. 그래서 Search 클래스에서 Paging 클래스를 Pagination 클래스로 변경하여 사용할 수 있지만 Paging 클래스 만으로도 사용할 수 있는 곳이 있을 수 있습니다.
그래서 Pagination 클래스를 변수로 사용하는 별도의 Search 클래스를 생성하겠습니다.
먼저 Search 클래스에서 Paging 클래스 변수를 제외한 변수들과 Getter, Setter 메서드들을 베이스 클래스로 생성하고 Search 클래스에서 계승(상속) 받게 변경하겠습니다. 그리고 베이스 클래스를 계승(상속) 받아서 SearchEx 클래스를 생성하고 Pagination 클래스를 변수로 사용하겠습니다.
Maven Spring Project에 Common Base Search Model 추가하기
1. Java Resource > src/main/java에 com.home.study.common.search 패키지에 있는 패키지에 BaseSearch 클래스를 생성합니다. (BaseSearch.java)
- Search 클래스에 Serializable가 구현(implements)되도록 class에 implements로 Serializable를 입력합니다.
- Search 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
- 검색 타입(searchType), 검색 조건(searchCondition), 검색 키워드(searchKeyword), 사용 여부(useYesNo) 변수와 Getter, Setter를 기존 Search 클래스에서 복사하여 붙여 넣기 합니다.
package com.home.study.common.search;
import java.io.Serializable;
public class BaseSearch implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -756754534938248926L;
/**
* 검색 타입
*/
protected String searchType = "";
/**
* 검색 조건
*/
protected String searchCondition = "";
/**
* 검색 키워드
*/
protected String searchKeyword = "";
/**
* 사용 여부
*/
protected String useYesNo = "";
/**
* 검색 타입을 가져옵니다.
* @return 검색 타입
*/
public String getSearchType() {
return searchType;
}
/**
* 검색 타입을 설정합니다.
* @param searchType 검색 타입
*/
public void setSearchType(String searchType) {
this.searchType = searchType;
}
/**
* 검색 조건을 가져옵니다.
* @return 검색 조건
*/
public String getSearchCondition() {
return searchCondition;
}
/**
* 검색 조건을 설정합니다.
* @param searchCondition 검색 조건
*/
public void setSearchCondition(String searchCondition) {
this.searchCondition = searchCondition;
}
/**
* 검색 키워드를 가져옵니다.
* @return 검색 키워드
*/
public String getSearchKeyword() {
return searchKeyword;
}
/**
* 검색 키워드를 설정합니다.
* @param searchKeyword 검색 키워드
*/
public void setSearchKeyword(String searchKeyword) {
this.searchKeyword = searchKeyword;
}
/**
* 사용 여부를 가져옵니다.
* @return 사용 여부
*/
public String getUseYesNo() {
return useYesNo;
}
/**
* 사용 여부를 설정합니다.
* @param useYesNo 사용 여부
*/
public void setUseYesNo(String useYesNo) {
this.useYesNo = useYesNo;
}
}
2. Java Resource > src/main/java에 com.home.study.common.search 패키지에 있는 Search.java 파일을 오픈하고 수정합니다.
- Search 클래스가 BaseSearch 클래스가 계승(상속)되도록 class에 extends를 추가합니다.
package com.home.study.common.search;
public class Search extends BaseSearch {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 300076093391308064L;
/**
* 페이징 객체
*/
private Paging paging = null;
/**
* 페이징 객체를 가져옵니다.
* @return 페이징 객체
*/
public Paging getPaging() {
return paging;
}
/**
* 페이징 객체를 설정합니다.
* @param paging 페이징 객체
*/
public void setPaging(Paging paging) {
this.paging = paging;
}
}
Maven Spring Project에 Common SearchEx Model 추가하기
1. Java Resource > src/main/java에 com.home.study.common.search 패키지에 BaseSearch 클래스를 계승(상속) 받아서 SearchEx 클래스를 생성합니다. (SearchEx.java)
- SearchEx 클래스에 BaseSearch 클래스가 계승(상속)되도록 class에 extends를 추가합니다.
- SearchEx 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
- SearchEx 클래스에 Pagination 클래스를 변수로 생성하고 Getter, Setter를 생성합니다.
package com.home.study.common.search;
public class SearchEx extends BaseSearch {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 863405122989816160L;
/**
* 페이지네이션 객체
*/
private Pagination pagination = null;
/**
* 페이지네이션 객체를 가져옵니다.
* @return 페이지네이션 객체
*/
public Pagination getPagination() {
return pagination;
}
/**
* 페이지네이션 객체를 설정합니다.
* @param pagination 페이지네이션 객체
*/
public void setPagination(Pagination pagination) {
this.pagination = pagination;
}
}
Maven Spring Project에 Board Search Model 수정하기
1. Java Resource > src/main/java에 com.home.study.test1.board.model 패키지에 있는 BoardSearch.java 파일을 오픈하고 수정합니다.
- BoardSearch 클래스가 SearchEx 클래스로부터 계승(상속)되도록 변경합니다.
package com.home.study.test1.board.model;
import com.home.study.common.search.SearchEx;
public class BoardSearch extends SearchEx {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 8154425410965108205L;
}
Maven Spring Project의 Board Mapper XML에서 Pagination으로 수정하기
1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.
- paging를 pagination으로 변경합니다.
<!--
게시판 리스트를 가져옵니다.
-->
<select id="selectBoardList" parameterType="BoardSearch" resultMap="BoardMap">
SELECT BRD.BRD_SEQ,
BRD.BRD_SUBJECT,
BRD.REG_ID,
DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS REG_DTM
FROM INT_BOARD_TB BRD
<include refid="whereBoardSearch"/>
ORDER BY BRD.REG_DTM DESC
LIMIT #{pagination.pageStartRecordNo}, #{pagination.recordCountPerPage}
</select>
Maven Spring Project의 Service - Board Implement에서 Pagination으로 수정하기
1. Java Resource > src/main/java > com.home.study.test1.board.service.impl.BoardServiceImpl.java 파일을 오픈합니다.
- paging 객체를 pagination 객체로 변경합니다.
- getPaging(), setPaging() 메서드를 getPagination(), setPagination() 메서드로 변경합니다.
package com.home.study.test1.board.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;
@Service
public class BoardServiceImpl implements IBoardService {
@Autowired
IBoardDao boardDao;
@Override
public List<Board> selectBoardList(BoardSearch boardSearch) {
if (boardSearch.getPagination() == null) {
boardSearch.setPagination(new Pagination());
}
int count = boardDao.selectBoardListCount(boardSearch);
boardSearch.getPagination().setRecordTotalCount(count);
List<Board> boardList = null;
if (count > 0) {
boardSearch.getPagination().processZero();
boardList = boardDao.selectBoardList(boardSearch);
}
return boardList;
}
}
Maven Spring Project의 main.jsp에 Pagination UI 수정하기
1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 path에서 paging를 pagination으로 변경합니다.
<form:form modelAttribute="boardSearch" autocomplete="off">
<form:hidden path="pagination.pageNo" />
<div>
<form:select path="searchType">
<form:option value="subject" label="제목" />
<form:option value="subjectandcontent" label="제목+내용" />
</form:select>
<form:select path="searchCondition">
<form:option value="equal" label="일치" />
<form:option value="like" label="포함" />
</form:select>
<form:input path="searchKeyword" placeholder="검색할 키워드를 입력하세요." />
<button id="searchBtn" type="button">검색</button>
</div>
<div class="search-result">
<div>
검색 결과 : ${boardSearch.pagination.recordTotalCount}건
</div>
<div>
<form:select path="pagination.recordCountPerPage">
<form:option value="5" label="5" />
<form:option value="10" label="10" />
<form:option value="25" label="25" />
<form:option value="50" label="50" />
<form:option value="100" label="100" />
</form:select>
</div>
</div>
</form:form>
2. pagination UI를 수정합니다.
- 페이지 번호를 표시하는 JSTL의 반복문인 <c:forEach> 태그에서 begin 속성 값에 1 대신 boardSearch 객체에서 pagination 객체의 페이지 시작 번호(pageStartNo)로 변경하고 end 속성 값에 boardSearch 객체에서 paging 객체의 페이지 마지막 번호(pageLastNo) 대신 boardSearch 객체에서 pagination 객체의 페이지 종료 번호(pageEndNo)로 변경합니다.
- 전체 페이지 앞 번호는 <a> 태그로 생성하고 데이터 속성(data-pageno) 값에 1을 추가합니다.
- 이전 페이지 사이즈 번호는 <a> 태그로 생성하고 데이터 속성(data-pageno) 값에는 페이지 시작 번호(pageStartNo)에서 1을 뺀 값을 추가합니다.
- 다음 페이지 사이즈 번호는 <a> 태그로 생성하고 데이터 속성(data-pageno) 값에는 페이지 종료 번호(pageEndNo)에서 1을 더한 값을 추가합니다.
- 전체 페이지 마지막 번호는 <a> 태그로 생성하고 데이터 속성(data-pageno) 값에 페이지 마지막 번호(pageLastNo)를 추가합니다.
- 추가한 <a> 태그들은 클릭 이벤트를 공통 처리하기 위해 href 속성은 void로 처리합니다.
<c:if test="${not empty boardList}">
<div>
<ul id="boardPagination" class="pagination">
<li class="page-item"><a class="page-link page-first" data-pageno="1" href="javascript:void(0)">First</a></li>
<li class="page-item"><a class="page-link page-prev" data-pageno="${boardSearch.pagination.pageStartNo - 1}" href="javascript:void(0)"><</a></li>
<c:forEach var="page" begin="${boardSearch.pagination.pageStartNo}" end="${boardSearch.pagination.pageEndNo}" step="1">
<li class="page-item<c:if test="${boardSearch.pagination.pageNo == page}"> active</c:if>">
<a class="page-link page-no" data-pageno="${page}" href="javascript:void(0)">${page}</a>
</li>
</c:forEach>
<li class="page-item"><a class="page-link page-next" data-pageno="${boardSearch.pagination.pageEndNo + 1}" href="javascript:void(0)">></a></li>
<li class="page-item"><a class="page-link page-last" data-pageno="${boardSearch.pagination.pageLastNo}" href="javascript:void(0)">Last</a></li>
</ul>
</div>
</c:if>
3. <style> 태그에 페이지네이션 영역을 둥글게 라운드 하기 위해 CSS를 추가합니다.
.board ul.pagination li.page-item:first-child a.page-link { border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em; }
.board ul.pagination li.page-item:last-child a.page-link { border-top-right-radius: 0.5em; border-bottom-right-radius: 0.5em; }
Maven Spring Project를 실행하여 웹 브라우저로 확인하기
1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.
2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하고 페이지 크기를 10에서 5로 변경합니다.
그러면 페이지네이션에 처음과 마지막 페이지로 이동하는 버튼과 이전/다음 페이지로 이동하는 버튼이 나타나는 것을 확인할 수 있습니다.
그렇지만 현재 페이지 시작 번호(pageStartNo)가 1이기 때문에 이전 페이지 사이즈 번호는 0되고 페이지 종료 번호(pageEndNo)가 2이기 때문에 다음 페이지 사이즈 번호는 3이 되어 클릭 시 페이지 번호가 없어 오류가 발생할 수 있습니다.
그러나 Paging 클래스와 Pagination 클래스에서 현재 페이지 번호(pageNo)가 0 보다 작거나 같으면 1로 보정하고 페이지 마지막 번호(pageLastNo) 보다 크면 페이지 마지막 번호로 보정해 주기 때문에 오류가 발생하지 않습니다.
이어서 페이지네이션에서 사용되는 이전 페이지 사이즈 번호와 다음 페이지 사이즈 번호를 내부에서 계산하고 버튼 활성화 여부도 처리하여 Script에서 처리 없이 사용할 수 있도록 하겠습니다.
'Spring > Maven Project' 카테고리의 다른 글
Spring에 게시물 등록 처리 - Create, Client-Side Validation (0) | 2023.01.08 |
---|---|
Spring에 Pagination(페이지네이션) 처리 및 적용 3 (0) | 2023.01.01 |
Spring에 Pagination(페이지네이션) 처리 및 적용 1 (0) | 2022.12.18 |
Spring에 Paging(페이징) 처리 및 적용 (0) | 2022.12.11 |
Spring에 spring-form JSP Tag Library 사용 - <form:form> <form:hidden> <form:select> <form:option> <form:input> (0) | 2022.11.28 |