Spring Data JPA

[Spring Data JPA] Web 확장 - 페이징과 정렬 🍀

woochii 2023. 12. 26. 12:04
728x90
반응형

페이징과 정렬

예제

@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    return page;
}

// 테스트용 데이터
@PostConstruct
public void init() {
    for (int i = 0; i < 100; i++) {
        memberRepository.save(new Member("user"+i, i));
    }
}
  • 파라미터로 Pageable을 받을 수 있다.
  • Pageable은 인터페이스이다.
  • 실제로는 org.springframework.data.domain.PageRequest 객체를 생성한다.

 

요청 파라미터

  • page : 현재 페이지, 0부터 시작한다.
  • size : 한 페이지에 노출할 데이터 건수 (설정하지 않으면 20개씩 노출된다.)
  • sort : 정렬 조건을 정의한다. (Ex. sort=id,desc)

 

기본값 설정

  • 한 페이지에 노출되는 데이터 건수는 기본이 20이다.
  • 이것을 10개로 변경하고 싶다면?

글로벌 설정

Application.yml

spring:
  data:
    web:
      pageable:
        default-page-size: 10 // 기본 페이지 사이즈
        max-page-size: 2000 // 최대 페이지 사이즈

개별 설정

@GetMapping("/members")
public Page<Member> list(@PageableDefault(size = 10) Pageable pageable) {
    return memberRepository.findAll(pageable);
}
  • @PageableDefault 어노테이션을 사용한다.
  • size 뿐만 아니라 page, sort, direction 등 다양한 개별 설정이 가능하다.

 

접두사

  • 페이징 정보가 둘 이상이면 접두사로 구분한다.
  • @Qualifier에 접두사명을 추가한다.
  • Ex. "/members?member_page=0&order_page=1"
public String list(
    @Qualifier("member") Pageable memberPageable,
    @Qualifier("order") Pageable orderPageable,
    ...
)

 

 

Page 내용을 DTO로 변환

  • 엔티티를 API로 노출하면 다양한 문제들이 발생한다.
  • 그래서 반드시 엔티티를 DTO로 변환하여 반환해야 한다.
  • Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.

MemberDto

@Data
@AllArgsConstructor
public class MemberDto {

    private Long id;
    private String username;
    private String teamName;

    public MemberDto(Member member) {
        this.id = member.getId();
        this.username = member.getUsername();
    }
}
@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 10) Pageable pageable) {
    return memberRepository.findAll(pageable)
            .map(MemberDto::new); // map()으로 MemberDto로 변환
}

 

Page를 1부터 시작하기

  • 스프링 데이터는 Page를 0부터 시작한다.
  • 1부터 시작하고 싶다면 두 가지 방법이 있다.
  1. Pageable, Page를 파라미터와 응답 값으로 사용하지 않고 직접 클래스를 만들어서 처리한다.
    • 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다.
    • 물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다.
  2. spring.data.web.pageable.one-indexed-parameters를 true로 설정한다.
    • 이 방법은 web에서 page 파라미터를 -1 처리할 뿐이다.
    • 따라서 응답값인 Page에 모두 0 페이지 인덱스를 사용하는 한계가 있다.

Application.yml

spring:
  data:
    web:
      pageable:
        one-indexed-parameters: true

http://localhost:8080/members?page=2

  • Page 객체 안에 데이터들이 잘 안맞는다.
  • Ex. 파라미터로 넘긴 page는 2지만 pageNumber, number는 1이다.

출처 : 인프런 실전! 스프링 데이터 JPA

728x90
반응형