본문 바로가기
Backend/JPA

JPA (Spring Data JPA) - JPA 페이징과 정렬 처리 방법

by 개발자-제이 2025. 3. 12.

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);
}

동작 과정

  1. findAll(pageable) 호출하여 Page<Member> 객체 가져옴
  2. .map(MemberDto::new)을 사용해 Page<MemberDto>로 변환
  3. API 응답에 DTO를 반환하여 불필요한 필드 노출 방지

 

6. 정리

  1. 페이징은 데이터 조회를 효율적으로 수행하는 방법
  2. Spring Data JPA에서 Pageable을 사용하면 페이징과 정렬을 간편하게 적용 가능
  3. 요청 파라미터로 동적 페이징 및 정렬 지원 (page, size, sort)
  4. 글로벌 기본값(default-page-size, max-page-size)을 설정하여 기본 동작 제어 가능
  5. DTO를 사용하여 API 응답에서 불필요한 데이터 노출 방지
반응형