JavaSpring - 페이지 네이션

Terror·2024년 9월 19일
0
post-thumbnail

들어가며..

  • 우리가 왜 페이지 네비게이션을 배워야 하느냐? 사용자들에게 매 요청마다 1000개 혹은 그 이상의 데이터를 계속 전달해주는것은 시간도 걸릴 뿐더러 부하가 심하여, 사용자 체감에 안좋은 영향을 끼치기 마련이다
  • 우리가 흔히 네이버나, 구글 들어가면 밑에 1,2 페이지등을 들어가지않는가? 그것이 페이지 네이션이다

Pagination (페이지 네이션)
데이터를 정렬기준, 페이지 크기, 몇번째 페이지인지를 토대로 정보를 전달해 주는 것

Spring Pagination

  • 스프링에서 페이지네이션은 사용자가 직접 구현해서 사용할 수 있고, SPring에서 제공하는 Pageable을 사용하여도 가능합니다

Pageable

  • Spring에서 제공하는 Pagination을 위한 인터페이스 입니다
  • 상속구조는 아래와 같습니다
  • 실제 생성자는 아래와 같은 모양을 띄고 있습니다

변수 설명
size : 한페이지당 담길 데이터의 양
page : size를 기준으로 몇번째 페이지 인지
sort : 무엇을 기준으로 정렬할 것인지

  • AbstractPageRequest 생성자에서 page,size의 예외 처리를 하고있는 모습입니다

실제로 사용해보자

    // 자신의 게시글들 조회 (1페이지당, 10개)
    @GetMapping
    public ApiResponsePost getPosts(
            @AuthenticationPrincipal UserDetailsImpl userDetails,
            Pageable pageable
    ){
        log.info("size = {}, page = {}, sorted = {}", pageable.getPageSize(), pageable.getPageNumber(), pageable.getSort());
        Long memberId = userDetails.getId();
        return postService.getPosts(memberId,pageable);
    }
    @Transactional(readOnly = true)
    public ApiResponsePost getPosts(Long memberId, Pageable pageable) {
        Member member = findByMemberId(memberId);
        Page<Post> posts = postRepository.findAllByMember(member,pageable);
        List<PostResponseDto> postList = posts.map(PostResponseDto::new).stream().toList();
        return new ApiResponsePost(ApiResponsePostEnum.POST_GET_SUCCESS,postList);
    }


  • 단순히 Pageable 객체만 넣어주었음에도, 잘 동작되는 모습이다
    // 자신의 게시글들 조회 (1페이지당, 10개)
    @GetMapping("/myList")
    public ApiResponsePost getPosts(
            @AuthenticationPrincipal UserDetailsImpl userDetails,
            @RequestParam (required = false, defaultValue = "1") int page,
            @RequestParam (required = false, defaultValue = "10") int size,
            @RequestParam (required = false, defaultValue = "desc") String sort
    ){
        Long memberId = userDetails.getId();
        Sort.Direction direction = Sort.Direction.fromString(sort);
        Pageable pageable = PageRequest.of(page, size, direction,"createdAt");
        return postService.getPosts(memberId,pageable);
    }
  • fromString 이라는 메서드를 통하여, String 으로받은 문자열을 desc,asc 형식으로 변환도 가능하다
  • 잘 나오는 모습이다 !

TMI

  • Pageable sort와, JpaRespository Ordery BY를 동시에 쓴다면,JPA Repository과 Pageable보다 우선권을 가진다

참조 블로그

https://velog.io/@soluinoon/Spring-Pageable-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0

profile
테러대응전문가

0개의 댓글