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
'개발일지 > Spring' 카테고리의 다른 글
Spring JPA 엔티티 매핑 (0) | 2022.11.05 |
---|---|
JPA (Java Persistence API) (0) | 2022.11.04 |
Spring - AOP (0) | 2022.10.23 |
Spring MVC의 동작 방식과 구성 요소 (0) | 2022.10.22 |
Spring MVC (0) | 2022.10.22 |