# GraphQL API에서 페이지 매김 사용

GraphQL API를 사용하여 커서 기반 페이지 매김을 사용하여 데이터 집합을 트래버스하는 방법을 알아봅니다.

## 페이지 매김에 대해

GitHub의 GraphQL API는 GitHub 서버에 대한 과도한 또는 악의적인 요청으로부터 보호하기 위해 단일 요청에서 가져올 수 있는 항목 수를 제한합니다. GraphQL API를 사용하는 경우 모든 연결에 대한 `first` 또는 `last` 인수를 제공해야 합니다. 이러한 인수의 값은 1에서 100 사이여야 합니다. GraphQL API는 `first` 또는 `last` 인수로 지정된 연결 수를 반환합니다.

액세스하는 데이터에 `first` 또는 `last` 인수로 지정된 항목 수보다 더 많은 연결이 있는 경우 응답은 지정된 크기의 더 작은 "페이지"로 나뉩니다. 이러한 페이지는 전체 데이터 집합이 검색될 때까지 한 번에 하나씩 가져올 수 있습니다. 마지막 페이지가 아니면 각 페이지에는 더 적은 수의 항목이 포함될 수 있는 `first` 또는 `last` 인수로 지정된 항목 수가 포함됩니다.

이 가이드에서는 페이지를 매긴 응답에 대한 추가 결과 페이지를 요청하는 방법, 각 페이지에서 반환되는 결과 수를 변경하는 방법 및 여러 페이지의 결과를 가져오는 스크립트를 작성하는 방법을 보여 줍니다.

## 쿼리에서 `cursor`를 요청하기

GraphQL API를 사용하는 경우 커서를 사용하여 페이지를 매긴 데이터 집합을 트래버스합니다. 커서는 데이터 집합의 특정 위치를 나타냅니다.
`pageInfo` 개체를 쿼리하여 페이지에서 첫 번째 커서와 마지막 커서를 가져올 수 있습니다. 예시:

```graphql
query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(first: 100, after: null) {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        endCursor
        startCursor
        hasNextPage
        hasPreviousPage
      }
    }
  }
}
```

이 예제에서 `pageInfo.startCursor`은(는) 페이지의 첫 번째 항목에 대한 커서를 제공합니다.
`pageInfo.endCursor`은(는) 페이지의 마지막 항목에 대한 커서를 제공합니다.
`pageInfo.hasNextPage` 및 `pageInfo.hasPreviousPage`은(는) 반환된 페이지 앞과 뒤의 페이지가 있는지 여부를 나타냅니다.

## 페이지당 항목 수 변경

`first` 및 `last` 인수는 반환되는 항목 수를 제어합니다.
`first` 또는 `last` 인수를 사용하여 가져올 수 있는 최대 항목 수는 100개입니다. 쿼리가 속도 또는 노드 제한에 도달하는 것을 방지하기 위해 많은 데이터를 터치하는 경우 100개 미만의 항목을 요청해야 할 수 있습니다. 자세한 내용은 [GraphQL API에 대한 속도 제한 및 쿼리 제한](/ko/enterprise-server@3.22/graphql/overview/rate-limits-and-query-limits-for-the-graphql-api)을(를) 참조하세요.

## 페이징을 사용하여 데이터 집합을 탐색하다

쿼리에서 커서를 반환하면 커서를 사용하여 결과의 다음 페이지를 요청할 수 있습니다. 그렇게 하려면 `after` 또는 `before` 인수와 커서를 사용합니다.

예를 들어 이전 예제의 `pageInfo.endCursor` 값이 `Y3Vyc29yOnYyOpHOUH8B7g==`(이)라고 가정하면 이 쿼리를 사용하여 결과의 다음 페이지를 요청할 수 있습니다.

```graphql
query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(first: 1, after: "Y3Vyc29yOnYyOpHOUH8B7g==") {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        endCursor
        hasNextPage
        hasPreviousPage
      }
    }
  }
}
```

응답에서 반환된 새 `pageInfo.endCursor` 값을 사용하여 쿼리를 계속 보낼 수 있으며, 이는 `pageInfo.hasNextPage`이(가) `false`을(를) 반환하여 트래버스할 페이지가 더 이상 없음을 나타낼 때까지 가능합니다.

`last` 인수 대신 `first`을(를) 지정한 경우 결과의 마지막 페이지가 먼저 반환됩니다. 이 경우 `pageInfo.startCursor` 값과 `before` 인수를 사용하여 결과의 이전 페이지를 가져옵니다.
`pageInfo.hasPreviousPage`이(가) `false`을(를) 반환하면 마지막 페이지에 도달했습니다. 예시:

```graphql
query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(last: 1, before: "R3Vyc29yOnYyOpHOHcfoOg==") {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        startCursor
        hasPreviousPage
      }
    }
  }
}
```

## 다음 단계

GitHub의 Octokit SDK 및 `octokit/plugin-paginate-graphql` 플러그 인을 사용하여 스크립트의 페이지 매김을 지원할 수 있습니다. 자세한 내용은 [plugin-paginate-graphql.js](https://github.com/octokit/plugin-paginate-graphql.js) 참조하세요.