스프링에서 Spring DATA JPA를 이용하여 Page기능 구현하기

SionBackEnd·2022년 9월 29일
0

Spring(봄)

목록 보기
14/22

스프링 페이징기능을 구현해보자

차근차큰 아주 정확환 방법으로 궁금한 점을 해결해주겠다.

DATA JPA에서의 페이징

spring data jpa에서는 페이징을 지원해준다. 그래서 Page 클래스를 이용해서 쉽게 구현가능하다.

먼저 repository클래스이다.

public interface MemberRepository extends JpaRepository<Member,Long> {

}


jpaRepository인터페이스는 위의 그림과 같이 pagingAndSortingRepository인터페이스를 상속하고 있어서 페이징기능을 사용할 수 있다.

우리는 여기서
1. findAll기능과
2. pagingAndSortingRepository인터페이스
두가지를 사용할 것이다.

Service

서비스 로직에서는 당연히... 코드 먼저 보자

    public Page<Member> findMembers(int page, int size) {
        return memberRepository.findAll(PageRequest.of(page, size, Sort.by("memberId").descending()));
    }

페이지객체를 리턴해야한다. 페이지 객체는 멤버객체를 제네릭으로 갖고 있다.
memberRepository.findAll 메소드는 매개변수로 pageable 데이터타입을 가질수 있다.
PageRequest.of(page, size, Sort.by("memberId").descending())코드는
PageRequest타입으로 page와 size, 정렬순서기준등을 매개변수로 넣는다.

찾아보면 pageRequest클래스는 AbstractPageRequest를 상속하고 AbstractPageRequest추상클래스는 Pageable인터페이스를 상속한다. 그래서 매개변수로 올 수 있다.

mapper

나는 dto클래스를 이용해서 api통신을 하는 CSR방식의 서버코드를 작성중이라 dto를 이용하여 클라이언트에게 데이터를 보내준다.

    default List<MemberDto.response> membersToMemberResponses(List<Member> members) {
        List<MemberDto.response> collect = members.stream()
                .map(member -> memberToMemberResponseDto(member))
                .collect(Collectors.toList());
        return collect;
    }

매퍼같은 경우 스트림을 이용하여 간단하게 구현하였다.

Controller

 @GetMapping
    public ResponseEntity findMembers(@RequestParam("page") @Positive int page,
                                      @RequestParam("size") @Positive int size) {
        Page<Member> pageMembers = service.findMembers(page - 1, size);
        List<Member> members = pageMembers.getContent();

        return new ResponseEntity<>(mapper.membersToMemberResponses(members),HttpStatus.OK);
    }

추가적인 설명이 필요한 부분은 pagemembers.getContent이다. getContent는 파라미터로 지정한 페이지 안에있는 member객체들의 데이터를 뽑아오는것이라고 생각하면 편하다.
page에 -1을 해준이유는 사람들은 1페이지부터 시작한다고 생각할텐데 컴퓨터의 시작은 0부터라서 첫번째 데이터를 가져오고싶다면 0번째 페이지부터 탐색을 해야지 첫번째 데이터를 가져올 수 있다.

정리

포스트맨으로 get요청을 보내면 파라미터에 작성한 page,size의 값에 따라서 데이터가 전달될 것이다.

많은 부분 설명이 누락되어있지만, 궁금한점은 댓글을 달아주시면 감사하겠습니다.

Page 인터페이스가 제공하는 메소드 사이트

profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글