728x90

웹 애플리케이션에서 대량의 데이터를 클라이언트에게 제공할 때, 모든 데이터를 한 번에 전송하는 것은 비효율적일 뿐만 아니라 성능 문제를 일으킬 수 있습니다.

 

이 문제를 해결하기 위해 대부분의 애플리케이션에서는 페이징(Pagination)을 도입합니다. Spring Framework에서는 페이징정렬을 쉽게 처리할 수 있도록 Pageable 인터페이스를 제공합니다.


본 글에서는 Spring Data JPA에 대해서 공부한 지식을 정리한 글입니다.

Pageable이란❓

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

 

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

 

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

 

Pageable의 주요 옵션

Pageable은 세 가지 주요 옵션을 제공합니다.

 

page

 

  • 설명: 현재 페이지 번호를 지정합니다. 페이지 번호는 0부터 시작합니다.
  • 기본값: 0

 

size

 

  • 설명: 페이지당 항목 수를 지정합니다.
  • 기본값: 20 (설정에 따라 다를 수 있음)

 

sort

 

  • 설명: 데이터의 정렬 기준을 설정합니다. 필드와 방향을 함께 지정할 수 있습니다.
  • 형식: 정렬필드,정렬방향 (asc 또는 desc)

PageRequest란❓

PageRequest는 Spring Data JPA에서 제공하는 Pageable 구현체 중 하나로, 페이지 정보를 생성하는 클래스입니다.

PageRequest 주요 메서드

 

  • 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 객체를 반환합니다.

 

  • previousOrFirst()
    • 이전 페이지를 위한 PageRequest 객체를 반환합니다. 이전 페이지가 없으면 첫 페이지를 반환합니다.

 

 


그러면 Pageabe과 PageRequest의 차이점은 뭐가 있을까?

  • Pageable
    • 형태: 인터페이스
    • 역할: 페이징과 정렬을 정의하는 표준 인터페이스
    • 용도: 페이징 처리에 필요한 정보의 추상화 제공
  • PageRequest
    • 형태: 구체적인 클래스 (구현체)
    • 역할: Pageable 인터페이스를 구현하며 실제로 페이지 번호, 페이지 크기, 정렬 기준을 설정하는 데 사용됨
    • 용도: 페이징 설정을 위해 사용되며 Pageable의 구체적인 구현체 제공

결론적으로, Pageable페이징정렬을 위한 정보를 정의하는 인터페이스입니다.

 

PageRequestPageable 인터페이스구현한 구체적인 클래스입니다. PageRequest는 페이지정렬 기준을 설정하여 실제 페이징 처리를 수행하는 데 사용됩니다.

 

즉, 기본적인 페이징 정렬을 설정할 때는 Pageable을 사용할 수 있고, 구체적인 페이징 처리정렬 기준을 설정하려면 PageRequest 클래스를 사용하는 것이 적절하다고 생각합니다.

 

 

Pageable 사용법

@GetMapping("/users")
public ResponseEntity<Page<UserResponseDto>> getAllUsers(Pageable pageable) {
    Page<UserResponseDto> users = userService.getAllUsers(pageable);
    return ResponseEntity.ok(users);
}

 

Pageable을 사용하는 가장 기본적인 방법컨트롤러 메소드 에서 Pageable 객체파라미터로 받는 것입니다. Spring Data JPA는 자동으로 쿼리 파라미터를 기반으로 Pageable 객체를 생성하고, 이를 서비스나 리포지토리 메소드에 전달할 수 있습니다.

 

@PageableDefault로 기본값 설정

@PageableDefault 어노테이션을 사용하면 기본 페이지 번호, 크기, 정렬 기준을 설정할 수 있습니다.

@GetMapping("/users")
public ResponseEntity<Page<UserResponseDto>> getAllUsers(
        @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.ASC) Pageable pageable) {
    Page<UserResponseDto> users = userService.getAllUsers(pageable);
    return ResponseEntity.ok(users);
}

 

 

Pageable을 활용한 페이징 처리

Pageable을 통해 페이징 요청이 들어오면, Spring Data JPA는 데이터베이스에서 해당 페이지의 데이터만 조회합니다.

 

조회된 데이터는 Page<T> 객체에 담겨 반환됩니다. Page<T>페이징 정보(총 페이지 수, 총 항목 수 등)와 함께 데이터 리스트를 포함하는 객체입니다.

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

@Service
public class ItemService {

    @Autowired
    private ItemRepository itemRepository;

    public Page<ResponseDto> getItems(Pageable pageable) {
        // 데이터베이스에서 페이징 처리된 데이터를 조회
        Page<Item> itemPage = itemRepository.findAll(pageable);
        
        // Item 엔티티를 ResponseDto로 변환하여 Page<ResponseDto>로 반환
        return itemPage.map(ResponseDto::of);
    }
}

 

이 Page<T> 객체는 필요에 따라 다양한 형태로 변환할 수 있습니다.

  • 데이터 가공
    • getContent() 메서드를 통해 반환된 데이터 리스트를 가공하거나 필터링할 수 있습니다.
  • DTO 변환
    • 데이터 엔티티를 비즈니스 요구사항에 맞는 DTO(Data Transfer Object)로 변환할 수 있습니다.
  • 통계 정보 추가
    • 페이지 정보와 함께 추가적인 통계 정보를 포함시킬 수 있습니다.

Spring Data JPA의 PageablePageRequest는 대량의 데이터를 효율적으로 처리하고 성능을 최적화하는 데 매우 유용한 도구입니다.

 

Pageable 인터페이스는 페이징과 정렬을 위한 정보를 정의하는 표준을 제공하며, PageRequest 클래스는 이를 구체적으로 구현하여 페이지 번호, 크기, 정렬 기준 등을 설정하는 데 사용됩니다.

 

이러한 페이징 기법을 통해 클라이언트는 필요한 데이터만 적시에 받아볼 수 있고, 서버는 불필요한 데이터 전송을 줄여 성능을 향상시킬 수 있습니다. 이를 활용하면 웹 애플리케이션의 응답 속도를 개선하고 사용자 경험을 높일 수 있습니다.