JPArepository
페이징이랑 데이터베이스의 기록리스트를 불러오고, 개수로 나눠서 페이지를 구분하는 것을 의미합니다.
Repository에서 extends JPARepository를 한다면 다음과 같이 페이징 처리가 가능합니다
Page<Product> findByName(String name, Pageable pageable);
Service에서 findByName을 호출해 보겠습니다.
Page<Product> productPage = productRepository.findByName("펜",PageRequest.of(0,2));
PageRequest.of(0,2)를 살펴보겠습니다.
0 -> 페이지 번호 2 -> 페이지당 데이터 개수로
0번째 페이지(첫 페이지)에서 "펜"이라는 이름을 가진 Product 2개를 불러오는 방식입니다
하지만 우리는 여기서 끝날 것이 아니라 프론트엔드에서도 이 데이터들을 출력해야 한다.
Thymeleaf에는 이와 같은 방법으로 구현할 수 있습니다.
(page는
Page <Product> page = productService.getProductListByPage(page);
model.addAttribute("page" , page);이다)
<!-- 각 product 호출하기 -->
<tbody>
<tr th:each = "product : ${page.content}">
<td th:text = "${product.id}"></td>
<td th:text = "${product.name}"></td>
<td th:text = "${product.price}"></td>
</tr>
</tbody>
Querydsl
스프링부트 2.XX 버전에서는 QueryResults 랑 fetchResults()를 지원했습니다. 하지만 버전이 3.0 이상에서는 QueryResults를 지원을 하지만 fetchResults() 메서드는 deprecated 되었다. 따라서 Repository에서 QueyrResults를 리턴 값으로 갖는 메서드는 만들기가 힘들 다고 느꼈습니다
나는 그래서 다음과 같은 방법을 생각했습니다
public Page<Product> paging(Pageable pageable){
List<Product> results = queryFactory
.selectFrom(product)
.orderBy(member.name.desc())
.limit(2)
.fetch();
return new PageImpl<>(results,pageable,results.size);
하지만 여기서 저는 임시적으로 size를 사용했지만 이 경우를 사용했을 경우 results의 데이터베이스에서 모든 결과를 가져온 후에야 가능하므로 페이징의 장점을 살리지 못합니다. 그래서 세번째 패러미터에 해당하는 값은 직접 만들어서 부여를 하는 것이 좋겠습니다.
'백엔드' 카테고리의 다른 글
[Spring Boot] @Validation 유효성 (0) | 2023.12.17 |
---|---|
[Spring Boot] Spring JDBC (0) | 2023.12.16 |
[Spring Boot] @ConfigurationProperties (0) | 2023.12.16 |
[Spring Boot] 컴포넌트와 빈 차이 (Component vs Bean) (1) | 2023.12.01 |
[Spring Boot] 스프링 빈 (Spring Bean) & 스프링 컨테이너 (Spring Container) (0) | 2023.12.01 |