[Spring] QueryDSL 을 사용한 성능(속도) 테스트

Kyungmin·2024년 4월 10일
0

Spring

목록 보기
13/39

성능개선을 위해 기존에 있던 JPA 메서드에서 QueryDSL 을 사용한 메서드로 변경하여 속도 측정을 해보았다.

(간단하게 10만개의 더미 데이터를 가지고 테스트를 진행해보았습니다.)

1. JPA 를 사용한 메서드

    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());
    }

2. QueryDSL 을 사용한 메서드

    @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);

    }

3. 테스트 진행

✅ JPA 사용 - 37ms

@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

✅ QueryDSL 사용 - 0.5ms

@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보다 속도측면에서 이점이 더 많다는 것을 알 수 있었던 유의미한 테스트였다.

profile
Backend Developer

0개의 댓글

관련 채용 정보