Spring Boot JPA - 페이지 1부터 시작하도록 설정하기, Pageable 페이징 처리 (Kotlin)

반응형

Pageable 이란?

PageableSpring Data JPA에서 제공하는 인터페이스로,

페이지 정보(페이지 번호, 크기, 정렬 기준 등)를 캡슐화 하는 데 사용된다.

이를 통해 대규모 데이터를 페이징하여 효율적으로 처리 및 관리할 수 있다.

즉, 페이징 처리를 Pageable 인터페이스를 통해 쉽게 구현 가능하다.

  • PageNumber : 가져오려는 페이지의 번호, 기본적으로 0부터 시작한다.
  • PageSize : 한 페이지에 포함될 데이터의 개수를 의미한다. 기본 개수는 2000개이다.
  • Sort : 결과를 정렬하는 기준을 의미한다. 정렬 기준을 명시하지 않으면 정렬을 하지 않고, 데이터베이스에 가져온 순서대로 결과를 반환한다.

 

Pageable의 페이지를 1부터 시작하게 하려면?

기본적으로 PageNumber는 0부터 시작한다.

프론트엔드에서는 보통 1페이지부터 시작하는 것과 달리

백엔드에서는 페이징 처리 시, 페이지 넘버는 0페이지부터 시작한다는 뜻이다.

그렇다면 프론트엔드와 동일하게 페이지의 넘버를 1페이지부터 시작하게 하는 방법이 없을까?

지금부터 페이지를 1부터 시작하게 하는 방법으로 내가 아는 두 가지를 소개하려 한다.

 

1) Spring Boot 애플리케이션에서 Pageable 커스터마이징

페이지 번호를 0이 아닌 1부터 시작하도록 Pageable을 커스터마이징 할 수 있다.

PageableHandlerMethodArgumentResolverCustomizer는 Spring Boot에서 Pageable의 매개변수를 자동으로 매핑하는데 사용되는 인터페이스로, 이를 통해 페이지 요청의 기본 값을 설정하거나 페이지의 인덱스를 조정하는 등 다양한 커스터마이징 작업을 수행할 수 있다.

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer

@SpringBootApplication
class DevbabysApplication

fun main(args: Array<String>) {
	runApplication<DevbabysApplication>(*args)
}

// Pageable 커스터마이징
@Bean
fun customize(): PageableHandlerMethodArgumentResolverCustomizer {
	return PageableHandlerMethodArgumentResolverCustomizer { p ->
		p.setOneIndexedParameters(true) // 페이지 1부터 시작
		p.setMaxPageSize(20) // 페이지 크기를 20으로 설정
	}
}
  • setOneIndexedParameters(boolean oneIndexedParameters)
    • 페이지 번호를 1부터 시작하도록 설정하는 속성
    • 기본값은 false이며, 이는 페이지가 0부터 시작함을 의미한다.
  • setMaxPageSize(int maxPageSize)
    • 기본 페이지 크기를 설정하는 속성
    • 한 페이지에 표시할 항목의 수를 설정한다.

 

2) 서비스 로직에서 Pageable 페이지 조정

컨트롤러에서 받은 PageablePageNumber를 서비스 로직에서 재조정한다.

프론트엔드에서 전달받은 1페이지는 백엔드에서는 0페이지를 의미한다.

때문에 1의 값을 받게 되면 0이 될 수 있도록 -1씩 재조정해주어야 한다.

Pageable 객체를 생성하기 위해 PageRequest.of 메서드를 사용한다.

val pageable: Pageable = PageRequest.of(page, size, sort);

 

아래는 프로젝트에서 사용된 Pageable의 페이지 수가 조정된 코드를 간소화한 코드이다.

1페이지부터 시작하도록하며, 페이지의 크기는 프론트엔드에서 원하는 수에 따라 조정 없이 불러올 수 있도록 하였다.

// RestController
@GetMapping("product/list")
fun listAllProduct(pageable: Pageable): ResponseEntity<Page<Product>> {
    val page = productService.getProductAllList(pageable)
    return ResponseEntity.ok(page)
}
// Service
fun getProductAllList(pageable: Pageable): Page<Product> {
    val customPage = PageRequest.of(pageable.pageNumber - 1, pageable.pageSize)
    val productList = productRepo.findAll(customPage)

    return productList
}

 

1페이지가 1부터 조회되는지 확인

1페이지를 조회했을 때, 2페이지가 아닌 1페이지의 값을 불러오도록 설정이 완료되었다.

아래의 API 응답 결과를 보면 데이터베이스의 첫 번째 값(productId=1)이 불러온 것을 확인할 수 있다.

반응형