JPA Paging

2024. 11. 28. 23:01Spring 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