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 |