페이징 (Paging)
페이징(Paging)은 데이터를 한 번에 모두 보여주는 대신, 여러 페이지에 나누어 보여주는 방법입니다.
데이터가 많아지면 한 화면에 전부 출력하는 것은 비효율적이기 때문에 사용자가 원하는 만큼의 데이터만 나누어 보여주도록 하는 것입니다.
예를 들어, 게시판에서 글이 100개가 있을 때 한 페이지에 10개씩 보여준다면 총 10개의 페이지로 나누어 표시하는 방식이 페이징입니다.
페이징 객체 & 클래스
1. 스프링에서는 페이징 처리를 위해 Pageable과 Page 객체를 사용합니다.
- Pageable : 페이지 번호와 페이지당 데이터 개수 등의 페이징 정보를 담는 객체입니다.
Pageable pageable = PageRequest.of(0, 10); // 0번째 페이지부터 10개씩 가져오기
- Page : 페이징된 데이터와 함께 전체 페이지 수, 총 데이터 개수 등의 정보를 담는 객체입니다.
Page<Question> paging = questionRepository.findAll(PageRequest.of(0, 10));
2. 페이징 정보를 설정할 때 PageRequest 클래스를 사용합니다.
(1) 0번째 페이지부터 10개씩 가져오기
Pageable pageable = PageRequest.of(0, 10); // 0번째 페이지부터 10개씩 가져오기
- of(int page, int size)
- page : 페이지 번호 (0부터 시작)
- size : 한 페이지에 보여줄 데이터 개수
(2) 데이터를 특정 기준으로 정렬할 때는 Sort 객체를 사용합니다.
public Page<Question> getList(int page) {
// 1. 정렬 기준을 설정하기 위한 Sort.Order 객체 생성
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDate")); // 'createDate' 필드를 기준으로 내림차순 정렬
// 2. Pageable 객체 생성 (페이지 번호, 페이지당 개수, 정렬 기준)
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
// 3. Repository를 통해 페이징된 결과를 반환
return this.questionRepository.findAll(pageable);
}
- Sort.by("createDate").descending()
- createDate 필드를 기준으로 내림차순 정렬합니다.
페이징 주요 메서드
페이징 결과는 Page 객체를 통해 반환되며 다음과 같은 주요 메서드를 제공합니다.
메서드 | 설명 | 반환 값 |
isEmpty() | 데이터가 존재하는지 여부를 확인합니다. | true 또는 false |
getTotalElements() | 전체 데이터의 총 개수를 반환합니다. | long (숫자) |
getTotalPages() | 전체 페이지 수를 반환합니다. | int (숫자) |
getSize() | 한 페이지에 표시되는 데이터 개수를 반환합니다. | int (숫자) |
getNumber() | 현재 페이지 번호를 반환합니다. | int (숫자) |
hasPrevious() | 이전 페이지의 존재 여부를 확인합니다. | true 또는 false |
hasNext() | 다음 페이지의 존재 여부를 확인합니다. | true 또는 false |
getContent() | 현재 페이지의 데이터를 리스트로 반환합니다. | List<T> (객체 리스트) |
getNumberOfElements() | 현재 페이지에 포함된 데이터 개수를 반환합니다. | int (숫자) |
hasContent() | 현재 페이지에 데이터가 존재하는지 확인합니다. | true 또는 false |
getPageable() | 페이징 관련 설정 객체를 반환합니다. | Pageable 객체 |
getSort() | 데이터 정렬 기준을 반환합니다. | Sort 객체 |
페이징 속성
Spring의 페이징 기능에서는 Page 객체에 담긴 데이터를 관리하는 여러 속성들이 존재합니다. 이 속성들은 데이터의 상태나 정보(예: 현재 페이지 번호, 페이지 크기 등)를 표현합니다.
속성 | 설명 | 예시 |
paging.number | 현재 페이지 번호를 나타냅니다. | paging.number = 2 (3번째 페이지) |
paging.size | 한 페이지에 보여줄 데이터 개수입니다. | paging.size = 10 |
paging.totalPages | 전체 페이지 개수를 나타냅니다. | paging.totalPages = 5 |
paging.totalElements | 전체 데이터 개수를 나타냅니다. | paging.totalElements = 45 |
paging.hasNext | 다음 페이지 존재 여부를 나타냅니다. | paging.hasNext = true |
paging.hasPrevious | 이전 페이지 존재 여부를 나타냅니다. | paging.hasPrevious = false |
➡️ 예시
<td th:text="${paging.getTotalElements - (paging.number * paging.size) - loop.index}"></td>
- loop.index : 반복문에서의 현재 항목 인덱스입니다. (loop.index = 0 (첫 번째 항목))
출처
OpenAI의 ChatGPT (https://openai.com)
점프 투 스프링 부트 책 : https://wikidocs.net/162090
'Java Framework > Spring' 카테고리의 다른 글
[Spring] JPA Specification (1) | 2025.02.19 |
---|---|
[Spring] Bean (1) | 2025.02.12 |
[Spring] 바인딩 (Binding) (0) | 2025.02.09 |
[Spring] Validation Library 데이터 유효성 검사 (0) | 2025.02.08 |
[Spring] HTTP Method (0) | 2025.02.07 |