BE/Spring & Spring Boot

[Spring Boot] Page

baek-dev 2024. 12. 27. 12:34

Page (페이징)

주로 Spring Data JPA 에서 사용되는 인터페이스

페이징 처리는 데이터베이스에서 많은 데이터를 한번에 불러오지 않고, 필요한 크기만큼 나누어 가져오는 방식


Page와 Pageable

1. Page

  • 페이징된 데이터를 담고있는 객체
  • 페이징 처리된 데이터와 함께, 전체 데이터의 크기, 페이지 정보 등을 제공

2. Pageable

  • 페이징 요청 정보를 담고있는 객체
  • 현재 페이지 번호, 페이지 크기(한페이지에 몇개의 데이터) 등을 설정하여 페이징 요청에 사용됨

주요 메서드

데이터 관련 메서드

1. getContent()

  • 현재 페이지의 데이터리스트를 반환

2. getTotalElements()

  • 전체 데이터 개수를 반환

3. getTotalPages()

  • 전체 페이지 수를 반환

4. getNumber()

  • 현재 페이지 번호를 반환 (0부터 시작)

 

페이징 상태 관련 메서드

1. isFirst()

  • 현재 페이지가 첫번째 페이지인지 확인

2. isLast()

  • 현재 페이지가 마지막 페이지인지 확인

3. hasNext()

  • 다음 페이지가 있는지 확인

4. hasPrevious()

  • 이전 페이지가 있는지 확인

예제

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Member {
    @Id
    private Long id;
    private String name;

    // Getter, Setter, Constructor 생략
}

repository

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

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

Spring Data JPA 의 JpaRepository 를 사용할때, 페이징 처리를 자동으로 지원함

  • findByNameContaining : 이름에 특정 문자열이 포함된 데이터를 검색
  • Pageable : 페이징 정보(현재페이지, 페이지크기) 를 전달

service

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

    @Autowired
    private MemberRepository memberRepository;

    public Page<Member> getPagedMembers(String name, int page, int size) {
        // PageRequest.of(page, size)로 Pageable 객체 생성
        return memberRepository.findByNameContaining(name, PageRequest.of(page, size));
    }
}

controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberController {

    @Autowired
    private MemberService memberService;

    @GetMapping("/members")
    public Page<Member> getMembers(
        @RequestParam String name,
        @RequestParam int page,
        @RequestParam int size
    ) {
        return memberService.getPagedMembers(name, page, size);
    }
}

 

페이징 api 호출

GET /members?name=John&page=0&size=5

결과

{
  "content": [
    { "id": 1, "name": "John Doe" },
    { "id": 2, "name": "Johnny Appleseed" }
  ],
  "pageable": {
    "sort": { "sorted": false, "unsorted": true },
    "pageNumber": 0,
    "pageSize": 5,
    "offset": 0,
    "paged": true
  },
  "totalPages": 10,
  "totalElements": 50,
  "last": false,
  "first": true,
  "size": 5,
  "number": 0,
  "numberOfElements": 2,
  "empty": false
}

Page와 Pageable 정리

 

1. Page

  • 데이터베이스에서 페이징 처리된 결과를 담고 있는 객체
  • 데이터 리스트와 함께 페이지 정보(전체 개수, 현재 페이지 등)를 제공

2. Pageable

  • 페이징 요청 정보를 담고 있는 객체
  • PageRequest.of(페이지 번호, 페이지 크기)로 생성 가능

3. 주요 기능

  • 페이징 처리: 데이터를 원하는 페이지 크기만큼 나누어 가져옴
  • 정렬 처리: 페이징과 함께 정렬 조건도 설정 가능

4. 사용 시 장점

  • 대량의 데이터를 효율적으로 처리
  • 필요한 데이터만 가져와 성능 최적화

 

 

 

 

출처 : ChatGPT