Skip to content

Latest commit

 

History

History
92 lines (78 loc) · 4.29 KB

Paging.md

File metadata and controls

92 lines (78 loc) · 4.29 KB

페이징 처리

1. 페이징 구현 단계

페이징 처리는 사용자에게 필요한 최소한의 데이터를 전송하기 위해 전체 데이터 중에서 일부분만을 보여주는 방식을 의미하는데 페이징 처리를 위해 아래와 같은 3단계를 거쳐 구현하게 됩니다.

  • URI의 문자열을 조절해 원하는 페이지의 데이터가 출력되게 하는 1단계
  • 목록 페이지 하단에 페이지 번호를 보여주고, 번호를 클릭하면 해당 페이지로 이동하는 2단계
  • 목록 페이지에서 조회나 수정 작업을 한 뒤, 다시 원래 목록 페이지로 이동할 수 있게 처리하는 3단계

2. 페이징 처리의 원칙

페이징 처리는 다음과 같은 원칙을 지켜야합니다.

  • 페이징 처리는 반드시 GET 방식만을 사용합니다.
  • 페이징 처리가 되면 조회 화면에서 반드시 목록으로 이동할 수 있어야 합니다.

    예) 게시판의 4 페이지를 보다가 특정 게시물을 조회하고,
    목록으로 이동할 경우 다시 4 페이지로 이동할 수 있어야 합니다.

  • 페이징 처리는 반드시 필요한 페이지 번호만을 제공해야 합니다.
    만약 페이지당 10개의 게시글을 출력하고, 전체 데이터가 41건이라면, 5 페이지까지 화면에 출력되어야 합니다.

3. 페이징 처리를 위한 더미데이터 삽입

createDummyData

4. 페이징 처리를 위한 SQL: LIMIT

MySQL LIMIT

SELECT *
FROM 테이블명
LIMIT 시작 데이터, 출력할 데이터 개수 

LIMIT을 사용하는 방법은 간단합니다.
만약 게시글을 10건씩 출력하고, 첫번째 페이지를 출력하고 싶다면 아래와 같이 작성하면 됩니다.

SELECT articleNo, title, content, writer, regDate, viewCnt
FROM tb_article
WHERE articleNo > 0
ORDER BY articleNo DESC, regDate DESC
LIMIT 0, 10

5. 페이징 처리를 도와줄 Criteria 클래스

지금까지 작성했던 ArticleMapper.xml의 SQL을 살펴봅시다.

  • ArticleMapper.xml: 만약 한 페이지에 보여지는 데이터가 10개가 아니라면,
    LIMIT 구문의 마지막에 10이라는 숫자가 변경되어야만 합니다.

이러한 문제점을 해결하기 위해 findAllArticlePaging()의 파라미터를 2개 받는 방법이 있습니다.
하지만, 매번 2개의 적절한 데이터를 직접 넘겨야하는 불편함이 발생합니다.
그래서, 페이징 처리를 도와줄 Criteria 클래스를 생성하고, 페이징 처리의 기준이 되는 변수들을 하나의 객체로 처리하면
보다 편리하게 사용할 수 있습니다.
이후에 추가사항이 생기더라도 메소드의 파라미터를 늘리지 않고, 객체에 필드를 추가함으로써 보다 관리가 용이해집니다.

6. 페이징 처리 요약

페이징 처리 구현을 위해 기억해두어야 할 사항들을 요약해보도록 하겠습니다.

페이지 번호 출력 처리를 위한 데이터

1. 시작 페이지 번호 (startPage)
2. 끝 페이지 번호 (endPage)
3. 전체 게시글의 수 (totalCount)
4. 이전 링크 (prev)
5. 다음 링크 (next)

끝 페이지 번호 계산식

Math.ceil(현재 페이지 번호(page) / 페이지 번호의 수(displayPageNumCount)) * 페이지 번호의 수(displayPageNumCount)

시작 페이지 번호 계산식

(끝 페이지 번호(endPage) - 페이지 번호의 수(displayPageNumCount)) + 1

끝 페이지 번호의 보정 계산식

Math.ceil(전체 게시글의 수(totalCount) / 페이지당 출력할 게시글의 수(perPageNum))

이전 링크 활성/비활성 계산식

(시작 페이지 번호(startPage) == 1) ? false : true

다음 링크 활성/비활성 계산식

(끝 페이지 번호(endPage) * 페이지당 출력할 게시글의 수(perPageNum) >= 전체 게시글의 수(totalCount)) ? false : true

목록 페이지 정보 유지

조회, 수정, 삭제 처리 후, 다시 특정 목록 페이지로 이동하기 위해서는
아래와 같은 정보를 각 페이지를 이동할 때마다 갖고 있어야 합니다.

  • 현재 목록 페이지의 번호 (page)
  • 페이지당 출력할 게시글의 수 (perPageNum)
  • 조회 게시글의 번호 (articleNo)