🔥스파르타 TIL (Spring)

Pageable을 알아보자

승승장규 2025. 2. 25. 23:07

데이터베이스에 수천 건이나 수만 건의 데이터가 존재할 때, 모든 데이터를 한꺼번에 조회하여 클라이언트로 전송하는 것은 네트워크 부하를 증가시키고애플리케이션의 성능 저하를 발생시킬 수 있다.

 

이러한 문제를 피하기 위해 페이징(Paging) 기법을 사용하여 필요한 데이터만 일정한 크기로 나누어 조회하고 전송함으로써 네트워크 트래픽을 최적화할 수 있다.

 

 

페이징을 사용하는 예시 ▼

 @GetMapping("/products")
    public Page<ProductResponseDto> getProducts(
            // 페이지, 사이즈, 정렬, 오름차순
            @RequestParam("page") int page,
            @RequestParam("size") int size,
            @RequestParam("sortBy") String sortBy,
            @RequestParam("isAsc") boolean isAsc,
            @AuthenticationPrincipal UserDetailsImpl userDetails){
            // 클라이언트에서는 1부터 시작하지만, Pageable 인터페이스 에서는 0부터 시작한다.
        return productService.getProducts(userDetails.getUser(), page-1, size, sortBy, isAsc);
    }
    
    
public Page<ProductResponseDto> getProducts(User user, int page, int size, String sortBy, boolean isAsc) {
        // 정렬
        Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
        Sort sort = Sort.by(direction, sortBy);
        Pageable pageable = PageRequest.of(page, size, sort);

        // 현재 로그인 한 유저의 권한 정보
        UserRoleEnum userRoleEnum = user.getRole();

        Page<Product> productList;

        if(userRoleEnum == UserRoleEnum.USER){
            productList = productRepository.findAllByUser(user, pageable);
        }else{
            productList = productRepository.findAll(pageable);
        }
        // page 타입에서 제공하는 map을 사용하면 데이터를 하나씩 돌리면서 ProductResponseDto 생성자를 통해 데이터 생성
        return productList.map(ProductResponseDto::new);
    }

 

 

페이징 기법을 사용하면 가독성과 한 번에 전달하는 데이터의 양이 줄어들어 네트워크 트래픽을 효율적으로 관리할 수 있고, 데이터베이스의 성능이 향상된다.

하지만 구현하기 위해 추가적인 코드 및 로직이 필요하여, 개발 및 유지보수에 부담을 줄 수 있고

페이지를 넘어서는 데이터가 변경될 경우, 사용자가 현재 보고 있는 페이지의 내용이 바뀔 수 있어서 페이지의 일관성이 떨어질 수 있다.