본문 바로가기
빅데이터 부트캠프/Spring boot

빅데이터 부트캠프 96일차

by Mecodata 2022. 11. 22.

Pageable

- 페이징을 제공하는 인터페이스

Pageable = 프론트에서 JPA Repository에 page와 size를 얼마로 설정해서 요청을 보냈는지에 대한 명령을 담는 데이터 타입

- JPA Repository에서 Pageable 객체를 참고하여 findAll을 실행하면 Page<Entity>형식으로 결과값을 반환
Page<Entity> = JPA Repository에서 Pageable 객체를 참고하여 메소드를 실행한 결과값들(Entity들)을 리스트 형식으로 담는 데이터 타입

PageRequest.of(page, size) = page와 size에 대한 요청값을 Pageable 객체에 담아 반환하는 메소드 

 

- getTotalPages() = 총 페이지 수 조회
- getTotalElements() = 총 요소의 개수 조회
- getNumber() = 현재 페이지 번호 조회
- getSize() = 페이지당 데이터 개수 조회
- hasNext() = 다음 페이지 존재 여부 반환
- hasPrevious() = 이전 페이지 존재 여부 반환
- getContent() = 데이터 조회

 

★ 페이지에 대한 요청에 대한 값을 반환할 때는 해당 페이지에 있는 데이터(dtoList), 총 페이지 번호(totalPage), 현재 페이지 번호(page), 페이지 목록 개수(size), 시작 페이지(start)&종료 페이지(end), 이전(prev)&다음(next) 페이지 존재여부, 페이지 출력 개수(pageList) 등을 하나의 객체에 담아 반환해야 좋음

 

Ex

package com.spring.page.common.dto;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.springframework.data.domain.Page;

import lombok.Data;

@Data
public class PageResultDTO<DTO, EN> {
	// DTO 리스트
	private List<DTO> dtoList;
	
	// 총 페이지 번호
	private int totalPage;
	
	// 현재 페이지 번호
	private int page;
	
	// 페이지 목록 개수
	private int size;
	
	// 시작 페이지, 종료 페이지
	private int start, end;
	
	// 이전, 다음
	private boolean prev, next;
	
	// 페이지 출력 개수
	private List<Integer> pageList; // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 형태

	public PageResultDTO(Page<EN> result, Function<EN, DTO> fn) {   //외부에서 메서드 fn을 전달받아서 사용
		this.dtoList = result.stream() //Entity로 이루어진 Page를 stream을 통해 DTO로 변환 -> List에 저장
                                     .map(fn)
                                     .collect(Collectors.toList());

		this.totalPage = result.getTotalPages();
		
		this.page = result.getPageable().getPageNumber() + 1;
		this.size = result.getPageable().getPageSize();
		
        	//tempEnd : 해당 page가 속한 페이지 목록의 마지막 번호
		int tempEnd = (int)(Math.ceil(page/10.0)) * 10;  
		
        	// 1~10, 11~20, 21~30, 31~40, 41~50, 51~60, 61~70, 71~80, 81~90, 91~100
		this.start = tempEnd - 9;
		
		this.prev = start > 1; //start가 1보다 크면 true, 1이면 false
		
        	//totalPage가 tempEnd보다 크면 tempEnd, 작으면 totalPage
		this.end = totalPage > tempEnd ? tempEnd : totalPage; 
		
        	//totalPage가 tempEnd보다 크면 true, 작으면 false -> 다음 버튼 활성화 여부
		this.next = totalPage > tempEnd; 
	
		this.pageList = IntStream.rangeClosed(this.start, this.end) 
                                        .boxed() //int를 Integer로 변환
                                        .collect(Collectors.toList()); // Integer 객체들을 list로 모음									
	}
}

 

'빅데이터 부트캠프 > Spring boot' 카테고리의 다른 글

MyBatis 세팅  (0) 2022.12.13
빅데이터 부트캠프 97일차  (0) 2022.11.23
빅데이터 부트캠프 95일차  (0) 2022.11.21
빅데이터 부트캠프 94일차  (0) 2022.11.18

댓글