JPA Paging
2024. 11. 28. 23:01ㆍSpring Boot
게시판을 만들면서 이때 동안은 모든 데이터를 읽어왔다
하지만 데이터의 양이 많으면 많을 수록 속도가 느려지고
한 화면에 잡히지도 않으므로
Paging을 도입해서 데이터를 일정량만 읽어오도록 헀다
JPA에서 Paging는 Pageable과 Page 클래스를 이용한다
Pageable은 조건을 지정하는 클래스고 Paging이 적용된 데이터이다.
예시)
@GetMapping("")
public String main_board_page(
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "page", defaultValue = "0") int page,
@RequestParam(name = "size", defaultValue = "5") int size,
@RequestParam(name = "sort", defaultValue = "createdAt") String[] sorts,
Model model
) {
List<Sort.Order> orders = new ArrayList<>();
for(String sort : sorts) {
if(sort.equals("createdAt")) {
orders.add(Sort.Order.desc(sort));
}
else
orders.add(Sort.Order.asc(sort));
}
Pageable pageable = PageRequest.of(page, size, Sort.by(orders));
Page<postgre_data> dataPage = service.all_data2(pageable, title);
int totalPage = dataPage.getTotalPages();
page++;
if(page > totalPage) {
page = totalPage;
}
model.addAttribute("testList", dataPage);
model.addAttribute("page", page);
model.addAttribute("totalPage", totalPage);
log.info("{}",dataPage.getTotalPages());
return "db/postgreboard";
}
여기서 page는 몇 번째 page를 보여줄지 지정하는 변수이다 기본적으로 0부터 시작한다
size는 한 page에 몇 개의 데이터를 보여줄 지 정하는 변수이다 여기서는 기본적으로 5로 설정해 주었다
sort는 어떤 기준으로 정렬해서 page로 자를 지 나누는 변수이다 여기서는 기본적으로 만들어진 시간의 내림 차순 즉 최신의 데이터가 앞에 오도록 설정해 주었다.
public Page<postgre_data> all_data2(Pageable pageable, String title) {
return repo.findAllByTitle(pageable, title);
}
@Query("select data from postgre_data data where :title is null or data.title Like %:title%")
@SuppressWarnings("null")
Page<postgre_data> findAllByTitle(Pageable pageable, @Param("title") String title);
기존 메소드에 리턴 값을 Page로 바꾸고 매개변수에 Pageable을 추가해주면 알아서 paging이 동작한다.

이렇게 fetch로 일정량만 조회하는 것을 볼 수 있다.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class postgre_reposiotoryTest {
@Autowired
postgre_reposiotory repo;
@Test
@DisplayName("find all")
void find_all() {
for(int i = 0; i < 100; i++) {
repo.findAll();
}
}
@Test
@DisplayName("find paging")
void find_page() {
for(int i = 0; i < 100; i++) {
String a = null;
Pageable page = PageRequest.of(0, 30);
repo.findAllByTitle(page,a);
}
}
}
오버헤드를 고려 안 하고 100회 반복 테스트를 진행했다

그냥 findAll보다 paging을 적용하면 시간이 조금 걸리는 것을 볼 수 있다.
'Spring Boot' 카테고리의 다른 글
| JPA란? (0) | 2024.12.01 |
|---|---|
| Spring Data DTO (0) | 2024.12.01 |
| JPQL (0) | 2024.11.28 |
| Spring Cloud Eureka (0) | 2024.10.29 |
| Spring Cloud Gateway Filter (0) | 2024.10.29 |