2024.07.04
학습
● 1. Pagination 사용 방법과 사용 이유
Pagination
페이지네이션 이란, 여러개의 게시글을 페이지당 보여질 갯수와 페이지로 나누어서 보여주는 방식이다.
1. Pagination을 사용하는 이유
서버 입장에서 게시글이 몇개가 존재할지 알 수가 없다. 만약, DB에 1억개의 게시글이 존재한다고 가정했을 때
1억개의 게시글을 전체 조회를 하게 되면 서버에 부하가 걸려 서버가 내려갈 것이다.
또한, 한 페이지에 1억개의 데이터를 보여주게 된다고 했을때, 눈으로 보기가 매우 힘들 것이다.
이러한 이유 때문에 많은 웹 사이트들은 Pagination을 사용하고 있다.
2. Pagination 예시
위의 사진과 같이 한페이지에는 여러개의 게시글을 보여줄 수 있으며, 페이지 하나당 몇개의 게시글을 보여줄지 정하게 된다. 해당 사진은 6개의 게시글을 보여주고 있으며 페이지는 총 1~7348 페이지가 존재한다.
즉, DB에는 6과 7348을 곱한 44,088개의 게시글이 존재할 것이다. 이걸 한번에 보여주게 되면 서버에 부하가 걸릴 것이다.
3. QueryDSL에서 Pagination이용하기
아래의 로직은 Board 엔티티를 이용하여 게시글을 전체 조회하되 Pagination을 이용하여 원하는 페이지 갯수와
보여질 게시글의 수를 잘라서 조회해주는 로직이다.
public List<BoardResponse> getBoardListWithPage(int page, int size) {
// PageRequest => 스프링 내부에서 자동으로 사용자의 입력한 페이지와 사이즈에 대한 범위를 생성해주는 것임.
PageRequest pageRequest = PageRequest.of(page, size);
// getBoardListWithPage() => QueryDSL을 이용하고 있는 메서드 호출
List<Board> boardPageList = BoardRepository.getBoardListWithPage(
pageRequest.getOffset(),
pageRequest.getPageSize())
// 반복문 및 스트림을 이용하여 나머진 알아서 처리
return /*List타입과 BoardResponse타입 매개변수에 맞게 변환해서 return*/
}
먼저 해당 메서드가 호출되면서 정수 타입 두개의 인자를 받게 된다. 각각 page, size가 되겠다.
page는 현재 보여질 페이지를 나타내는 정수이고, size는 페이지에 보여질 게시글의 수를 나타내는 정수이다.
PageRequest객체를 이용하여 자동으로 입력한 페이지와 사이즈에 대한 범위를 생성을 해줄 수 있다.
getBoardListWithPage() 메서드 호출 당하는 곳
@Repository
@RequiredArgsConstructor
public class BoardRepositoryImpl implements BoardRepositoryCustom {
private final JPAQueryFactory jpaQueryFactory;
@Override
public List<Board> getBoardListWithPage(int offset, int pageSize) {
QBoard board = QBoard.board;
List<Board> boardPageList = jpaQueryFactory.select(board)
.from(board)
.offset(offset)
.limit(pageSize)
.fetch();
return boardPageList;
}
}
해당 클래스에서 커스텀한 인터페이스를 구현하고 있으며 해당 인터페이스는 JpaRepository를 상속받고 있는 BoardRepository를 통해 사용이 된다.
offset(offset) 메서드를 통해 받아온 page 즉, 현재 페이지가 몇페이지인지 나타내는 정수를 인자로 넣어주면 된다.
limit(pageSize) 메서드를 통해 페이지의 현재 페이지에 보여줄지 정하는 정수를 인자로 넣어주면 된다.
후에 fetch() 메서드를 통해 쿼리를 날려주게 되면 받아온 page와 size에 맞는 게시글을 list로 받을 수 있게 된다.
참고
여기서 개인적인 생각으로는 limit과 같은 pageSize는 클라이언트단에서 웬만하면 보내지 않고 서버에서 정하는게 좋다고 생각한다. 이유는 limit에 들어갈 pageSize같은 경우에는 클라이언트가 1억을 입력해 넣게 되면 1억개의 데이터가 조회가 되기 때문에 문제가 생길 우려가 있다. 그러므로 pageSize는 서버에서 디폴트로 정해두는것이 맞다고 생각한다.
정리
DB에 조회 쿼리를 날리는 건 많은 비용이 든다. 무분별하게 쿼리를 날리게 되면 많은 비용이 들게 되므로 페이지네이션을 이용하여 데이터의 조회 갯수를 제한하게되면 비용에 대한 문제와 서버가 터질 우려가 사라지게 된다. 매우 좋은 기능!
회고
오늘은 QueryDSL을 이용하여 페이지네이션을 사용하는 방법을 학습을 하게 되었다.
더욱 많은 기능들이 존재하지만, 알아가기 위해선 JPA의 기초와 SQL문에 대한 학습이 더욱 필요하다고 느끼게 되었다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 57일차 TIL - Docker(1) (0) | 2024.07.08 |
---|---|
내일배움캠프 56일차 TIL - AWS(3) RDS (0) | 2024.07.04 |
내일배움캠프 54일차 TIL - QueryDSL 사용하는 방법 (0) | 2024.07.02 |
내일배움캠프 53일차 TIL - 면접 예상 질의 응답 (0) | 2024.07.02 |
내일배움캠프 52일차 TIL - AWS(2) EC2 (0) | 2024.07.01 |