개발/Spring

Spring Data JPA에서 Pageable 기능 활용하기

이쪽저쪽살짝 2023. 4. 2. 10:19
반응형

들어가며
Spring Data JPA는 애플리케이션 개발에 있어 데이터베이스와의 효율적인 상호작용을 도와주는 프레임워크입니다. Pageable 기능은 Spring Data JPA에서 제공하는 편리한 페이징 및 정렬 처리를 위한 인터페이스입니다. 이 글에서는 Pageable 기능에 대한 상세한 사용법과 예제를 설명합니다.

Pageable 인터페이스 소개
Pageable 인터페이스는 페이징 및 정렬 정보를 저장하고 처리하는 데 사용됩니다. 이를 통해 요청된 페이지 번호, 페이지 크기, 정렬 방식 등의 정보를 쉽게 처리할 수 있습니다.

주요 메서드
1. getPageNumber(): 현재 페이지 번호를 반환합니다.
2. getPageSize(): 페이지당 요소 개수를 반환합니다.
3. getSort(): 정렬 정보를 반환합니다.
4. next(): 다음 페이지 정보를 반환합니다.
5. previousOrFirst(): 이전 페이지 정보를 반환하거나 첫 페이지 정보를 반환합니다.


Pageable 사용 예제
Repository 인터페이스에 메서드 추가
먼저, 페이징 기능을 사용하려는 Repository 인터페이스에 Pageable 파라미터를 추가합니다.

public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findAll(Pageable pageable);
}

컨트롤러에서 Pageable 파라미터 사용하기
다음으로, 컨트롤러에서 Pageable 파라미터를 사용하여 요청을 처리합니다.

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public Page<User> getUsers(Pageable pageable) {
        return userRepository.findAll(pageable);
    }
}

페이징 및 정렬 정보 설정하기
기본적으로 Spring에서는 PageRequest 객체를 사용하여 페이지 번호, 페이지 크기, 정렬 정보를 설정할 수 있습니다.

@GetMapping("/users")
public Page<User> getUsers(
    @RequestParam(defaultValue = "0") int page,
    @RequestParam(defaultValue = "10") int size,
    @RequestParam(defaultValue = "ASC") Sort.Direction direction,
    @RequestParam(defaultValue = "id") String sortBy) {

    Pageable pageable = PageRequest.of(page, size, Sort.by(direction, sortBy));
    return userRepository.findAll(pageable);
}

이렇게 설정하면, 요청 URL에 페이지 번호, 페이지 크기, 정렬 방식 등의 파라미터를 포함하여 데이터를 조회할 수 있습니다.

예시: GET /users?page=1&size=20&direction=DESC&sortBy=name

 

Page 인터페이스를 활용한 응답 처리
또한, 반환된 Page 객체를 활용하여 페이징 처리에 대한 추가 정보를 클라이언트에 전달할 수 있습니다. 예를 들어, 전체 페이지 수, 현재 페이지 번호 등의 정보를 제공할 수 있습니다.

 

@GetMapping("/users")
public ResponseEntity<?> getUsers(
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size,
        @RequestParam(defaultValue = "ASC") Sort.Direction direction,
        @RequestParam(defaultValue = "id") String sortBy) {

    Pageable pageable = PageRequest.of(page, size, Sort.by(direction, sortBy));
    Page<User> resultPage = userRepository.findAll(pageable);

    Map<String, Object> response = new HashMap<>();
    response.put("content", resultPage.getContent());
    response.put("currentPage", resultPage.getNumber());
    response.put("totalItems", resultPage.getTotalElements());
    response.put("totalPages", resultPage.getTotalPages());

    return new ResponseEntity<>(response, HttpStatus.OK);
}

이제 클라이언트에서는 응답 결과를 통해 페이징 처리에 필요한 정보를 쉽게 얻을 수 있게 되었습니다.


정리
Spring Data JPA의 Pageable 기능을 활용하면 데이터베이스와의 효율적인 상호작용을 통해 페이징 처리를 쉽게 구현할 수 있습니다. 이 글을 참고하여 여러분의 애플리케이션에서 페이징 처리를 간편하게 적용해 보시길 바랍니다.

 

반응형