강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김시환님의 프로필 이미지
김시환

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V6: JPA에서 DTO로 직접 조회, 플랫 데이터 최적화

수업 코드는 아니지만 페이징 최적화에 대해

작성

·

404

2

안녕하세요 강사님 

강의를 수강하면서 따로 토이 프로젝트를 만들어보고있는데

페이징 부분에 대해서 성능 최적화를 어떻게 해야 좋을지 모르겠어서 죄송하게도 강의 내용은 아니지만 질문드려봅니다

public class Board {
    ..//
    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
    private Set<Comment> comments = new LinkedHashSet<>();

    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
    private Set<BoardAlbum> boardAlbums = new LinkedHashSet<>();

    @ManyToOne(fetch = FetchType.LAZY)
    private Member member;

제 Board Entity 코드고 

수강하면서 조회 성능의 개선을 위해서 ToOne은 Entity Graph로, To Many는 BatchSize 1000을 통한 최적화로 조회 성능을 향상시킬 수 있었는데 
페이징의 경우 Desc 를 사용함으로써 속도가 매우 느려짐을 확인했습니다

    @Query("SELECT b FROM Board b where b.id<:id order by b.id desc ")
    @EntityGraph(attributePaths = {"member"})
    Slice<Board> findBoards(Pageable pageable, @Param("id") Long id);

Board 데이터 백만개 기준으로 위의 로직은
제일 자주 보이는 첫 페이지가  평균 2초 ~ 마지막 페이지 거의 0초의 속도로 데이터를 조회합니다..

좀 더 개선해보고자
인덱스는 pk가 인덱스기에 pk로 정하고  no offset으로,
Querydsl을 사용해

    public List<~dto> paginationNoOffset(Long boardId, int size) {

        return queryFactory
                .select(Projections.fields(~ dto))
                .from(board)
                .join(board.member,member).fetchJoin()
                .where(
                        ltBoardId(boardId),
                )
                .orderBy(board.id.desc())
                .limit(size)
                .fetch();
    }

    private BooleanExpression letBoardId(Long boardId) {
        if (boardId == null) {
            return null; 
        }

        return board.id.lt(boardId);
    }

위와 같이 구성해 테스트해보았으나 오히려 더 느린 4초대가 나오더라구요 

강의에 대한 질문은 아니지만
혹시 해답에 대한 언질을 주실 수 있으시다면 감사하겠습니다 

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 시환님

우선 문제에 집중하기 위해서 예제에서 fetch join 부분을 제거하고 확인해보시면 더 좋을 것 같아요.

추가로 인덱스 이슈일 수 있으니, 다음 키워드로 검색해보시면 도움이 되실거에요.

mysql index desc

쉽게 설명한 블로그 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tyboss&logNo=70019562239

감사합니다.

김시환님의 프로필 이미지
김시환
질문자

답변 감사합니다. 확인해보겠습니다!

김시환님의 프로필 이미지
김시환

작성한 질문수

질문하기