본문 바로가기

백엔드

[Spring Boot] JPARepository 페이징 처리 및 Thymealeaf 호출 (+querydsl)

728x90

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의 데이터베이스에서 모든 결과를 가져온 후에야 가능하므로 페이징의 장점을 살리지 못합니다. 그래서 세번째 패러미터에 해당하는 값은 직접 만들어서 부여를 하는 것이 좋겠습니다.

728x90