1. Spring Data JDBC 기반 데이터 액세스 계층에서 페이지네이션(Pagination) 기능을 적용할 수 있다.
- 페이지네이션 (Pagination) 정의
✔︎ 데이터 베이스에 있는 모든 데이터를 요청하는 것이 아니라, 한 페이지에 일정한 개수만큼 나누어 요청하는 것
☞ Spring Data JDBC 기반 데이터 액세스 계층 실습 내용으로 페이지네이션 기능을 적용하는 것이었다. Spring에서 지원하는 페이지네이션 API를 이용해 구현해내는 것이 키 포인트 🌟
@GetMapping
public ResponseEntity getMembers(@Positive @RequestParam int page,
@Positive @RequestParam int size) {
Page<Member> pageMembers = memberService.findMembers(page-1, size);
List<Member> members = pageMembers.getContent();
List<MemberResponseDto> data = mapper.membersToMemberResponseDtos(members);
return new ResponseEntity<>(
new PageResponseDto<>(data, pageMembers), HttpStatus.OK);
}
- 클라이언트 측으로부터 page정보와 size정보를 받음
- 부가 정보이므로 @RequestParam 애너테이션을 이용해 쿼리 파라미터로 받음
- Spring에서는 page번호가 0부터 시작, 반면 클라이언트 측에서는 편리성을 위해 1부터 사용하도록 함
- 따라서 Controller 측은 page-1를 사용
public interface MemberRepository extends PagingAndSortingRepository<Member, Long> {
Optional<Member> findByEmail(String email);
}
- 페이지네이션 기능을 제공하는 PagingAndSortingRepository의 findAll(Pageable) 이용
public Page<Member> findMembers(int page, int size) {
return memberRepository.findAll(PageRequest.of(page, size, Sort.by("memberId").descending()));
}
- 페이지네이션 된 정보 리턴
- Pageable 인터페이스의 구현 클래스인 PageRequest를 이용
- Sort를 이용해 memberId를 내림차순으로 정렬 (최신순)
@AllArgsConstructor
@Getter
public class PageInfo {
private int page;
private int size;
private long totalElements;
private int totalPages;
}
- 페이지 정보 제공
@Getter
public class PageResponseDto<T> {
private List<T> data;
private PageInfo pageInfo;
public PageResponseDto(List<T> data, Page page) {
this.data = data;
this.pageInfo = new PageInfo(page.getNumber()+1, page.getSize(),
page.getTotalElements(), page.getTotalPages());
}
}
- 별도의 Response용 DTO 클래스
・ JPA (Java Persistence API)
・ 엔티티 매핑