본문 바로가기
개발/JPA

[JPA] fetchCount() 대체하기

by devhooney 2022. 10. 25.
728x90

회사에서 C#을 자바로 전환하는 작업을 하고있다.

약 16만 건의 데이터를 조회하고 페이징 하는 작업 중 화면까지 로딩 되는 시간이 오래 걸렸다.(3초 정도)

 

데이터가 그렇게 큰 것 같진 않은데 오래걸려서 속도를 단축시켜봤다.

테이블 구조는 예전에 만들어져 있던 것이라 수정할 수 없었고, 같은 테이블이 4번씩 조인되어 있었는데, 이러한 부분을 없애고, 자바쪽에서 데이터를 가공했다.

 

그 결과 1.3 ~ 1.5초로 단축했는데, 만족스럽지 않았다.

 

비슷한 경험을 한 회사 동료가 페이징 때문에 total을 계산 하는 쪽이 문제가 될 수도 있다고 해서, 그 부분을 없애니 속도가 0.1초대로 빨라졌다. 

 

JPAQuery<DTO> jpaQuery = query
        .select(
                Projections.constructor(DTO.class,
                       data,
                       data2
                )
        )
        .from(t)
        .leftJoin(t2).on(t1.userId.eq(t.userId))
        .leftJoin(t3).on(t2.testId.eq(t.testId))
        .where(builder);

int total = jpaQuery.fetch().size();

 

total 부분은 원래 fetchCount()로 했었는데, 이제 사용을 못해서 저렇게 사용했었는데,

 

int total = query
        .select(
              t.userId.count()
                )
        )
        .from(t)
        .leftJoin(t2).on(t1.userId.eq(t.userId))
        .leftJoin(t3).on(t2.testId.eq(t.testId))
        .where(builder)
        .fetchFirst();

 

이렇게 수정해서 속도를 향상시킬 수 있었다.

0.3초 정도 나왔다.

 

기존 코드에서는 페이징 끝 페이지로 이동 시 12초 정도 나왔는데(C#),

개선 후 0.7초로 줄일 수 있었다.

 

 

 

728x90