Skip to main content

GitHub의 REST API 및 GraphQL API 비교

GitHub 환경을 확장하고 사용자 지정하기 위한 GitHub API에 대해 알아봅니다.

GitHub의 API 정보

GitHub은(는) REST API와 GraphQL API라는 두 가지 API를 제공합니다. GitHub CLI, curl, 공식 Octokit 라이브러리 및 타사 라이브러리를 사용하여 두 API와 상호 작용할 수 있습니다. 경우에 따라 한 API에서 기능이 지원될 수 있지만 다른 API에서는 지원되지 않을 수 있습니다.

요구 사항에 가장 잘 부합하고 가장 편안하게 사용할 수 있는 API를 사용해야 합니다. 하나의 API를 다른 API보다 독점적으로 사용할 필요는 없습니다. 노드 ID를 사용하면 REST API 및 GraphQL API 간에 이동할 수 있습니다. 자세한 내용은 "전역 노드 ID 사용"을(를) 참조하세요.

이 문서에서는 각 API의 이점에 대해 설명합니다. GraphQL API에 대한 자세한 내용은 “GraphQL API 정보”을 참조하세요. REST API에 대한 자세한 내용은 "REST API 정보" 항목을 참조하세요.

GraphQL API 선택

GraphQL API는 요청하는 데이터를 정확하게 반환합니다. 또한 GraphQL은 요청에 따라 미리 알려진 구조의 데이터를 반환합니다. 반면 REST API는 요청한 데이터보다 많은 데이터를 반환하고 미리 결정된 구조로 반환합니다. 단일 GraphQL 요청에서 여러 REST API 요청에 해당하는 작업을 수행할 수도 있습니다. 더 적은 수의 요청을 수행하고 더 적은 데이터를 페치하는 기능을 통해 GraphQL은 모바일 애플리케이션 개발자에게 매력적입니다.

예를 들어, 팔로워 10명의 GitHub Enterprise Cloud 로그인과 각 팔로워의 팔로워 10명의 로그인을 얻기 위해 다음과 같은 단일 요청을 보낼 수 있습니다.

{
  viewer {
    followers(first: 10) {
      nodes {
        login
        followers(first: 10) {
          nodes {
            login
          }
        }
      }
    }
  }
}

응답은 해당 요청의 구조를 따르는 JSON 개체입니다.

반면 REST API에서 이 동일한 정보를 얻으려면 먼저 GET /user/followers에 대한 요청을 수행해야 합니다 . API는 필요하지 않은 팔로워에 대한 다른 데이터와 함께 각 팔로워의 로그인을 반환합니다. 그런 다음 각 팔로워에 대해 GET /users/{username}/followers에 대한 요청을 수행해야 합니다. 단일 GraphQL 요청에서 가져올 수 있는 정보와 동일한 정보를 얻으려면 총 11개의 요청을 수행해야 하며 초과 데이터를 받게 됩니다.

REST API 선택

REST API는 GraphQL API보다 더 오래 사용되었으므로 일부 개발자는 REST API에 더 익숙합니다. REST API는 표준 HTTP 동사 및 개념을 사용하므로 많은 개발자는 REST API를 사용하기 위한 기본 개념에 이미 익숙합니다.

예를 들어, octocat/Spoon-Knife 리포지토리에서 이슈를 만들려면 JSON 요청 본문을 사용하여 POST /repos/octocat/Spoon-Knife/issues에 요청을 보내야 합니다.

{
  "title": "Bug with feature X",
  "body": "If you do A, then B happens"
}

반면, GraphQL API를 사용하여 이슈를 해결하려면 octocat/Spoon-Knife 리포지토리의 노드 ID를 가져와서 다음과 같은 요청을 보내야 합니다.

mutation {
  createIssue(
    input: {
      repositoryId: "MDEwOlJlcG9zaXRvcnkxMzAwMTky"
      title: "Bug with feature X"
      body: "If you do A, then B happens"}
  ) {
    issue {
      number
      url
    }
  }
}