public List<BookMarkDto.UserBookmarkDto> getBookmarks1(User user) {
Long userId = user.getId();
List<BookMark> bookmarks = bookMarkRepository.findByUserId(userId);
return bookmarks.stream()
.map(bookmark -> {
Post post = postService.getPostId(bookmark.getPost().getId());
return BookMarkDto.UserBookmarkDto.builder()
.bookmarkId(bookmark.getId())
.postId(post.getId())
.userId(user.getId())
.build();
})
.collect(Collectors.toList());
}
@Override
public Slice<CommentDslDto.ResponseDto> findCommentsByPostId(Long postId, Pageable pageable) {
QComment comment = QComment.comment;
List<CommentDslDto.ResponseDto> comments = queryFactory
.select(Projections.bean(CommentDslDto.ResponseDto.class,
comment.contents,
comment.user.nickname))
.from(comment)
.where(comment.post.id.eq(postId))
.orderBy(comment.createdAt.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize()+1)
.fetch();
boolean hasNext = comments.size() > pageable.getPageSize();
if(hasNext) {
comments.remove(comments.size() - 1);
}
return new SliceImpl<>(comments, pageable, hasNext);
}
@Test
public void benchmarkGetBookmarks() {
// 테스트를 위한 사용자 조회
User user = userRepository.findById(1L).orElseThrow();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
List<BookMarkDto.UserBookmarkDto> bookmarksJpaMethod = bookMarkService.getBookmarks1(user);
for (BookMarkDto.UserBookmarkDto userBookmarkDto : bookmarksJpaMethod) {
System.out.println("userBookmarkId() = " + userBookmarkDto.getBookmarkId());
}
stopWatch.stop();
System.out.println("Jpa 실행시간 측정 : " + stopWatch.getTotalTimeSeconds());
System.out.println(stopWatch.prettyPrint());
}
37ms
@Test
public void benchmarkGetBookmarks2() {
// 테스트를 위한 사용자 조회
User user = userRepository.findById(1L).orElseThrow();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
List<BookMarkDto.UserBookmarkDto> bookmarksQuerydslMethod = bookMarkService.getBookmarks(user);
for (BookMarkDto.UserBookmarkDto userBookmarkDto : bookmarksQuerydslMethod) {
System.out.println("userBookmarkId() = " + userBookmarkDto.getBookmarkId());
}
stopWatch.stop();
System.out.println("QueryDSL 실행시간 : " + stopWatch.getTotalTimeSeconds());
System.out.println(stopWatch.prettyPrint());
}
0.5ms
10만개로 많은 데이터는 아니었지만 QueryDSL 을 사용하였을 때 JPA보다 속도측면에서 이점이 더 많다는 것을 알 수 있었던 유의미한 테스트였다.