오늘은 페이징 조회라는 것을 다뤄볼 예정이다. 마지막 요구사항인데 일단 페이징 조회가 무엇인지부터 알아봐야겠다.
왜 써야 하는가?
댓글이 2개, 10개일 때는 괜찮은데. 1만 개, 10만 개가 되면 서버가 한 번에 다 들고 오기 부담됨.
데이터가 많아질 때 성능 문제를 막기 위해 페이징
어떻게 쓸 수 있을까?
Pageable은 Spring Data JPA에서 페이징 기능을 쉽게 구현할 수 있도록 제공하는 인터페이스입니다.
Pageable 인터페이스는 페이지 번호(page), 페이지 크기(size), 정렬 (sort) 정보를 담고 있으며, 이를 통해 데이터베이스에서 필요한 부분의 데이터만 가져올 수 있습니다.
Pageable을 사용하면 특정 페이지에 해당하는 데이터만 가져오고, 정렬 기준을 지정하여 원하는 순서대로 데이터를 정렬할 수 있습니다. 이를 통해 클라이언트는 필요한 데이터만 적시에 받아볼 수 있으며, 서버의 성능 또한 최적화할 수 있습니다.
출처 : https://pixx.tistory.com/374
Pageable
형태: 인터페이스
역할: 페이징과 정렬을 정의하는 표준 인터페이스
용도: 페이징 처리에 필요한 정보의 추상화 제공
PageRequest
형태: 구체적인 클래스 (구현체)
역할: Pageable 인터페이스를 구현하며 실제로 페이지 번호, 페이지 크기, 정렬 기준을 설정하는 데 사용됨
용도: 페이징 설정을 위해 사용되며 Pageable의 구체적인 구현체 제공
//일정 페이징 조회
@GetMapping("/schedules")
public ResponseEntity<Page<GetPageScheduleResponse>> getPage(@PageableDefault(size = 10) Pageable pageable){
return ResponseEntity.status(HttpStatus.OK).body(scheduleService.getPage(pageable));
}
페이징 정보(총 페이지 수, 총 항목 수 등)와 함께 데이터 리스트를 포함하는 객체
Spring Data JPA는 자동으로 쿼리 파라미터를 기반으로 Pageable 객체를 생성하고, 이를 서비스나 리포지토리 메소드에 전달할 수 있다.
기본 페이지 번호, 크기, 정렬 기준을 설정할 수 있다. 위는 기본적인 내부 일정 개수를 10개로 기본값을 설정한 상태이다.
//일정 페이징 조회
public Page<GetPageScheduleResponse> getPage(Pageable pageable) {
PageRequest pageRequest = PageRequest.of(pageable.getPageNumber()
, pageable.getPageSize()
, Sort.by(Sort.Direction.DESC, "lastModifiedDate")
);
Page<Schedule> schedules = scheduleRepository.findAll(pageRequest);
return schedules.map(schedule -> new GetPageScheduleResponse(
schedule.getUser().getUserName(),
schedule.getTitle(),
schedule.getContent(),
commentRepository.countAllByScheduleId(schedule.getId()), // 댓글 개수
schedule.getCreatedDate(),
schedule.getLastModifiedDate()
));
}
PageRequest를 통해 페이지 번호, 크기, 정렬을 수정일 기준으로 내림차 순으로 정렬시킨 모습.
of (page, size, sort)
sort.by() DESC - 내림차순 < 방법은 여러가지이므로 구글링을 통해 채택하면된다.
주의할점
Sort.by(Sort.Direction.DESC, "lastModifiedDate")
위 코드에서 "기준"의 코드가 엔터티 속성에 있는 코드와 일치해야 오류가 나지 않으니 반드시 엔터티 속성에서 복붙해오는걸 추천합니다.
코드를 치면서 레퍼지토리 내 메서드가 카멜형식을 제대로 지켜지는 지,
컨트롤러에 각 API url이 겹치는 것은 없는지 확인해 주어야한다.
기본적으로 언급되는 오류들을 전부 몸소 느껴봐서 중요하다는 것을 다시 한번 깨달았다.