Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Controller, Paging, Sorting 본문

인프런/[인프런] QueryDsl

Controller, Paging, Sorting

Seung__ 2021. 9. 5. 22:39

1. Controller개발


  @GetMapping("/v2/members")
    public Page<MemberTeamDto> searchMemberV2(@ModelAttribute  MemberSearchCondition condition, Pageable pageable){
        return memberRepository.searchPageSimple(condition, pageable);
    }

    @GetMapping("/v3/members")
    public Page<MemberTeamDto> searchMemberV3(@ModelAttribute  MemberSearchCondition condition, Pageable pageable){
        return memberRepository.searchPageComplex(condition, pageable);
    }
  • QueryString으로 Pageable 정보가 전달되고, 
  • Controller에서 Pageable을 받는다면, SpringData가 알아서 바인딩 해줌.
http://localhost:8080/v2/members?page=0&size=5
{
    "content": [
        {
            "memberId": 3,
            "username": "member0",
            "age": 0,
            "teamId": 1,
            "teamName": "teamA"
        },
        {
            "memberId": 4,
            "username": "member1",
            "age": 1,
            "teamId": 2,
            "teamName": "teamB"
        },
        {
            "memberId": 5,
            "username": "member2",
            "age": 2,
            "teamId": 1,
            "teamName": "teamA"
        },
        {
            "memberId": 6,
            "username": "member3",
            "age": 3,
            "teamId": 2,
            "teamName": "teamB"
        },
        {
            "memberId": 7,
            "username": "member4",
            "age": 4,
            "teamId": 1,
            "teamName": "teamA"
        }
    ],
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "offset": 0,
        "pageSize": 5,
        "pageNumber": 0,
        "paged": true,
        "unpaged": false
    },
    "last": false,
    "totalElements": 100,
    "totalPages": 20,
    "size": 5,
    "number": 0,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "first": true,
    "numberOfElements": 5,
    "empty": false
}

 

 

2. Sort


  • 스프링 데이터 JPA는 자신의 정렬(Sort)을 Querydsl의 정렬(OrderSpecifier)로 변경하는기능을 제공 
  • 스프링 데이터의 정렬을 Querydsl의 정렬로 직접 전환하는 방법은 다음 코드를 참고하자.
JPAQuery<Member> query = queryFactory
			.selectFrom(member);
            
for (Sort.Order o : pageable.getSort()) {
	PathBuilder pathBuilder = new PathBuilder(member.getType(),member.getMetadata());

    query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,
    pathBuilder.get(o.getProperty())));

}
List<Member> result = query.fetch();
  • 정렬( Sort )은 조건이 조금만 복잡해져도 Pageable 의 Sort 기능을 사용하기 어렵다. 
  • 루트 엔티티범위를 넘어가는 동적 정렬 기능이 필요하면
  • 스프링 데이터 페이징이 제공하는 Sort 를 사용하기 보다는
  • 파라미터를 받아서 직접 처리하는 것을 권장한다.

 

3. GitHub : 210905 Paging, Controller


 

GitHub - bsh6463/Querydsl

Contribute to bsh6463/Querydsl development by creating an account on GitHub.

github.com

 

Comments