오늘 배운 것:
Spring Data JPA에서 페이지네이션을 처리하는 방법에 대해 배웠다. Pageable
과 Page
객체를 활용해 데이터를 페이지 단위로 나누어 처리할 수 있다는 점이 인상적이었다. 특히, 대량의 데이터를 한 번에 다루는 대신, 필요한 부분만 조회할 수 있어 성능적으로도 유리하다.
페이지네이션(Pagination)은 대량의 데이터를 효율적으로 처리하기 위해 데이터를 페이지 단위로 나누어 제공하는 방식이다. 웹 애플리케이션에서 페이징 기능을 구현하면, 사용자가 한 번에 다루는 데이터의 양을 제한할 수 있어 성능이 향상되고, 더 나은 사용자 경험을 제공할 수 있다.
Pageable
과 Page
객체Spring Data JPA에서는 페이지네이션을 지원하기 위해 Pageable
과 Page
라는 두 가지 주요 객체를 제공한다.
Pageable
객체Pageable
은 요청한 페이지 정보를 담고 있다. 즉, 몇 번째 페이지를 조회할 것인지, 페이지 크기는 얼마인지 등의 정보를 포함한다.
Pageable
생성 예시:
Pageable pageable = PageRequest.of(pageNumber, pageSize);
pageNumber
: 조회할 페이지 번호 (0부터 시작).pageSize
: 한 페이지에 표시할 데이터 개수.Page<T>
객체Page<T>
는 페이징된 데이터 결과를 담는 객체이다. 조회된 데이터뿐만 아니라 전체 페이지 수, 전체 데이터 수, 현재 페이지 정보 등의 메타데이터도 제공된다.
주요 메서드:
getContent()
: 현재 페이지의 데이터를 List<T>
형태로 반환.getTotalPages()
: 총 페이지 수 반환.getTotalElements()
: 총 데이터 수 반환.Spring Data JPA에서 페이지네이션을 구현하기 위해선 간단히 Pageable
을 파라미터로 받고, 결과로 Page<T>
를 반환하는 메서드를 사용하면 된다.
public interface TodoRepository extends JpaRepository<Todo, Long> {
// Pageable을 사용하여 페이징된 데이터를 반환하는 메서드
Page<Todo> findAll(Pageable pageable);
}
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());
}
페이지네이션을 통해 클라이언트가 요청한 특정 페이지의 데이터만 반환할 수 있다. 예를 들어, 사용자가 2번째 페이지를 요청하고, 한 페이지에 10개의 데이터를 표시하고 싶다면, PageRequest.of(1, 10)
으로 요청하고 해당 데이터만 조회해 반환할 수 있다.
Page
객체를 통해 전체 페이지 수, 현재 페이지 정보, 총 데이터 수 등을 쉽게 얻을 수 있다. 이는 클라이언트에게 페이지 정보(현재 페이지, 총 페이지 수 등)를 제공할 때 유용하다.
Page<Todo> todoPage = todoRepository.findAll(pageable);
long totalElements = todoPage.getTotalElements(); // 총 데이터 수
int totalPages = todoPage.getTotalPages(); // 총 페이지 수
느낀 점:
페이지네이션은 대량의 데이터를 효율적으로 처리하기 위한 중요한 기법이며, 특히 Pageable
과 Page
객체가 제공하는 기능들은 이를 쉽게 구현할 수 있게 도와준다. 페이징된 데이터뿐만 아니라 총 페이지 수나 데이터 수 같은 부가적인 정보를 활용할 수 있어, 클라이언트에게 더 나은 UX를 제공할 수 있을 것 같다.