오늘의 학습 키워드
페이징 구현
페이징 적용
PageRequest.of(int page, int size) : 0부터 시작하는 페이지 번호와 개수. 정렬이 지정되지 않음
PageRequest.of(int page, int size, Sort sort) : 페이지 번호와 개수, 정렬 관련 정보
PageRequest.of(int page int size, Sort sort, Direction direction, String ... props) : 0부터 시작하는 페이지 번호와 개수, 정렬의 방향과 정렬 기준 필드들
pageable.getTotalPages() : 총 페이지 수
pageable.getTotalElements() : 전체 개수
pageable.getNumber() : 현재 페이지 번호
pageable.getSize() : 페이지 당 데이터 개수
pageable.hasnext() : 다음 페이지 존재 여부
pageable.isFirst() : 시작페이지 여부
pageable.getContent(), PageRequest.get() : 실제 컨텐츠를 가지고 오는 메서드. getContext는 List<Entity> 반환, get()은 Stream<Entity> 반환
Sort sort1 = Sort.by("name").descending(); // 내림차순
Sort sort2 = Sort.by("password").ascending(); // 오름차순
Sort sortAll = sort1.and(sort2); // 2개이상 다중정렬도 가능하다
Pageable pageable = PageRequest.of(0, 10, sortAll); // pageable 생성시 추가 / (페이지 넘버, limit, sort)
public class PageDTO {
@Positive // 0보다 큰수
private Integer currentPage;
private Integer size;
private String sortBy;
public Pageable toPageable() {
return PageRequest.of(currentPage-1, size, Sort.by(sortBy).descending());
}
}
@GetMapping
public ResponseEntity<Page<EventResponse>> getAllEvents(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by(Direction.DESC, "createdAt"));
Page<EventResponse> eventResponses = eventService.getAllEvents(pageable);
return ResponseEntity.ok().body(eventResponses);
}
@Transactional(readOnly = true)
public Page<EventResponse> getAllEvents(Pageable pageable) {
return eventRepository.findAll(pageable)
.map(event -> {
List<Long> eventProducts = eventQuery.getEventProducts(event.getId());
return EventResponse.from(event, eventProducts);
});
}
public List<Long> getEventProducts(Long eventId) {
return jpaQueryFactory.select(
QEventProduct.eventProduct.product.id)
.from(QEventProduct.eventProduct)
.where(QEventProduct.eventProduct.event.id.eq(eventId))
.fetch();
}
{
"content": [
{
"id": 2,
"title": "제목",
"content": "내용",
"limitNum": null,
"openAt": "2024-05-09",
"eventProducts": [
1,
2
]
},
{
"id": 1,
"title": "제목",
"content": "내용",
"limitNum": null,
"openAt": "2024-05-09",
"eventProducts": [
1,
2
]
}
],
"pageable": {
"pageNumber": 0, // 페이지 번호 (0번 부터 시작)
"pageSize": 20, // 페이지 크기
"sort": {
"empty": false, // 정렬 상태
"unsorted": false,
"sorted": true
},
"offset": 0, // 해당 페이지의 첫번째 요소의 전체 순번
"paged": true,
"unpaged": false
},
"last": true,
"totalPages": 1, // 페이지로 제공되는 총 페이지 수
"totalElements": 2, // 모든 페이지에 존재하는 총 원소 수
"sort": {
"empty": false, // 정렬 사용 여부
"unsorted": false,
"sorted": true
},
"first": true, // 첫페이지 여부
"size": 20, // Contents 사이즈
"number": 0,
"numberOfElements": 2, // Contents 의 원소 수
"empty": false // 공백 여부
}