ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Data JPA - 페이징과 정렬
    Spring/Spring Data JPA 2022. 3. 21. 14:26
    728x90
    반응형

     

    페이징과 정렬

     

    페이징과 정렬

     

    • 파라미터로 Pageable을 받을 수 있다.
    • Pageable은 인터페이스, 실제로는 PageRequest 구현체가 생성된다.
    • 요청 파라미터
            - page : 현재 페이지, 0부터 시작
            - size : 한 페이지에 노출할 데이터 건수
            - sort : 정렬 조건을 정의

     

    예시 : /members?page=0&size=3&sort=id,desc&sort=username,desc

     

     

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

     

    @Qualifier

     

    • 페이징 정보가 둘 이상인 경우 사용
    • @Qualifier에 접두사명 추가 "접두사명_xxx"

     

    예시 : /members?member_page=0&order_page=1

    public String list(
        @Qualifier("member") Pageable memberPageable,
        @Qualifier("order") Pageable orderPageable, ...){
        	...
    }

     

     

    기본값 설정

     

    • 글로벌 설정 - application.properties
    spring.data.web.pageable.default-page-size=20 // 기본 페이지 사이즈
    spring.data.web.pageable.max-page-size=2000   // 최대 페이지 사이즈

     

    • 개별 설정 - @PageableDefault 어노테이션 사용
    @RequestMapping(value = "/members_page", method = RequestMethod.GET)
    public String list(
        @PageableDefault(size = 12, sort = “username”,direction = Sort.Direction.DESC) 
        Pageable pageable) {
        ...
    }

     


     

    Page의 map() 기능

     

    • 엔티티를 API로 노출하면 다양한 문제가 발생, 따라서 DTO로 변환해서 반환하는 것이 좋다.
    • Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.

     

    @GetMapping("/members")
    public Page<MemberDto> list(Pageable pageable) {
        Page<Member> page = memberRepository.findAll(pageable);
        Page<MemberDto> pageDto = page.map(MemberDto::new);
        return pageDto;
    }
    
    //코드 최적화
    @GetMapping("/members")
    public Page<MemberDto> list(Pageable pageable) {
        return memberRepository.findAll(pageable).map(MemberDto::new);
    }

     

    728x90
    반응형

    댓글

Designed by Tistory.