Paging
이번에는 Paging 기능을 분석해보겠습니다.
우선 화면을 보면서 시작해보겠습니다.
등록 된 상품을 보여주는 페이지를 통해 페이징 기능을 분석해보겠습니다.

Controller

시작은 매개변수의 itemSearchDto, page 값이 비어있는 상황으로 가정하겠습니다.
PageRequest.of는 현재 페이지와 한 페이지에 보일 상품의 개수를 매개변수로 하고
Pageable값으로 반환합니다.

'Pageable' 기능은 Spring 프레임워크에서 제공하는 기능으로, 페이지네이션 기능을 편리하게 구현할 수 있도록 해줍니다. 이 경우 (0,3) 매개변수는 페이지당 3개 항목의 페이지 크기가 있는 첫 번째 페이지가 요청됨을 나타냅니다.
RepositoryImpl

RepositoryImpl에서 DB에 접근하는 부분을 분석해보겠습니다.
queryFactory는 데이터베이스 쿼리를 생성하는 부분입니다.
QItem.item은 Item 엔티티에 대한 별칭입니다. QItem은 QueryDsl을 사용하였습니다.
여기서 ItemSearchDto의 필드 구성을 살펴보겠습니다.

where을 통해 검색 조건 필터를 걸었습니다.
1, 등록 날짜

searchDateType 값에 따라 dateTime 값을 조정하는 부분입니다.
searchDateType 값이 "all"이거나 null인 경우 null을 반환합니다.
값이 "1d"인 경우 dateTime에서 1일을,
값이 "1w"인 경우 dateTime에서 1주일을,
값이 "1m"인 경우 dateTime에서 1개월을,
값이 "6m"인 경우 dateTime에서 6개월을 빼서 업데이트합니다.
return QItem.item.regTime.after(dateTime);
이는 QItem.item의 regTime 필드가 dateTime보다 이후인지를 나타내는 BooleanExpression입니다.
2, 판매 상태

3, 아이템 이름, 글쓴이

아이템 이름 or 작성자가 검색창에 입력한 값과 일치하는지 확인합니다.
여기까지가 where절의 조건필터였습니다.
다시 getAdminItemPage 메소드로 돌아오겠습니다.

.orderBy(QItem.item.id.desc())
나열 순서를 아이디 내림차순으로 하고
.offset(pageable.getOffset())
페이지의 시작 위치를 나타냅니다.
.limit(pageable.getPageSize())
limit는 한 페이지에 표시할 항목수를 나타냅니다.
.fetchResults();
fetchResults()를 통해쿼리를 실행하고 결과를 가져옵니다.
List<Item> content = results.getResults();
결과 목록을 가져옵니다.
long total = results.getTotal();
결과 목록의 숫자를 가져옵니다.
return new PageImpl<>(content, pageable, total);
결과목록, 페이지 정보, 결과 숫자를 사용하여 PageImpl 객체를 생성합니다.
이는 페이지네이션 된 결과를 나타냅니다.
이 과정은 실행된 쿼리 결과에서 페이지네이션된 결과를 생성하기 위한 작업입니다.
offset과 limit을 사용하여 쿼리 결과를 해당 페이지에 맞게 자르고, 결과 목록과 총 결과 수를 사용하여 PageImpl 객체를
생성하여 반환합니다. 이를 통해 페이지네이션된 결과가 최종적으로 반환됩니다.
이렇게 반환된 값은 다시 컨트롤러로 돌아옵니다.

반환된 값과 검색조건, maxPage를 담아 아이템 관리 페이지로 보내주고
html에서 넘어온 값들을 적절히 매치만 시켜주면 페이지네이션 기능이 완성됩니다.
'Deep Dive > BACK' 카테고리의 다른 글
| HtmlUtils.htmlEscape (0) | 2023.07.11 |
|---|---|
| 프로젝트에 사용할 Java 버전 결정 (0) | 2023.07.02 |
| Ajax 통신 (0) | 2023.06.20 |
| 사진 리스트 업로드 (0) | 2023.06.20 |
| Spring Security 분석 (0) | 2023.06.20 |