Java Spring Boot(8)

제이 용·2025년 11월 18일

오늘은 페이징 조회라는 것을 다뤄볼 예정이다. 마지막 요구사항인데 일단 페이징 조회가 무엇인지부터 알아봐야겠다.


페이징 조회

  • 데이터들을 페이지 단위로 쪼개서 보여줄 수 있게 해주는 전략 이라고 볼 수 있다.
  • 데이터베이스의 레코드를 개수로 나눠 페이지를 구분하는 것

왜 써야 하는가?

  • 댓글이 2개, 10개일 때는 괜찮은데. 1만 개, 10만 개가 되면 서버가 한 번에 다 들고 오기 부담됨.

  • 데이터가 많아질 때 성능 문제를 막기 위해 페이징

어떻게 쓸 수 있을까?

  • JPA 에서는 페이징 처리를 하기 위해 Page, Pageable을 사용한다.

Pageable?

Pageable은 Spring Data JPA에서 페이징 기능을 쉽게 구현할 수 있도록 제공하는 인터페이스입니다.

Pageable 인터페이스는 페이지 번호(page), 페이지 크기(size), 정렬 (sort) 정보를 담고 있으며, 이를 통해 데이터베이스에서 필요한 부분의 데이터만 가져올 수 있습니다.

Pageable을 사용하면 특정 페이지에 해당하는 데이터만 가져오고, 정렬 기준을 지정하여 원하는 순서대로 데이터를 정렬할 수 있습니다. 이를 통해 클라이언트는 필요한 데이터만 적시에 받아볼 수 있으며, 서버의 성능 또한 최적화할 수 있습니다.

출처 : https://pixx.tistory.com/374

내부옵션

  • page
  • 설명: 현재 페이지 번호를 지정합니다. 페이지 번호는 0부터 시작합니다.
  • 기본값: 0
  • size
  • 설명: 페이지당 항목 수를 지정합니다.
  • 기본값: 20 (설정에 따라 다를 수 있음)
  • sort
  • 설명: 데이터의 정렬 기준을 설정합니다. 필드와 방향을 함께 지정할 수 있습니다.
  • 형식: 정렬필드,정렬방향 (asc 또는 desc)

PageRequest

  • JPA에서 제공하는 Pageable 구현체 중 하나로, 페이지 정보를 생성하는 클래스

내부옵션

  • of(int page, int size)
    페이지 번호와 크기를 설정하여 PageRequest 객체를 생성합니다.
  • of(int page, int size, Sort sort)
    페이지 번호, 크기, 정렬 기준을 설정하여 PageRequest 객체를 생성합니다.
  • next()
    다음 페이지를 위한 PageRequest 객체를 반환합니다.
  • getPageNumber()
    현재 페이지 번호를 반환합니다 (0부터 시작).
  • getPageSize()
    한 페이지당 최대 항목 수를 반환합니다.
  • getOffset()
    현재 페이지의 시작 위치를 반환합니다.
  • getSort()
    정렬 정보를 반환합니다.
  • next()
    다음 페이지의 Pageable 객체를 반환합니다.
  • previous()
    이전 페이지의 Pageable 객체를 반환합니다.

요약

  • 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));
    }
  • Page<DTO;>

페이징 정보(총 페이지 수, 총 항목 수 등)와 함께 데이터 리스트를 포함하는 객체

  • Pageable 객체를 파라미터로 받는 것

Spring Data JPA는 자동으로 쿼리 파라미터를 기반으로 Pageable 객체를 생성하고, 이를 서비스나 리포지토리 메소드에 전달할 수 있다.

  • @PageableDefault

기본 페이지 번호, 크기, 정렬 기준을 설정할 수 있다. 위는 기본적인 내부 일정 개수를 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이 겹치는 것은 없는지 확인해 주어야한다.

기본적으로 언급되는 오류들을 전부 몸소 느껴봐서 중요하다는 것을 다시 한번 깨달았다.

0개의 댓글