1. 페이징과 정렬이란?
페이징 (Pagination)
페이징(Pagination)은 대량의 데이터를 한 번에 조회하지 않고, 일정한 크기로 나누어 가져오는 방법이다.
예를 들어, 사용자가 웹 애플리케이션에서 10개의 데이터만 한 번에 조회하도록 설정하면 메모리 사용량을 줄이고 응답 속도를 최적화할 수 있다.
정렬 (Sorting)
정렬(Sorting)은 특정 컬럼을 기준으로 데이터의 정렬 순서를 지정하는 방법이다.
예를 들어, id 기준으로 내림차순 정렬하거나 username 기준으로 오름차순 정렬할 수 있다.
2. 페이징과 정렬 예제
Spring Data JPA는 페이징과 정렬을 간편하게 적용할 수 있도록 지원한다.
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
return memberRepository.findAll(pageable);
}
위 코드의 동작 방식
- Pageable 객체를 컨트롤러에서 직접 받음
- memberRepository.findAll(pageable)을 호출하면 자동으로 페이징 처리
- 반환 타입을 Page<T>로 지정하면 페이징 정보를 함께 제공
3. 요청 파라미터 사용법
페이징과 정렬을 사용할 때 요청 파라미터(Query Parameter)를 활용하여 동적으로 제어할 수 있다.
/members?page=0&size=3&sort=id,desc&sort=username,desc
파라미터 | 설명 |
page | 현재 페이지 번호 (0부터 시작) |
size | 페이지당 노출할 데이터 수 |
sort | 정렬 기준 (예: sort=id,desc) |
예제 요청 및 응답
요청
GET /members?page=0&size=5&sort=username,asc
Spring Data JPA 내부 동작
PageRequest.of(0, 5, Sort.by("username").ascending());
응답 예시
{
"content": [
{ "id": 1, "username": "jay1" },
{ "id": 2, "username": "jay2" },
{ "id": 3, "username": "jay3" }
],
"totalPages": 10,
"totalElements": 50,
"size": 5,
"number": 0
}
4. 글로벌 기본값 설정
Spring Boot에서는 전역 페이징 기본값을 설정할 수 있다.
다음과 같이 application.yml 또는 application.properties에 설정하면 기본 페이지 크기 및 최대 크기를 지정할 수 있다.
spring:
data:
web:
pageable:
default-page-size: 20 # 기본 페이지 크기
max-page-size: 2000 # 최대 페이지 크기
글로벌 설정이 적용되면?
- 사용자가 size를 입력하지 않을 경우 default-page-size인 20개 항목이 기본으로 조회됨
- 사용자가 size=5000을 요청해도 max-page-size=2000이므로 2000개까지만 반환됨
5. DTO로 변환하여 반환
엔티티 그대로 반환하면 문제 발생
REST API에서 엔티티(Entity)를 직접 반환하는 것은 위험하다.
- 비즈니스 로직이 노출될 수 있음
- 불필요한 데이터까지 반환될 수 있음
- 객체의 변경 사항이 API 응답에도 영향을 미칠 수 있음
따라서 DTO(Data Transfer Object)를 활용하는 것이 좋다.
DTO 클래스 정의
import lombok.Data;
@Data
public class MemberDto {
private Long id;
private String username;
public MemberDto(Member m) {
this.id = m.getId();
this.username = m.getUsername();
}
}
컨트롤러에서 DTO 변환 적용
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
return memberRepository.findAll(pageable).map(MemberDto::new);
}
동작 과정
- findAll(pageable) 호출하여 Page<Member> 객체 가져옴
- .map(MemberDto::new)을 사용해 Page<MemberDto>로 변환
- API 응답에 DTO를 반환하여 불필요한 필드 노출 방지
6. 정리
- 페이징은 데이터 조회를 효율적으로 수행하는 방법
- Spring Data JPA에서 Pageable을 사용하면 페이징과 정렬을 간편하게 적용 가능
- 요청 파라미터로 동적 페이징 및 정렬 지원 (page, size, sort)
- 글로벌 기본값(default-page-size, max-page-size)을 설정하여 기본 동작 제어 가능
- DTO를 사용하여 API 응답에서 불필요한 데이터 노출 방지
반응형