ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Web 확장 - 페이징과 정렬
    JPA/스프링 데이터 JPA 2023. 8. 12. 15:32

    페이징과 정렬을 Web에서 편하게 사용할 수 있도록 스프링 데이터 JPA가 기능을 지원한다.

     

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

    memberRepository의 findAll의 파라미터에 pageable을 넣어주면 페이징을 사용할 수 있다.

     

     

    0번째 페이지

    url에 파라미터로 페이지와 사이즈를 넘겨주면 웹에서 페이징을 해서 결과값을 자동으로 반환해준다. 처음 5개의 데이터가 나올 것이고, page=1&size5라고 적으면 id가 6~10인 데이터가 나올 것이다.

     

    그 뒤에 sort를 이용해서 id와 username을 DESC로 정렬했더니 반대로 id가 100번인 것부터 나오게 되었다.

     

     

     

     

    초기설정 바꾸기

    파라미터에 아무것도 설정하지 않으면 default 개수는 20개이며 정렬하지 않은 순으로 보여준다.

    spring:
      date:
        web:
          pageable:
            default-page-size: 10
            max-page-size: 2000

    application.yml에 다음과 같이 설정해서 default 크기와 max 페이지를 설정할 수 있다.

     

     

    초기설정을 단체로 하는게 아니라 기능별로 하나씩 설정할 때가 많은데 그럴 때에는 컨트롤러에 별도로 설정해주면 된다.

    @GetMapping("/members")
    public Page<Member> list(@PageableDefault(size = 5) Pageable pageable) {
        Page<Member> page = memberRepository.findAll(pageable);
        // 그냥 findAll에 pageable을 넘겨주면 알아서 sorting 해줌
        return page;
    }

     

     

     

     

    Page 내용을 Dto로 변환하기

    위의 내용들은 엔티티를 그대로 반환한 것이기 때문에 항상 말했듯이 절대 해서는 안되는 것이다. 이럴 때에는 Dto로 변환해서 반환해줘야 한다.

    @GetMapping("/members")
    public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) {
        Page<Member> page = memberRepository.findAll(pageable);
        Page<MemberDto> map = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
        return map;
    }

    이렇게 map을 이용해서 Dto로 변경시켜주면 된다.

Designed by Tistory.