Java&Web

[JPA] Spring Data JPA (3) - 페이징과 정렬

프로그래민 2020. 8. 28. 15:24
반응형

페이징과 정렬

Spirng Data JPA는 아주 간편한 페이징과 정렬기능을 제공해준다. 메소드의 리턴 타입으로 Page를 사용해주고, pageable이란 파라미터에 시작페이지, 갯수, 정렬조건, 그리고 메소드이름으로 검색조건을 적절히 사용해준다면 count쿼리까지 자동으로 조회해주는 쉬운 페이징을 할 수 있다. 다음과 같은 예시가 있다.

1
2
3
4
5
public interface MemberRepository extends JpaRepository<Member,Long>{
 
    //페이징
   Page<Member> findByAge(int age, Pageable pageable);
}
                                                        

위 처럼 Page를 리턴타입으로 받아주고, Pageable 변수를 파라미터로 가지는 메소드 네이밍 쿼리를 작성하였다. 이것을 이용하여 다음과 같은 테스트 코드를 작성해보았다.

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
32
33
34
35
36
37
38
39
40
41
42
@SpringBootTest
@Transactional
@Rollback(false)
class MemberRepositoryTest {
 
    @Autowired
    MemberRepository memberRepository;
 
    @Test
    public void paging(){
        memberRepository.save(new Member("member1",10));
        memberRepository.save(new Member("member2",10));
        memberRepository.save(new Member("member3",10));
        memberRepository.save(new Member("member4",10));
        memberRepository.save(new Member("member5",10));
 
        int age=10;
        //pageRequest.of(페이지, 한페이지에서 갯수, 정렬조건(생략가능))
        PageRequest pageRequest = PageRequest.of(03, Sort.by(Sort.Direction.DESC, "username"));
 
        Page<Member> page = memberRepository.findByAge(age, pageRequest);
 
        //Dto로 변환하는 간단 코드
        Page<MemberDto> map = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
 
        //조건에의해 페이징 된 content
        List<Member> content =page.getContent();
        for (Member member : content) {
            System.out.println(member);
        }
        long totalElemets = page.getTotalElements();
        System.out.println(totalElemets);
 
        cotent.size();              //조건에의해 페이징 된 content의 크기로 3 이 나온다
        page.getTotalElements();    //전체 데이터 수
        page.getNumber();            //현재 페이지
        page.getTotalPages();        //전체 페이지
        page.hasNext();                //다음 페이지 있는지 확인
 
    }
 
}
         

위처럼 MemberRepositroy에 작성한 메소드 네임 쿼리를 호출하여 페이징과 정렬을 하는 테스트 코드를 작성해보았다. pageRequest라는 변수를 이용하여 원하는 페이지인덱스, 한페이지에서의 갯수, 정렬조건을 설정해주었다. 여기서 주의할점은 페이지의 맨처음 인덱스는 0부터 시작이라는 것이다. 또한, 정렬조건은 생략을 해줄수도 있고, 메소드 네임 쿼리에서도 해결할 수도 있다. 메소드호출 후 반환타입인 Page인터페이스가 제공하는 다양한 메소드또한 사용가능하다. 만일 무한 스크롤을 이용하는 페이지 구성이면 메소드의 리턴타입으로 Page가 아니라 Slice를 사용한다면 count쿼리를 불필요하게 보내주지 않게 된다.

 

Web 확장 페이징과 정렬

스프링 MVC에선 좀 더 편리하게 클라이언트쪽에서의 특정파라미터 제공으로만으로 페이징을 가능케 해준다. 특정 파라미터로는 다음과 같은 것이 있다.

  • page : 현제 페이지, 0부터 시작
  • size : 한 페이지에 노출할 데이터 건수
  • sort : 정렬 조건
  • 예) /members?page=0&size=20&sort=id,desc&sort=username,desc
1
2
3
4
5
6
7
8
9
10
@RestController
class MemberController {
    
    @GetMapping("/members")
    public Page<Member> list(Pageable pageable){
        Page<Member> page = memberRepository.findAll(pageable);
        return page;
    }
}
 
                                                                  

 

 

출처 : 자바 ORM 표준 JPA 프로그래밍 - 에이콘 출판, 김영한 저
반응형