che01 님의 블로그
Spring 페이징 처리 두 가지 방식 정리 본문
Spring에서 페이징을 처리하는 방법은 크게 두 가지가 있다. 각각의 특징과 사용법을 정리해보자.
1. 전통적인 방식 - @RequestParam 직접 받기
컨트롤러에서 page와 size 파라미터를 직접 받아서 처리하는 방식이다.
특징
- 컨트롤러에서 page, size를 직접 파라미터로 받음
- defaultValue를 통해 기본값 지정 가능
- Pageable 객체를 직접 생성해서 서비스에 전달
코드 예시
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size
) {
Pageable pageable = PageRequest.of(page - 1, size);
Page<TodoResponse> todos = todoService.getTodos(pageable);
return ResponseEntity.ok(todos);
}
사용법
- URL: /todos?page=2&size=10
- 사용자 친화적인 1부터 시작하는 페이지 번호를 0부터 시작하는 인덱스로 변환 가능
2. Spring Data 자동 바인딩 - Pageable 파라미터 사용
Spring이 쿼리 파라미터를 자동으로 Pageable 객체에 매핑해주는 방식이다.
특징
- 컨트롤러 메서드에 Pageable 타입 파라미터만 선언하면 됨
- Spring이 쿼리 파라미터(page, size, sort)를 자동 매핑
- 별도의 @RequestParam 어노테이션 불필요
- page는 0부터 시작 (주의 필요)
코드 예시
@GetMapping("/search")
public ResponseEntity<Page<TodoSearchResponse>> searchTodos(
@ModelAttribute TodoSearchRequest request,
Pageable pageable
) {
Page<TodoSearchResponse> result = todoService.searchTodos(request, pageable);
return ResponseEntity.ok(result);
}
사용법
- URL: /search?page=1&size=10&sort=createdAt,desc
- 정렬 조건도 함께 전달 가능
주의사항 및 팁
페이지 인덱스 차이
- 전통적인 방식: 사용자가 보는 페이지 번호(1부터 시작)를 개발자가 직접 변환
- 자동 바인딩 방식: Spring이 0부터 시작하는 인덱스를 그대로 사용
설정 요구사항
- Pageable 자동 바인딩은 spring-boot-starter-data-jpa 의존성이 있으면 기본 활성화
- 필요시 @EnableSpringDataWebSupport 어노테이션으로 명시적 활성화 가능
선택 기준
- 전통적인 방식: 사용자 친화적인 페이지 번호(1부터 시작)를 원할 때
- 자동 바인딩 방식: 정렬 기능이 필요하거나 코드를 간결하게 유지하고 싶을 때
두 방식 모두 상황에 따라 적절히 선택하거나 혼용해서 사용할 수 있다.