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

이 문제를 해결하기 위해 대부분의 애플리케이션에서는 페이징(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은 페이징과 정렬을 위한 정보를 정의하는 인터페이스입니다.
PageRequest는 Pageable 인터페이스를 구현한 구체적인 클래스입니다. 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의 Pageable과 PageRequest는 대량의 데이터를 효율적으로 처리하고 성능을 최적화하는 데 매우 유용한 도구입니다.
Pageable 인터페이스는 페이징과 정렬을 위한 정보를 정의하는 표준을 제공하며, PageRequest 클래스는 이를 구체적으로 구현하여 페이지 번호, 크기, 정렬 기준 등을 설정하는 데 사용됩니다.
이러한 페이징 기법을 통해 클라이언트는 필요한 데이터만 적시에 받아볼 수 있고, 서버는 불필요한 데이터 전송을 줄여 성능을 향상시킬 수 있습니다. 이를 활용하면 웹 애플리케이션의 응답 속도를 개선하고 사용자 경험을 높일 수 있습니다.
'Framework > JPA' 카테고리의 다른 글
[JPA] @Modifying 어노테이션이란 무엇일까❓ (0) | 2024.10.01 |
---|---|
[JPA] 프록시(proxy)객체란 무엇일까❓ (1) | 2024.09.15 |
[JPA] JPA에서 단방향 및 양방향 관계 이해 (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (1) | 2024.08.23 |
[JPA] JPA에서 낙관적 락(Optimistic Locking)을 통한 동시성 제어하기 (@Version) (0) | 2024.08.22 |
[JPA] 비관적 락(Pessimistic Lock)을 통한 동시성 제어 및 업데이트 손실(Lost Update)확인하기 (0) | 2024.08.21 |

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

이 문제를 해결하기 위해 대부분의 애플리케이션에서는 페이징(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은 페이징과 정렬을 위한 정보를 정의하는 인터페이스입니다.
PageRequest는 Pageable 인터페이스를 구현한 구체적인 클래스입니다. 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의 Pageable과 PageRequest는 대량의 데이터를 효율적으로 처리하고 성능을 최적화하는 데 매우 유용한 도구입니다.
Pageable 인터페이스는 페이징과 정렬을 위한 정보를 정의하는 표준을 제공하며, PageRequest 클래스는 이를 구체적으로 구현하여 페이지 번호, 크기, 정렬 기준 등을 설정하는 데 사용됩니다.
이러한 페이징 기법을 통해 클라이언트는 필요한 데이터만 적시에 받아볼 수 있고, 서버는 불필요한 데이터 전송을 줄여 성능을 향상시킬 수 있습니다. 이를 활용하면 웹 애플리케이션의 응답 속도를 개선하고 사용자 경험을 높일 수 있습니다.
'Framework > JPA' 카테고리의 다른 글
[JPA] @Modifying 어노테이션이란 무엇일까❓ (0) | 2024.10.01 |
---|---|
[JPA] 프록시(proxy)객체란 무엇일까❓ (1) | 2024.09.15 |
[JPA] JPA에서 단방향 및 양방향 관계 이해 (@ManyToOne, @OneToMany, @OneToOne, @ManyToMany) (1) | 2024.08.23 |
[JPA] JPA에서 낙관적 락(Optimistic Locking)을 통한 동시성 제어하기 (@Version) (0) | 2024.08.22 |
[JPA] 비관적 락(Pessimistic Lock)을 통한 동시성 제어 및 업데이트 손실(Lost Update)확인하기 (0) | 2024.08.21 |