Develop/Spring

[Spring] JPA Pageable로 페이징 구현하기

DevPi 2024. 10. 17. 10:02
반응형

대규모 데이터를 다룰 때, 한 번에 모든 데이터를 가져오는 것은 성능 상 문제가 될 수 있습니다. 이때 페이징(Pagination)을 통해 데이터를 나누어 처리하면 메모리 사용량을 줄이고, 서버 성능을 최적화할 수 있습니다. Spring Data JPA에서는 Pageable 인터페이스를 사용하여 간단하게 페이징을 구현할 수 있습니다.

이번 포스팅에서는 Pageable의 개념, 사용법, 그리고 페이징과 정렬을 어떻게 적용하는지 살펴보겠습니다.


1. Pageable이란?

Pageable은 Spring Data JPA에서 제공하는 인터페이스로, 특정 페이지의 데이터를 가져오는 데 필요한 정보를 정의합니다. 페이지 번호, 한 페이지에 포함될 데이터의 개수, 정렬 방식 등을 설정할 수 있습니다. 이와 함께 사용되는 PageRequest는 Pageable 인터페이스의 구현체로, 페이징 요청을 직접 생성할 때 사용됩니다.

Spring Data JPA의 리포지토리는 페이징 기능을 기본적으로 지원하며, Page 객체를 통해 페이징된 결과를 반환합니다.


2. Pageable 사용 예시

Spring Data JPA에서 페이징을 구현하는 방법은 매우 간단합니다. Pageable 객체를 리포지토리 메서드에 파라미터로 전달하여, 원하는 페이지와 데이터 개수를 쉽게 설정할 수 있습니다.

 

2.1 Pageable 생성

우선 PageRequest 객체를 사용하여 페이징 요청을 설정해 봅시다. 여기서는 첫 번째 페이지(0번 페이지)부터, 한 페이지에 10개의 데이터를 요청하는 예제입니다.

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

public class PagingExample {

    public void createPageable() {
        int page = 0;  // 페이지 번호 (0부터 시작)
        int size = 10; // 한 페이지에 가져올 데이터 수

        Pageable pageable = PageRequest.of(page, size);  // Pageable 객체 생성
    }
}

 

2.2 리포지토리에서 Pageable 사용

리포지토리에서 Pageable을 사용하면, 페이징된 결과를 Page<T> 객체로 받을 수 있습니다. 예를 들어, findAll(Pageable pageable) 메서드를 사용하여 전체 데이터에서 특정 페이지만 조회할 수 있습니다.

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

    // 페이징된 사용자 목록을 반환
    Page<User> findAll(Pageable pageable);
}

 

2.3 페이징된 결과 처리

페이징된 데이터를 가져오면, Page<T> 객체로 반환되며, 이 객체에는 페이징된 데이터뿐만 아니라, 전체 페이지 수, 전체 데이터 개수 등의 정보도 포함되어 있습니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void getUsersWithPagination() {
        int page = 0;  // 첫 번째 페이지
        int size = 10; // 페이지 당 10개의 데이터를 가져옴
        PageRequest pageable = PageRequest.of(page, size);

        // 페이징된 사용자 리스트
        Page<User> userPage = userRepository.findAll(pageable);

        // 총 페이지 수
        int totalPages = userPage.getTotalPages();
        // 전체 데이터 수
        long totalElements = userPage.getTotalElements();
        // 현재 페이지의 데이터 목록
        List<User> users = userPage.getContent();
    }
}

 

  • getTotalPages(): 전체 페이지 수를 반환합니다.
  • getTotalElements(): 전체 데이터 수를 반환합니다.
  • getContent(): 현재 페이지에 포함된 실제 데이터를 반환합니다.

3. 페이징 + 정렬

Spring Data JPA의 PageRequest는 페이징과 정렬을 동시에 처리할 수 있습니다. 예를 들어, 사용자를 이름을 기준으로 오름차순 정렬하면서 페이징 처리할 수 있습니다.

 

3.1 페이징과 정렬 동시 적용

정렬을 추가하려면 Sort 객체를 사용하면 됩니다. 아래 코드는 name 필드를 기준으로 오름차순 정렬하면서 페이징된 데이터를 가져오는 예제입니다.

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public class PagingSortingExample {

    public void createPageableWithSorting() {
        int page = 0;  // 첫 번째 페이지
        int size = 10; // 페이지 당 10개의 데이터를 가져옴

        // 정렬 기준: name 필드를 기준으로 오름차순 정렬
        Sort sort = Sort.by("name").ascending();
        
        Pageable pageable = PageRequest.of(page, size, sort);
    }
}

 

이렇게 하면, 페이징된 결과는 name 필드를 기준으로 정렬된 상태로 반환됩니다.


4. Pageable을 사용할 때의 장점

4.1 효율적인 데이터 처리

페이징을 통해 한 번에 모든 데이터를 가져오지 않고 필요한 만큼의 데이터만 가져와서 성능을 최적화할 수 있습니다. 특히 데이터가 많을수록 페이징은 성능 개선에 큰 도움이 됩니다.

 

4.2 간편한 구현

Spring Data JPA에서 제공하는 Pageable 인터페이스를 사용하면, 복잡한 페이징 로직을 직접 구현할 필요가 없습니다. 몇 줄의 코드만으로 간편하게 페이징 처리가 가능합니다.

 

4.3 정렬과 페이징의 통합

정렬 기능과 페이징을 한 번에 처리할 수 있으므로, 데이터 처리에 대한 유연성이 높아집니다. PageRequest를 통해 페이징과 정렬을 쉽게 설정할 수 있습니다.

 

4.4 리포지토리와의 통합

Spring Data JPA의 리포지토리는 기본적으로 페이징을 지원하며, 필요한 쿼리를 복잡한 SQL 없이 간단한 메서드로 처리할 수 있습니다.


5. 마무리

Spring Data JPA에서 Pageable과 PageRequest를 활용하면, 간단하게 페이징과 정렬을 구현할 수 있습니다. 특히 대규모 데이터를 효율적으로 처리할 때 페이징은 필수적이며, 이를 통해 성능을 최적화할 수 있습니다.

반응형