페이지네이션

coldrice99·2024년 10월 15일
0

TIL: Spring Data JPA에서의 페이지네이션(Pageable, Page)

오늘 배운 것:
Spring Data JPA에서 페이지네이션을 처리하는 방법에 대해 배웠다. PageablePage 객체를 활용해 데이터를 페이지 단위로 나누어 처리할 수 있다는 점이 인상적이었다. 특히, 대량의 데이터를 한 번에 다루는 대신, 필요한 부분만 조회할 수 있어 성능적으로도 유리하다.


1. 페이지네이션(Pageable)란?

페이지네이션(Pagination)은 대량의 데이터를 효율적으로 처리하기 위해 데이터를 페이지 단위로 나누어 제공하는 방식이다. 웹 애플리케이션에서 페이징 기능을 구현하면, 사용자가 한 번에 다루는 데이터의 양을 제한할 수 있어 성능이 향상되고, 더 나은 사용자 경험을 제공할 수 있다.


2. PageablePage 객체

Spring Data JPA에서는 페이지네이션을 지원하기 위해 PageablePage라는 두 가지 주요 객체를 제공한다.

1) Pageable 객체

Pageable요청한 페이지 정보를 담고 있다. 즉, 몇 번째 페이지를 조회할 것인지, 페이지 크기는 얼마인지 등의 정보를 포함한다.

Pageable 생성 예시:

Pageable pageable = PageRequest.of(pageNumber, pageSize);
  • pageNumber: 조회할 페이지 번호 (0부터 시작).
  • pageSize: 한 페이지에 표시할 데이터 개수.

2) Page<T> 객체

Page<T>페이징된 데이터 결과를 담는 객체이다. 조회된 데이터뿐만 아니라 전체 페이지 수, 전체 데이터 수, 현재 페이지 정보 등의 메타데이터도 제공된다.

주요 메서드:

  • getContent(): 현재 페이지의 데이터를 List<T> 형태로 반환.
  • getTotalPages(): 총 페이지 수 반환.
  • getTotalElements(): 총 데이터 수 반환.

3. Spring Data JPA에서 페이지네이션 구현

Spring Data JPA에서 페이지네이션을 구현하기 위해선 간단히 Pageable을 파라미터로 받고, 결과로 Page<T>를 반환하는 메서드를 사용하면 된다.

Repository에서 페이지네이션 메서드 작성:

public interface TodoRepository extends JpaRepository<Todo, Long> {
    // Pageable을 사용하여 페이징된 데이터를 반환하는 메서드
    Page<Todo> findAll(Pageable pageable);
}

Service에서 페이지네이션 처리:

public List<TodoResponseDto> getTodoListWithPaging(int page, int size) {
    Pageable pageable = PageRequest.of(page, size);
    Page<Todo> todoPage = todoRepository.findAll(pageable);

    return todoPage.getContent().stream()
                   .map(Todo::to)  // Todo -> TodoResponseDto로 변환
                   .collect(Collectors.toList());
}

4. 페이지네이션을 통한 효율적인 데이터 처리

페이지네이션을 통해 클라이언트가 요청한 특정 페이지의 데이터만 반환할 수 있다. 예를 들어, 사용자가 2번째 페이지를 요청하고, 한 페이지에 10개의 데이터를 표시하고 싶다면, PageRequest.of(1, 10)으로 요청하고 해당 데이터만 조회해 반환할 수 있다.

  • 장점: 대량의 데이터를 한 번에 처리하지 않아도 되므로 메모리 사용이 감소하고, 응답 시간이 빨라지는 이점이 있다.

5. 전체 페이지 정보 활용

Page 객체를 통해 전체 페이지 수, 현재 페이지 정보, 총 데이터 수 등을 쉽게 얻을 수 있다. 이는 클라이언트에게 페이지 정보(현재 페이지, 총 페이지 수 등)를 제공할 때 유용하다.

예시:

Page<Todo> todoPage = todoRepository.findAll(pageable);
long totalElements = todoPage.getTotalElements();  // 총 데이터 수
int totalPages = todoPage.getTotalPages();  // 총 페이지 수

6. 오늘의 배운 점 정리

  • Pageable: 페이지 정보를 담고 있는 객체. 몇 번째 페이지, 몇 개의 데이터를 조회할지 설정 가능.
  • Page: 페이징된 데이터를 담는 객체. 조회된 데이터뿐만 아니라 메타정보(총 페이지 수, 총 데이터 수 등)를 함께 제공.
  • Spring Data JPA에서 페이지네이션은 매우 간편하게 구현할 수 있으며, 대량의 데이터를 효율적으로 처리하는 데 필수적이다.

느낀 점:
페이지네이션은 대량의 데이터를 효율적으로 처리하기 위한 중요한 기법이며, 특히 PageablePage 객체가 제공하는 기능들은 이를 쉽게 구현할 수 있게 도와준다. 페이징된 데이터뿐만 아니라 총 페이지 수나 데이터 수 같은 부가적인 정보를 활용할 수 있어, 클라이언트에게 더 나은 UX를 제공할 수 있을 것 같다.


profile
서두르지 않으나 쉬지 않고

0개의 댓글