반응형
페이징(Paging) 처리란?
웹 애플리케이션에서 특히 게시판에서 대량의 데이터를 사용자에게 효율적으로 제공하기 위해서는 페이징 처리가 필수적입니다.
페이징 처리는 데이터를 여러 페이지로 나누어 사용자에게 표시하며, 이를 통해 한 화면에서 적절한 양의 정보만을 제공함으로써 사용자 경험을 개선할 수 있습니다.
이 글에서는 기본 페이징 처리를 위한 PageInfo 클래스의 정의와 이를 활용한 방법을 설명합니다.
페이징 처리를 위한 PageInfo 클래스 정의
페이징 처리를 위해서는 먼저 여러 가지 정보를 저장할 PageInfo 클래스를 정의해야 합니다.
다음은 PageInfo 클래스의 예시입니다.
public class PageInfo {
private int pageNum; // 현재 페이지 번호
private int listLimit; // 페이지 당 게시물 목록 갯수
private int listCount; // 총 게시물 수
private int pageListLimit; // 페이지 당 표시할 페이지 번호 수
private int maxPage; // 전체 페이지 수
private int startPage; // 시작 페이지 번호
private int endPage; // 끝 페이지 번호
// 기본 생성자
public PageInfo() {}
// 파라미터 생성자
public PageInfo(int pageNum, int listLimit, int listCount, int pageListLimit, int maxPage, int startPage, int endPage) {
this.pageNum = pageNum;
this.listLimit = listLimit;
this.listCount = listCount;
this.pageListLimit = pageListLimit;
this.maxPage = maxPage;
this.startPage = startPage;
this.endPage = endPage;
}
// Getter/Setter 생략...
}
게시글 목록 조회를 위한 컨트롤러 설정
게시글 목록을 조회하는 컨트롤러를 정의할 때, pageNum 파라미터를 현재 페이지 번호로 받아옵니다. 기본값은 1로 설정합니다.
public String list(@RequestParam(defaultValue = "1") int pageNum, Model model) {
// ...생략
}
페이징 처리를 위한 계산 작업
페이징 처리를 위해서는 다음과 같은 계산이 필요합니다.
1. 한 페이지에 표시할 게시물 컨텐츠 수 설정
- int listLimit = 10;
- 한 페이지에 표시할 게시물의 개수를 설정합니다.
- 이 예시에서는 한 페이지에 최대 10개의 게시물을 표시하도록 설정합니다.
2. 한 페이지에 표시할 페이지 번호 수 설정
- int pageListLimit = 10;
- 한 페이지에 표시할 페이지 번호의 개수를 설정합니다. 이 예시에서는 한 페이지에 최대 10개의 페이지 번호를 표시합니다.
3. 조회 시작 게시물 번호 계산
- int startRow = (pageNum - 1) * listLimit;
- 현재 페이지 번호에 따라 조회를 시작할 게시물의 번호를 계산합니다.
- 예를 들어, 현재 페이지가 2페이지라면 (2 - 1) * 10 = 10이 되어 10번째 게시물부터 조회하게 됩니다.
4. 게시물 목록 조회
- 현재 페이지에 따라 조회를 시작해야 하므로, startRow(어디부터 조회)와 listLimit(몇 개까지 조회)을 파라미터로 전달합니다.
List<BoardVO> boardList = service.getBoardList(startRow, listLimit);
- 전달받은 파라미터는 데이터베이스 쿼리에서 아래와 같이 활용됩니다.
SELECT * FROM board LIMIT #{startRow}, #{listLimit}
5. 전체 게시물 수 조회
- int listCount = service.getBoardListCount();
- 데이터베이스 쿼리를 사용해 전체 게시물의 수를 조회합니다.
SELECT COUNT(*) FROM board
6. 최대 페이지 수 계산
- int maxPage = (int)Math.ceil((double)listCount / listLimit);
- Math.ceil() 메서드를 활용하여 소수점 올림 처리를 통해 전체 페이지 수를 계산합니다.
- 예를 들어, 전체 게시물이 30개라면 30 / 10 = 3이 되어 전체 페이지는 3이 됩니다.
- 만약 31개라면 31 / 10 = 3.1이 되고, 올림 처리로 인해 전체 페이지는 4가 됩니다.
7. 시작 페이지 번호 계산
- int startPage = ((pageNum - 1) / pageListLimit) * pageListLimit + 1;
- 현재 페이지 번호에 따라 시작 페이지 번호를 계산합니다.
- 예를 들어, 현재 페이지 번호가 15라면, 시작 페이지 번호는 11이 됩니다.
- 이는 하단의 페이지 번호가 11, 12, 13, 14, 15, 16, 17, 18, 19, 20으로 표시되기 때문입니다.
8. 끝 페이지 번호 계산
- int endPage = startPage + pageListLimit - 1;
- 끝 페이지 번호를 계산합니다.
- 끝 페이지 번호가 최대 페이지 번호보다 클 경우, 끝 페이지 번호를 최대 페이지 번호로 설정해줍니다:
if (endPage > maxPage) {
endPage = maxPage;
}
- 이렇게 계산된 페이징 처리 정보를 저장하는 PageInfo 클래스 인스턴스를 생성하고 데이터를 저장합니다.
PageInfo pageInfo = new PageInfo(pageNum, listLimit, listCount, pageListLimit, maxPage, startPage, endPage);
컨트롤러에서 페이징 처리 정보 전달
- 컨트롤러 내부에서는 게시물 목록(boardList)과 페이징 처리 정보(pageInfo)를 Model 객체에 저장합니다.
model.addAttribute("boardList", boardList);
model.addAttribute("pageInfo", pageInfo);
게시판 리스트에서 페이징 처리 구현
- 게시판 리스트 JSP 파일 내에서 pageInfo 정보를 받아 페이징 처리를 구현합니다.
- 예를 들어, 이전 버튼, 다음 버튼, 페이지 번호 직접 클릭, 페이지 번호 나열 등을 다음과 같이 구현할 수 있습니다.
<% PageInfo pageInfo = (PageInfo)request.getAttribute("pageInfo"); %>
<input type="button" value="이전"
<% if(pageInfo.getPageNum() > pageInfo.getStartPage()) { %>
onclick="location.href='BoardList.bo?pageNum=${pageInfo.pageNum - 1}'"
<% } %>
>
<!-- 시작 페이지부터 끝 페이지까지 페이지 번호 표시 -->
<c:forEach var="i" begin="${pageInfo.startPage}" end="${pageInfo.endPage}">
<!-- 현재 페이지 번호와 i 값이 같을 경우 하이퍼링크 없이 페이지 번호 표시 -->
<!-- 그렇지 않으면, pageNum 파라미터를 i 값으로 설정하여 BoardList.bo 서블릿 주소 링크 -->
<c:choose>
<c:when test="${i eq pageInfo.pageNum}">${i}</c:when>
<c:otherwise><a href="BoardList.bo?pageNum=${i}">${i}</a></c:otherwise>
</c:choose>
</c:forEach>
<!-- 현재 페이지 번호가 끝 페이지 번호보다 작을 때 -->
<input type="button" value="다음"
<% if(pageInfo.getPageNum() < pageInfo.getMaxPage()) { %>
onclick="location.href='BoardList.bo?pageNum=${pageInfo.pageNum + 1}'"
<% } %>
>
- 위 코드를 사용하여 JSP 파일 내에서 간편하게 페이지 번호를 표시하고 이동할 수 있습니다.
- 이를 통해 사용자에게 보다 직관적인 페이징 UI를 제공할 수 있습니다.
마무리하며
페이징 처리는 웹 애플리케이션에서 자주 사용되는 중요한 기능입니다. 이 글에서는 PageInfo 클래스를 사용하여 페이징 처리를 구현하는 과정을 순차적으로 설명하였습니다.
페이징 처리의 원리를 이해하고 이를 구현하는 과정을 숙지한다면, 다양한 상황에서 이를 응용하여 더욱 유연한 데이터 관리를 할 수 있을 것입니다.
이 글이 여러분의 개발 여정에 도움이 되길 바랍니다.
반응형