스프링데이터 + JPA/QueryDSL

12. 페이징

sdafdq 2023. 11. 28. 14:29

페이징이다. 여기선 간단하게 몇번째부터 몇개까지 라고 이해하면 된다.

 

Spring Data JPA에서 객체로 했던 페이징은 뭐랄까 좀더 인간친화적인? 몇페이지의 몇개, 이거고,

이 QueryDSL은 자바의 쿼리 메소드를 통해 JPQL 즉, 쿼리를 만드는 것이므로, offet(몇번째부터), limit(개수)를 활용한다.

@Test
public void paging1(){
    List<Member> result = query.selectFrom(m).orderBy(m.username.desc())
            .offset(1)
            .limit(2)
            .fetch();

    for (Member member : result) {
        System.out.println("member = " + member.getUsername());
    }
}

 

/* select
    member1 
from
    Member member1 
order by
    member1.username desc */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    order by
        m1_0.username desc 
    offset
        ? rows 
    fetch
        first ? rows only

앞에 주석이 JPQL, 뒤가 실제 DB에 나가는 쿼리.

 

select m1_0.member_id,m1_0.age,m1_0.team_id,m1_0.username from member m1_0 order by m1_0.username desc offset 1 rows fetch first 2 rows only;

여기 보면 쿼리메소드 대로 offset 1부터, 한칸 띄우고 부터, 처음 2개 rows만 가져옴.

 

그리고 나온 것의 결과는 

member = member3
member = member2

 

앞서 넣은 member1~4 중 desc로 즉 내림차순, 4는 뛰어넘어 3,2,1부터 2개 3,2를 가져옴.

 

@Test
public void paging2(){
    QueryResults<Member> memberQueryResults = query.selectFrom(m).orderBy(m.username.desc())
            .offset(1)
            .limit(2)
            .fetchResults();
    List<Member> result = memberQueryResults.getResults();

    for (Member member : result) {
        System.out.println("member = " + member.getUsername());
    }

    System.out.println("total = " + memberQueryResults.getTotal());
    System.out.println("limit = " + memberQueryResults.getLimit());
    System.out.println("offset = " + memberQueryResults.getOffset());
    System.out.println("fetch size = " + memberQueryResults.getResults().size());
}

fetchResults를 쓴 경우.

QueryResults란 QueryDSL이 제공해주는 페이징 객체이다.

스프링 Data JPA와 마찬가지로 페이징에 대한 정보를 같이 제공해 주는 객체이다.

이 객체로 DB에서 가져온 결과들을 한번 감싸는 것이다.

 

total = 4
limit = 2
offset = 1
fetch size = 2

 

이렇게 나온다.

 

근데, 이거 이제 deprecated 되었다.

앞서 말했듯이 fetchCount도 마찬가지.

왜냐하면 이게 count쿼리를 만드는, 즉 fetchCount()도 같이 실행 되는데, 그게 제대로 안 만들어 진다.

예를 들어 join 여러 개 하면 쿼리가 뻥튀기가 될 수도 있는데, 그럴 경우 얘가 쿼리를 어떻게 만들어야 할 지 모른다.

카운트 쿼리도 모두 join해서 가져와야 하나? 이러는 것 같다.

 

그래서 아예, 카운트 쿼리 만드는 메소드는 deprecated 시켜서 카운트 쿼리는 직접 만들도록 유도시키는 것 같다. 

 

나중에 SpringDataJPA와 QueryDSL 페이징을 연동시키는 방법을 배우니, 페이징 객체는 그걸로 하면 될 듯.

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

14. join  (0) 2023.11.29
13. 그룹  (0) 2023.11.29
11. 정렬  (0) 2023.11.28
10. 결과 조회  (0) 2023.11.28
9. 검색 조건 쿼리  (0) 2023.11.28