본문 바로가기

Spring/Spring JPA

[JPA] Paging

JPA에서 **페이징(Paging)**은 대량의 데이터가 있을 때 효율적으로 데이터를 조회하고 관리하기 위해 자주 사용됩니다. 데이터베이스에서 데이터를 조회할 때 모든 결과를 한 번에 가져오는 것은 성능 상의 부담이 크기 때문에, 특정 페이지 단위로 데이터를 나눠 가져오거나, 필요한 만큼의 데이터만 가져오는 방식으로 최적화를 할 수 있습니다.

Spring Data JPA는 페이징 기능을 제공하기 위해 Pageable과 Page 인터페이스를 활용합니다. 다음은 주요 개념과 사용 방법에 대한 설명입니다.

주요 개념

Pageable 인터페이스:

  • 페이징을 위한 정보를 담고 있는 인터페이스로, 페이지 번호, 페이지 크기(한 번에 가져올 항목 수), 정렬 기준 등을 설정할 수 있습니다.
  • PageRequest.of(int page, int size) 메서드를 사용하여 Pageable 객체를 생성할 수 있습니다.
  • 예를 들어 PageRequest.of(0, 10)은 첫 번째 페이지(0부터 시작)를 가져오며, 한 페이지에 10개의 항목을 가져옵니다

Page 인터페이스:

  • 페이징된 결과 데이터를 제공하는 인터페이스입니다.
  • List와 달리, 페이지 관련 메타데이터(전체 페이지 수, 현재 페이지 번호, 총 항목 수 등)를 추가로 제공하여 페이징 처리를 보다 쉽게 해줍니다.

예시 코드

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findAll(Pageable pageable);
}

 

사용 예시

@Autowired
private MemberRepository memberRepository;

public void fetchPagedData() {
    Pageable pageable = PageRequest.of(0, 10); // 첫 번째 페이지, 10개 항목
    Page<Member> page = memberRepository.findAll(pageable);

    // Page 인터페이스 활용
    System.out.println("Total Elements: " + page.getTotalElements()); // 전체 항목 수
    System.out.println("Total Pages: " + page.getTotalPages()); // 전체 페이지 수
    System.out.println("Current Page: " + page.getNumber()); // 현재 페이지 번호

    // 데이터 가져오기
    List<Member> members = page.getContent(); // 실제 데이터 리스트
    members.forEach(System.out::println);
}

정렬과 함께 사용하기

페이징과 정렬을 함께 사용하면 특정 기준으로 데이터를 정렬한 후 페이징된 결과를 얻을 수 있습니다.

 

Pageable pageable = PageRequest.of(0, 10, Sort.by("name").ascending());
Page<Member> sortedPage = memberRepository.findAll(pageable);

 

특징 및 장점

  • 자동으로 페이징 쿼리를 생성: Pageable을 활용하면 Spring Data JPA가 내부적으로 적절한 SQL 쿼리를 생성하여 데이터베이스에서 필요한 데이터만 가져오므로, 성능에 최적화된 페이징 처리가 가능합니다.
  • 간단한 API 사용: 복잡한 페이징 로직을 코드로 구현할 필요 없이, Pageable과 Page를 활용하면 손쉽게 페이징 처리를 할 수 있습니다.

커스터마이징

필요에 따라 커스텀 쿼리와 함께 페이징 기능을 사용할 수도 있습니다. 예를 들어 @Query 어노테이션과 함께 Pageable을 매개변수로 넘기면 페이징이 가능합니다.

'Spring > Spring JPA' 카테고리의 다른 글

[JPA] ENUM 타입  (0) 2024.11.12
[JPA] 엔티티 클래스에서 많이 사용되는 어노테이션  (0) 2024.11.12
[JPA] IsEmpty와 IsNotNulLL 의 차이점  (0) 2024.11.11
Query by Example(QBE)  (0) 2024.11.11
Spring Boot JPA 간단하게  (2) 2024.11.04