[Spring] Jpa Paging 페이징 처리방법

    스프링 Jpa Paging 처리방법 알아보기

    Spring Boot와 JPA를 이용하여 데이터를 조회할 때, 많은 데이터가 있는 경우에는 Paging(페이징) 기능을 사용하여 데이터를 페이지 단위로 나누어서 조회하는 것이 효율적입니다.

    Paging은 특정 개수만큼의 데이터를 가져와서 화면에 출력하고, 다음 페이지의 데이터를 가져와서 출력하는 방식입니다. 이를 통해 한 번에 모든 데이터를 가져오는 것보다 데이터 전송과 조회 시간을 줄일 수 있습니다.

    1. Controller에서 Pageable 객체 생성

    Paging 기능을 사용하기 위해서는 Controller에서 Pageable 객체를 생성해야 합니다. Pageable 객체는 요청 파라미터로부터 pageNumber, pageSize, sort 정보를 추출하여 생성됩니다.

    @GetMapping("/users")
    public ResponseEntity<Page<User>> getUsers(Pageable pageable) {
        Page<User> users = userService.getUsers(pageable);
        return ResponseEntity.ok(users);
    }

    위의 코드에서는 @GetMapping 어노테이션으로 "/users" 요청에 대한 핸들러 메서드를 정의하고, Pageable 객체를 파라미터로 받습니다. UserService에서 getUsers(Pageable pageable) 메서드를 호출하여, Page 객체를 반환합니다.

    2. Service에서 Page 반환

    Service에서는 JpaRepository를 상속하여, JpaRepository의 메서드 중에서 Pageable을 인자로 받는 메서드를 사용하여 Page 객체를 반환합니다.

    @Service
    public class UserServiceImpl implements UserService {
     
        @Autowired
        private UserRepository userRepository;
     
        @Override
        public Page<User> getUsers(Pageable pageable) {
            return userRepository.findAll(pageable);
        }
    }

    위의 코드에서는 UserServiceImpl에서 UserRepository를 주입받고, getUsers(Pageable pageable) 메서드를 오버라이드하여, UserRepository의 findAll(Pageable pageable) 메서드를 호출하여, Page 객체를 반환합니다.

    3. 결과 출력하기

    Controller에서 반환된 Page 객체는 Spring Boot가 제공하는 ResponseEntity 클래스를 이용하여, 클라이언트에게 전달됩니다. 클라이언트는 JSON 형식으로 받은 Page 객체를 이용하여, 데이터를 출력하면 됩니다.

    {
      "content": [
        {
          "id": 1,
          "username": "user1",
          "email": "user1@example.com"
        },
        {
          "id": 2,
          "username": "user2",
          "email": "user2@example.com"
        }
      ],
      "pageable": {
        "sort": {
          "sorted": false,
          "unsorted": true,
          "empty": true
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 2,
        "paged": true,
        "unpaged": false
      },
      "last": false,
      "totalPages": 2,
      "totalElements": 3,
      "size": 2,
      "number": 0,
      "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
      }
    }

    위의 JSON 응답 데이터에서 content에는 현재 페이지에 포함된 데이터 리스트가 들어 있습니다. pageable은 요청한 페이지 정보를 나타냅니다. last는 마지막 페이지인지 여부를 나타내고, totalPages는 전체 페이지 수를 나타냅니다. totalElements는 전체 데이터 수를 나타내고, size는 현재 페이지에 포함된 데이터 수를 나타냅니다. number는 현재 페이지 번호를 나타냅니다. sort는 데이터 정렬 정보를 나타냅니다.

    댓글

    Designed by JB FACTORY