[Querydsl] 10. 결과 조회

민정·2023년 1월 9일

QueryDSL

목록 보기
10/18
post-thumbnail

✨ 결과 조회

아래의 표는 querydsl의 결과를 조회해오는 여러 함수들을 정리한 표이다.

함수내용결과 없을 경우추가 내용
fetch( )리스트 조회[ ] (빈리스트 반환)
fetchOne( )단 건 조회null결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException 에러 발생
fetchFirst( )limit(1).fetchOne( )
fetchResults( )페이징 정보 포함total Count 쿼리 추가 실행
fetchCount( )count 쿼리로 변경해서 count 수 조회

✅ 정리

  1. 페이징 X

    • 여러 건 : fetch()
    • 단 건 : fetchOne()

  2. 페이징 O

    • 여러 건 : fetchResults()
    • 단 건 : fetchFirst()

  3. count 쿼리

    • fetchCount()

✅ 코드 예시

    /**
     * 결과 조회 쿼리
     */
    @Test
    public void resultFetch() {
        // 1. fetch() : 리스트 조회
        List<Member> fetch = queryFactory
                .selectFrom(member)
                .fetch();

        // 2. fetchOne() : 단 건 조회
        Member fetchOne = queryFactory
                .selectFrom(member)
                .fetchOne();

        // 3. fetchFirst() : 처음 1개 조회
        Member fetchFirst = queryFactory
                .selectFrom(member)
                .fetchFirst();// .limit(1).fetchOne()과 같음

        // 4. fetchResults() : 페이징 정보 포함. total count 쿼리까지 총 쿼리 2방 나감
        // 쿼리 2방 나감 (total count 가져와야해서)
        QueryResults<Member> results = queryFactory
                .selectFrom(member)
                .fetchResults();
        
        // 페이징 관련 함수들 사용 가능
        results.getTotal();
        List<Member> content = results.getResults(); // contents 꺼내기
        results.getLimit(); // 쿼리에 쓰인 limit 값 가져오기

        
        // 5. fetchCount() : count쿼리로 변경해서 count 수 조회
        long total = queryFactory
                .selectFrom(member)
                .fetchCount();

    }



✅ fetchResults 실행시 count 쿼리, contents 쿼리: 총 2개의 쿼리 실행

  1. count 쿼리
    memberId만 select

  2. contents 가져오는 쿼리
    모든 데이터 다 select

실제로 실행된 쿼리

✅ fetchCount 실행시 count 쿼리만 실행 : 총 1개의 쿼리 실행

count 쿼리만 실행된다.

즉, 쿼리 한방만 나간다.

실제로 실행된 쿼리

JPQL에서 엔티티 직접 지정시 SQL의 count 쿼리에서는 id로 변경된다.



참고

데이터를 조회하는 쿼리는 여러 테이블을 조인해야하지만, count쿼리는 조인이 필요없는 경우도 있다.

이런 경우 fetchResults() 함수가 자동적으로 생성하는 count 쿼리는 원본 쿼리와 같이 모두 조인을 해버려서 성능이 안 나올 수 있다.

실무에서는 count 쿼리에 조인이 필요없고, 성능 최적화가 필요한 경우, fetchResults를 사용하지 않고, count 전용 쿼리를 별도로 작성한다.

즉, 데이터를 조회해오는 쿼리count를 조회하는 쿼리를 별도로 작성해 실행한다.



출처

김영한 강사님 - 인프런 실전! Querydsl

0개의 댓글