본문 바로가기

Development/Spring

[Spring] JPA의 정렬과 페이징 처리

정렬 처리하기

일반적인 쿼리문에서 정렬을 사용할 때는 ORDER BY 구문을 사용합니다. 쿼리 메서드도 정렬 기능에 동일한 키워드가 사용됩니다. 

// ASC: 오름차순, DESC: 내림차순
List<Product> findByNameOrderByNumberAsc(String name);
List<Product> findByNameOrderByNumberDesc(String name);

위와 같이 기본 쿼리 메서드를 작성한 후 OrderBy 키워드를 삽입하고 정렬하고자 하는 칼럼과 오름차순/내림차순을 설정하면 정렬이 수행됩니다.

여러 정렬 조건을 사용하기 위해선 다음과 같이 작성할 수 있습니다.

List<Product> findByNameOrderByPriceAscStockDesc(String name);

위 코드에서 먼저 Price를 우선으로 오름차순 정렬을 하고, 후순위로 Stock의 내림차순 정렬을 수행합니다.

 

단, 메서드의 이름이 길어질 수 있으므로 매개변수를 활용해 정렬할 수도 있습니다.

List<Product> findByName(String name, Sort sort);
productRepository.findByName("Pen", Sort.by(Order.asc("price")));
productRepository.findByName("Pen", Sort.by(Order.asc("price"), Order.desc("stock")));

Sort 객체는 정렬 기준을 제공해줍니다. Sort.by 메서드를 통해 Sort 객체를 생성하고, 정렬 기준을 Order.asc() 또는 Order.desc()를 통해 결정합니다. Spring Data JPA는 Sort 객체를 SQL문의 ORDER BY와 상응하도록 변환합니다.

페이징 처리

페이징이란 데이터베이스의 레코드를 개수로 나눠 페이지를 구분하는 것을 의미합니다. 

흔히 볼 수 있는 웹 페이지에서 각 페이지를 구분해서 데이터를 제공할 때 그에 맞게 데이터를 요청하는 것이라고 생각하면 됩니다.

 

JPA에서는 이 같은 페이징 처리를 위해 PagePageable을 사용합니다.

// 페이징 처리를 위한 쿼리 메서드 예시
Page<Product> findByName(String name, Pageable pageable);

위와 같이 리턴 타입으로 Page를 설정하고 매개변수에는 Pageable 타입의 객체를 정의합니다. 해당 메서드를 사용하기 위해서는 다음과 같이 호출합니다.

Page<Product> productPage = productRepository.findByName("Pen", PageRequest,of(0, 2));

PageRequestPageable의 구현체 입니다. 위 코드는 0번째 페이지 부터 시작하여 각 페이지당 2개의 데이터를 출력합니다.

 

PageRequest는 of 메서드를 통해 PageRequest 객체를 생성합니다. of 메서드는 매개변수에 따라 다양한 형태로 오버로딩돼 있는데 다음과 같은 매개변수 조합을 지원합니다. 

of 메서드 매개변수 설명 비고
of(int page, int size) 페이지 번호(0부터 시작), 페이지당 데이터 개수 데이터를 정렬하지 않음
of(int page, int size, Sort) 페이지 번호, 페이지당 데이터 개수, 정렬 sort에 의해 정렬
of(int page, int size, Direction, String ... properties) 페이지 번호, 페이지당 데이터 개수, 정렬 방향, 속성(칼럼) Sort.by(direction, properties)에 의해 정렬

 

Page 객체는 .getContent() 메서드를 통해 배열 형태로 값을 출력할 수 있습니다.

Page<Product> productPage = productRepository.findByName("pen", PageRequest.of(0, 2));
System.out.println(productPage.getContent());

참고

  • 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022