📄 학습내용
Pagination
- 데이터의 페이지와 페이지 크기만큼 나누어서 데이터를 요청하는 방식
REST API의 Pagination 방법
- Offset-Based Paginagtion
- offset 쿼리를 이용해서 페이지와 페이지 크기 단위의 데이터 요청/응답하는 방식
- 장점 : 페이지 이동 가능
- 단점
- 페이지 이동 시 데이터 변경이 발생하면 중복 데이터 생성
- RDBMS에서 Offset 쿼리를 사용을 통한 성능 저하
- Cursor-Based Pagination
- cursor 개념을 이용해서 마지막으로 전송된 데이터를 기준으로 필요한 데이터 N개만큼 데이터 요청/응답하는 방식
- 인스타그램의 스크롤 방식
- 장점 : 실시간으로 변하는 리소스를 사용하는 경우 발생하는 중복 전송 방지
참고 사이트 : https://wonyong-jang.github.io/database/2020/09/06/DB-Pagination.html
Spring을 이용해서 Offset-Based Pagination 구현
- Pagination 구현에 사용되는 import 파일
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
- 변수
int page; // 현재 페이지 번호
int size; // 페이지의 크기
- controller(API 계층)
- service로부터 page와 size로 나누어진 데이터를 Page<T> 객체로 받음
- Page<T> 객체의 getContent() 메서드를 통해서 List<T> 형태의 객체 반환
- 이때 T는 Spring MVC의 Entity 클래스
// service : 서비스 계층 객체
Page<T> pageData = service.finds(page-1, size); // page-1 이유 : 시작 index가 0이기 때문
List<T> data = pageData.getContent();
- service(비즈니스 계층)
- repository의 인자값으로 전달할 Pageable 객체 생성
- Pageable 객체의 초기화는 PageRequest.of() 메서드 이용
Pageable pageable = PageRequest.of(page, size, Sort.by("정렬기준(Entity의 멤버변수)").descending()); // 정렬기준의 내림차순 정렬
Page<T> pageObject = memberRepository.findAll(pageable); // page와 size로 나누어진 데이터
- repository
- CrudRepository를 상속받은 인터페이스 repository에 모든 데이터를 page와 size에 따라 필요한 데이터를 가져올 수 있게 하는 메서드 findAll() 추가하기
Page<T> findAll(Pageable pageable)
주제
주제
주제
주제
⭐ 공부 난이도
JDBC service & repository ☆☆★★★
🎡 페어리뷰
🌕 느낀점
pagination을 할 수 있는 API가 있었는데 찾지 못해서 가져온 데이터에 직접 필터링을 걸어서 pagination을 구현하였다. @RequestParam을 이용해서 page와 size를 받아오려고 했지만 사용법을 잘못 알고 있는 바람에 postman에서 body를 통해서 page와 size를 전송했다. 그래서 계속 400 error가 나왔고 그 이유를 몰라서 한참 헤매다가 원인을 발견했다. HTTP의 구조에 대해서 공부할 필요성이 있다.
'코드스테이츠 - 3회차 백엔드 부트캠프 > Section 3' 카테고리의 다른 글
2022.11.02 수 - JPA (2) (0) | 2022.11.02 |
---|---|
2022.11.01 화 - JPA (1) (0) | 2022.11.01 |
2022.10.28 금 - JDBC (2) (0) | 2022.10.28 |
2022.10.27 목 - JDBC (0) | 2022.10.27 |
2022.10.26 수 - 예외처리(2) (0) | 2022.10.26 |