개발일지/Spring

Spring - Pagination

E-room 2022. 10. 31. 21:25
728x90

Spring에서 제공하는 pagination을 이용하여 간단한 페이징 처리를 해보자

{
    "data": [
        {
            "memberId": 25,
            "email": "test5@test.com",
            "name": "이장고",
            "phone": "010-0505-0505"
        },
        {
            "memberId": 24,
            "email": "test4@test.com",
            "name": "스프링",
            "phone": "010-0404-0404"
        },
        {
            "memberId": 23,
            "email": "test3@test.com",
            "name": "파이썬",
            "phone": "010-0303-0303"
        },
        {
            "memberId": 22,
            "email": "test2@test.com",
            "name": "김자바",
            "phone": "010-1111-2222"
        },
        {
            "memberId": 21,
            "email": "test1@test.com",
            "name": "테스트",
            "phone": "010-1234-5678"
        }
    ],
    "pageInfo": {
        "page": 4,
        "size": 5,
        "totalElements": 20,
        "totalPages": 4
    }
}

 

Repository

public interface MemberRepository extends PagingAndSortingRepository<Member, Long> {
}

Spring에서 제공하는 PagingAndSortingRepository 상속받아 repository를 구현한다

  • PagingAndSortingRepository는 CrudRepository를 상속받는다

 

Page<T> findAll(Pageable pageable);

PagingAndSortingRepository의 findAll 메서드는 매개변수로 pageable 타입의 객체를 넘겨주면 page조건을 설정하여 데이터를 돌려준다

 

Service

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

 

표시할 page와 size(한 페이지당 데이터 수)를 매개변수로 받아 PageRequest 객체를 생성하여 findAll 메서드의 매개변수로 넘겨주어 Page<Member> 객체를 반환한다

  • PageRequest는 Pageable을 구현한다
  • Sort 객체를 매개변수로 정렬조건을 설정해주었다 -> "memberId" 를 기준으로 내림차순으로 정렬

 

Controller

@GetMapping
public ResponseEntity getMembers(@Positive @RequestParam int page,
                                 @Positive @RequestParam int size) {
	// page는 0부터 시작하므로 -1을 해준다 (배열 인덱스와 비슷한 느낌)
    Page<Member> memberPage = memberService.findMembers(page - 1, size);
    List<Member> members = memberPage.getContent();

    List<MemberResponseDto> response = mapper.membersToMemberResponseDtos(members);

    PageInfo pageInfo = new PageInfo(page, size, (int) memberPage.getTotalElements(), memberPage.getTotalPages());

    return new ResponseEntity<>(new MemberAllDto(response, pageInfo), HttpStatus.OK);
}

 

page와 size를 query parameter로 받는다

 

  • Page는 Slice를 상속받는다. getContent() 메서드를 통해 List객체로 변환해준다.
  • Page에서 제공하는 다양한 메서드들을 통해 총 페이지 수, 데이터 수 등의 정보를 얻어 페이지 정보를 담는 PageInfo 객체를 생성해주었다

(자세한 내용은 해당 클래스를 타고 들어가면 있음)

 

// 페이지 정보를 담을 클래스
@Getter
@AllArgsConstructor
public class PageInfo {
    private int page;
    private int size;
    private long totalElements;
    private int totalPages;
}

 

// 최종 반환할 데이터를 담을 클래스
@Getter
@AllArgsConstructor
public class MemberAllDto {

    private List<MemberResponseDto> data;
    private PageInfo pageInfo;

}
728x90