Akashic Records

Spring Data JPA, 페이지 및 정렬 본문

Spring.io

Spring Data JPA, 페이지 및 정렬

Andrew's Akashic Records 2023. 4. 10. 23:45
728x90

PagingAndSortingRepository는 Spring Data JPA에서 페이징 및 정렬 기능을 제공하는 인터페이스입니다. JpaRepository는 PagingAndSortingRepository를 상속하므로, JpaRepository를 사용하면 PagingAndSortingRepository의 기능을 함께 사용할 수 있습니다.

예제를 통해 자세히 살펴보겠습니다.

엔티티 클래스:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
    // 생략: 생성자, getter, setter
}


레포지토리 인터페이스:

public interface UserRepository extends JpaRepository<User, Long> {
    // 다른 쿼리 메서드 생략
}

 

서비스 클래스:

@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Page<User> findAllUsers(Pageable pageable) {
        return userRepository.findAll(pageable);
    }
}

 

UserService 클래스에서 findAllUsers 메서드는 Pageable 객체를 매개변수로 받아 페이징 및 정렬 조건에 따라 사용자 목록을 조회합니다. userRepository.findAll(pageable)을 호출하여 페이징 및 정렬 조건을 적용한 사용자 목록을 가져옵니다.

컨트롤러 클래스:

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public ResponseEntity<Page<User>> getUsers(
            @RequestParam(required = false, defaultValue = "0") int page,
            @RequestParam(required = false, defaultValue = "10") int size,
            @RequestParam(required = false, defaultValue = "id,asc") String[] sort) {
        
        List<Sort.Order> orders = new ArrayList<>();
        for (String sortOrder : sort) {
            String[] _sort = sortOrder.split(",");
            orders.add(new Sort.Order(Sort.Direction.fromString(_sort[1]), _sort[0]));
        }

        Pageable pageable = PageRequest.of(page, size, Sort.by(orders));
        Page<User> users = userService.findAllUsers(pageable);
        return new ResponseEntity<>(users, HttpStatus.OK);
    }
}

UserController 클래스에서 getUsers 메서드는 요청 파라미터를 통해 페이지 번호(page), 페이지 크기(size), 정렬 조건(sort)을 받습니다. PageRequest.of() 메서드를 사용하여 Pageable 객체를 생성하고, userService.findAllUsers(pageable)를 호출하여 페이징 및 정렬 조건을 적용한 사용자 목록을 가져옵니다.

이렇게 PagingAndSortingRepository의 기능을 사용하면 간단한 설정만으로 데이터 조회에 페이징 및 정렬 기능을 적용할 수 있습니다.

페이징 및 정렬을 테스트할 수 있는 API 요청:
페이징 및 정렬 조건을 적용한 사용자 목록을 조회하는 API를 테스트해봅시다. 다음과 같은 요청을 사용하여 원하는 페이지 번호, 페이지 크기, 정렬 조건에 따라 사용자 목록을 조회할 수 있습니다.

예시:

첫 번째 페이지, 페이지 크기 10, id 기준 오름차순 정렬:

GET /users?page=0&size=10&sort=id,asc


두 번째 페이지, 페이지 크기 5, 이름(firstName) 기준 내림차순 정렬:

GET /users?page=1&size=5&sort=firstName,desc

 

정렬 조건에 여러 열(column) 사용하기:
여러 열에 대해 정렬 조건을 지정하려면 sort 파라미터에 여러 개의 정렬 조건을 전달하면 됩니다.

첫 번째 페이지, 페이지 크기 10, 이름(firstName) 기준 오름차순 정렬 후, 이메일(email) 기준 내림차순 정렬:

GET /users?page=0&size=10&sort=firstName,asc&sort=email,desc

이와 같이 PagingAndSortingRepository를 사용하면 페이징 및 정렬 기능을 쉽게 구현할 수 있습니다. 요청 파라미터를 통해 페이지 번호, 페이지 크기, 정렬 조건을 전달하면 Pageable 객체를 생성하여 이를 메서드에 전달할 수 있습니다. 이를 통해 데이터 조회 결과를 클라이언트에게 효율적으로 제공할 수 있습니다.

728x90

'Spring.io' 카테고리의 다른 글

Spring Data JPA , FetchType  (0) 2023.04.12
Spring Data JPA, @OneToMany 무한 반복 오류  (0) 2023.04.12
Spring Data JPA @Query 어노테이션  (0) 2023.04.10
Spring Data JPA  (0) 2023.04.10
Spring Data JPA에서 findBy.. 규칙  (0) 2023.04.10
Comments