본문 바로가기
스프링 부트3

스프링 부트 3에서 Pageable과 Sort 사용하기

by 굿센스굿 2024. 12. 11.
반응형

 

스프링 부트 3(Spring Boot 3)은 강력한 데이터 페이징 및 정렬 기능을 제공하여 대규모 데이터셋을 효율적으로 처리할 수 있도록 돕습니다. Pageable과 Sort는 이러한 작업의 핵심 컴포넌트로, 데이터베이스에서 데이터를 조회할 때 페이징(paging)과 정렬(sorting)을 간단하게 구현할 수 있습니다. 이번 글에서는 Pageable과 Sort의 기본 개념, 사용법, 그리고 실습 예제 3가지를 통해 스프링 부트 3에서 이 기능들을 효과적으로 사용하는 방법을 살펴보겠습니다.


1. Pageable과 Sort란 무엇인가?

Pageable

Pageable은 페이징 처리를 위한 인터페이스로, 한 번에 가져올 데이터의 크기와 페이지 번호를 정의합니다. 이를 통해 사용자는 필요한 만큼의 데이터를 한 번에 가져와 성능을 최적화할 수 있습니다.

  • 주요 속성
    • page: 조회할 페이지 번호(0부터 시작)
    • size: 한 페이지에 포함할 데이터 개수
    • sort: 정렬 기준

Sort

Sort는 정렬 조건을 정의하는 객체로, 특정 속성을 기준으로 데이터의 순서를 지정할 수 있습니다. ASC(오름차순)와 DESC(내림차순)으로 정렬 방향을 설정할 수 있습니다.


2. Pageable과 Sort 사용법

(1) Spring Data JPA 리포지토리에서의 활용

Spring Data JPA는 Pageable과 Sort를 기본적으로 지원합니다. 다음과 같이 리포지토리 인터페이스에서 메서드를 정의할 수 있습니다.

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

public interface ProductRepository extends JpaRepository<Product, Long> {
    // Pageable과 Sort를 활용한 메서드
    Page<Product> findByCategory(String category, Pageable pageable);
}

3. 실습 예제

예제 1: 기본 페이징 처리

간단한 페이징 기능을 구현하는 예제입니다. 예를 들어, 특정 카테고리의 상품을 페이지별로 조회하려고 합니다.

컨트롤러 코드

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @Autowired
    private ProductRepository productRepository;

    @GetMapping("/products")
    public Page<Product> getProductsByCategory(
            @RequestParam String category,
            @RequestParam int page,
            @RequestParam int size) {
        // Pageable 객체 생성
        PageRequest pageable = PageRequest.of(page, size);
        return productRepository.findByCategory(category, pageable);
    }
}

사용 결과

/products?category=electronics&page=0&size=5 요청 시 전자제품 카테고리의 첫 5개 상품이 반환됩니다.


예제 2: 페이징과 정렬 동시 사용

페이징 처리에 정렬을 추가해 데이터를 조회하는 예제입니다. 이번에는 가격을 기준으로 상품을 정렬합니다.

컨트롤러 코드

import org.springframework.data.domain.Sort;

@GetMapping("/products/sorted")
public Page<Product> getProductsByCategorySorted(
        @RequestParam String category,
        @RequestParam int page,
        @RequestParam int size,
        @RequestParam String sortBy,
        @RequestParam String direction) {
    // 정렬 객체 생성
    Sort sort = "desc".equalsIgnoreCase(direction) 
                ? Sort.by(sortBy).descending() 
                : Sort.by(sortBy).ascending();
    PageRequest pageable = PageRequest.of(page, size, sort);
    return productRepository.findByCategory(category, pageable);
}

사용 결과

/products/sorted?category=electronics&page=0&size=5&sortBy=price&direction=asc
전자제품 카테고리에서 가격 오름차순으로 정렬된 첫 5개 상품이 반환됩니다.


예제 3: 복합 정렬 조건

여러 정렬 조건을 적용해 데이터를 조회하는 예제입니다. 예를 들어, 상품을 가격과 이름 기준으로 정렬합니다.

컨트롤러 코드

@GetMapping("/products/multi-sorted")
public Page<Product> getProductsByMultipleSorts(
        @RequestParam String category,
        @RequestParam int page,
        @RequestParam int size) {
    // 복합 정렬 조건 정의
    Sort sort = Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name"));
    PageRequest pageable = PageRequest.of(page, size, sort);
    return productRepository.findByCategory(category, pageable);
}

사용 결과

/products/multi-sorted?category=electronics&page=0&size=5
전자제품 카테고리에서 가격 내림차순, 이름 오름차순으로 정렬된 첫 5개 상품이 반환됩니다.


4. 테스트 및 주의사항

테스트

Postman 또는 웹 브라우저를 통해 각각의 엔드포인트를 호출하여 결과를 확인할 수 있습니다.

주의사항

  1. 페이지 번호는 0부터 시작합니다.
  2. 대규모 데이터를 처리할 때는 적절한 페이징 전략을 설계해야 합니다.
  3. 잘못된 정렬 필드 요청 시 예외가 발생할 수 있으므로 유효성 검사를 추가하세요.

5. 결론

스프링 부트 3의 Pageable과 Sort를 활용하면 대규모 데이터를 효율적으로 관리할 수 있습니다. 기본 페이징부터 복합 정렬까지, 다양한 기능을 활용해 사용자 경험을 개선하고 시스템 성능을 최적화할 수 있습니다. 위의 예제들을 직접 실습하면서 스프링 데이터 JPA의 강력함을 느껴보세요! 😊

반응형