회원이 추천한 게시 글을 12개씩 pagenation을 적용해 클라이언트에 반환하였는데, pagenation이 적용되지 않고 모든 글이 한번에 반환되는 상황이 발생했다.
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해서 반환하는 것이 아니었다.
💡PageImpl는 Page 인터페이스를 구현한 구현체로서, 페이지 데이터(페이지 번호, 페이지 크기, 총 항목 수 등)를 저장하고 반환한다.
즉, PageImpl는 생성된 Page의 정보를 클라이언트에게 전달하기 위한 것이므로
BlogService
에서의 blogList의 크기가 pageable의 정의된 size보다 크다면, 추가 요소들을 고려되지 않아 잘못된 페이징 처리를 할 수 있다고 한다.
어찌되었던 내가 추천한 게시글들을 클라이언트에게 반환해야 했고 Likes
엔티티에는 블로그에 대한 정보가 담겨 있었기 때문에 반환값을 Mapping할 때, 블로그 리스트를 만들었다.
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;
}
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;
}
참고
스택오버플로우