Spring MVC : Pageable 파라미터 받기

    이 게시글은 인프런의 영한님의 강의를 듣고 복습하며 작성한 글입니다.


    Pageable 활용하기

    페이징을 하는 것은 굉장히 고역이다. 그 어려운 것을 스프링 데이터 JPA는 Pageable 인터페이스를 넘겨주고, Page나 Slice 타입의 객체를 받아서 페이징을 아주 손쉽게 해준다. 따라서 우리는 Page, Slice, Pageable을 적극적으로 활용하는 것이 마땅하다. 

     


    Controller에서 Pageable 객체 받기 

    @ResponseBody
    @GetMapping("/testCode")
    public String testPageable(Pageable pageable) { // Pageable 객체 받음.
        log.info("pageable : {}", pageable);
        return "ok";
    }

    Controller의 파라미터에 Pageable 객체를 받는 것으로 설정을 해주면, Request 요청이 오게 되면 내부적으로 Argument Resolver등이 동작해서 Pageable 객체를 만들어준다. 

    • page : 현재 페이지, 0부터 시작
    • size : 한 페이지에 노출할 데이터 건수
    • sort : 정렬 조건을 정의. (정렬 속성, 정렬 파라미터 등이 있음) 

    Pageable 객체를 인자로 받게 된다면, 특정 쿼리 파라미터를 바인딩해서 Pageable에 넣어준다. 이 때 사용되는 쿼리 파라미터는 위에서 확인할 수 있다. 

    실제 사용 예시

    http://localhost:8080/testCode?page=5&size=10&sort=username,desc

     

    Pageable 객체를 받았을 때, 쿼리 파라미터를 넣지 않았다면? 

    Pageable 객체 어떤 쿼리 파라미터도 넘어오지 않았다면, 스프링 전체 설정에 있는 기본값을 따라 값이 들어가서 Pageable 객체가 생성된다. 스프링부트의 기본 설정은 위에서 확인할 수 있고, 기본 페이지 사이즈는 20으로 설정되어있다. 전체적으로 설정을 먹이고 싶다면 이 부분을 건드리면 된다. 

     

    Pageable 객체 기본값, 작은 범위에 적용하는 방법 → @PageableDefault

    @ResponseBody
    @GetMapping("/testCode")
    public String testPageable(@PageableDefault(page = 1, size = 5, 
            sort = "username", direction = Sort.Direction.ASC)
            Pageable pageable) {
        log.info("pageable : {}", pageable);
        return "ok";
    }

    @PageableDefault 어노테이션을 이용하면 컨트롤러 단위로 Pageable의 default Value를 설정할 수 있다. 

    • page : 몇 번째 페이지를 불러올지 설정
    • size : 한 페이지에 가져올 데이터 갯수
    • sort : 어떤 것을 기준으로 정렬할 것인지
    • direction : 어떤 방향으로 정렬할 것인지 

    다음과 같은 기본값을 사용자가 설정을 해줄 수 있다. 쿼리 파라미터로 어떠한 값도 넘어오지 않는 경우에 다음 값이 컨트롤러 단위로 들어가게 된다. 

     

    페이징 정보가 둘 이상인 경우

    페이징 정보가 둘 이상 들어오는 경우가 있다. 이 때는 @Qualifer를 이용해서 쿼리 파라미터의 접두사를 구분해서 따로따로 넣어줄 수 있다. 

    @ResponseBody
    @GetMapping("/testCode22")
    public String testPageable(@Qualifier("member") Pageable memberPage,
                               @Qualifier("order") Pageable orderPage) {
        log.info("memberPage : {}", memberPage);
        log.info("orderPage : {}", orderPage);
    
        return "ok";
    }

    @Qualifer 어노테이션을 Pageable 앞에 붙여주고, 구분자로 들어갈 변수명을 넣어준다. 

    http://localhost:8080/testCode22?member_page=100&order_page=900

    @Qualfier를 넣어주면 @Qualifer에 있는 값을 접두사로 해서 "_"가 나오는 부분까지는 짤라서 인식을 해준다. 따라서 member_page는 memberPage로 들어가게 될 것이고, order_page는 orderPage로 들어가게 될 것이다. 

    실제 실행결과는 다음과 같이 분리된 것을 확인할 수 있다. 

     


    정리

    • Controller에서 Pageable 객체를 파라미터로 받으면 특정 쿼리 파라미터를 자동으로 바인딩해서 pageable 객체를 생성해준다. 
    • Pageable 객체에 쿼리 파라미터 값이 들어오지 않으면 스프링 부트 Default 설정을 따른다
    • @PageableDefault 어노테이션을 이용해 Pageable 객체의 Default 값을 컨트롤러 단위로 설정 가능하다
    • 여러 Pageable 객체를 받을 경우 @Qualifier 어노테이션을 이용해 "접두사_"로 분리해서 객체를 받을 수 있다.

    댓글

    Designed by JB FACTORY