[트러블슈팅] Pagenation 에러

·2023년 3월 17일
0

NerdNest

목록 보기
3/6
post-thumbnail

문제 발생

회원이 추천한 게시 글을 12개씩 pagenation을 적용해 클라이언트에 반환하였는데, pagenation이 적용되지 않고 모든 글이 한번에 반환되는 상황이 발생했다.

BlogService

    public Page<Blog> findBlogsByMemberWithLike(Member member, int page, int size) {
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by("blogId").descending());

        List<Likes> likes = likeRepository.findByMemberAndLikeStatus(member, Likes.LikeStatus.LIKE);

        List<Blog> blogList = likes.stream()
                        .map(like -> blogRepository.findById(like.getBlog().getBlogId()))
                        .map(Optional::get)
                        .collect(Collectors.toList());

        Page<Blog> blogs = new PageImpl<>(blogList, pageable, blogList.size());

        return blogs;
    }

기존 코드는 회원이 추천한 추천 리스트를 불러와 리스트에 존재하는 Blog 정보를 가지고 Blog 리스트를 생성하고, PageImpl를 구현해 Page를 생성하는 방식이었다.

원인

PageImpl를 구현해 인스턴스를 생성하는 방식은 기본 페이지 구현일 뿐, 데이터을 pagenation해서 반환하는 것이 아니었다.

💡PageImplPage 인터페이스를 구현한 구현체로서, 페이지 데이터(페이지 번호, 페이지 크기, 총 항목 수 등)를 저장하고 반환한다.

즉, PageImpl는 생성된 Page의 정보를 클라이언트에게 전달하기 위한 것이므로
BlogService에서의 blogList의 크기가 pageable의 정의된 size보다 크다면, 추가 요소들을 고려되지 않아 잘못된 페이징 처리를 할 수 있다고 한다.

해결

어찌되었던 내가 추천한 게시글들을 클라이언트에게 반환해야 했고 Likes 엔티티에는 블로그에 대한 정보가 담겨 있었기 때문에 반환값을 Mapping할 때, 블로그 리스트를 만들었다.

BlogService

public Page<Likes> findBlogsByMemberWithLike(Member member, int page, int size) {
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by("likeId").descending());

        Page<Likes> likes = likeRepository.findByMemberAndLikeStatus(member, Likes.LikeStatus.LIKE, pageable);

        return likes;
    }

LikesMapper

default MyLikeBlogResponseDto likeToMyLikeBlogResponseDto(Likes likes) {
        if(likes == null) {
            return  null;
        }

        Blog blog = likes.getBlog();

        MyLikeBlogResponseDto response = MyLikeBlogResponseDto.builder()
                .memberId(blog.getMember().getMemberId())
                .blogId(blog.getBlogId())
                .titleImageUrl(blog.getTitleImageUrl())
                .blogTitle(blog.getBlogTitle())
                .blogContent(blog.getBlogContent())
                .createdAt(blog.getCreatedAt())
                .writer(blog.getMember().getNickName())
                .likeCount(blog.getLikeCount())
                .commentCount(blog.getCommentCount())
                .build();

        return response;
    }

참고
스택오버플로우

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글