GraphQL API 쿼리 및 뮤테이션 실행
이 가이드는 GitLab GraphQL API의 기본 사용법을 보여줍니다.
GraphQL API 스타일 가이드를 읽어보세요. API 자체를 개발하려는 개발자들을 대상으로 한 구현 세부 정보를 담고 있습니다.
예제 실행
여기서 문서화된 예제는 다음을 사용하여 실행할 수 있습니다:
GraphiQL
GraphiQL (발음: “그래피클”)을 사용하면 API에 대한 실제 GraphQL 쿼리를 대화형으로 실행할 수 있습니다. 구문 강조 및 자동 완성이 제공되어 스키마를 더 쉽게 탐색할 수 있습니다.
대부분의 사용자에게는 GraphiQL을 사용하는 것이 GitLab GraphQL API를 탐색하는 가장 쉬운 방법일 것입니다.
다음 중 하나를 사용할 수 있습니다:
- GitLab.com에서.
- Self-Managed형 GitLab 인스턴스에서
https://<your-gitlab-site.com>/-/graphql-explorer
에서.
먼저 GitLab에 로그인하여 GitLab 계정으로 요청을 인증하세요.
시작하려면 예제 쿼리 및 뮤테이션을 참조하세요.
명령줄
로컬 컴퓨터의 명령줄에서 curl
요청을 사용하여 GraphQL 쿼리를 실행할 수 있습니다. 요청은 쿼리를 페이로드로 하는 /api/graphql
로 POST
됩니다. 개인 액세스 토큰을 생성하여 요청을 승인할 수 있습니다. GraphQL 인증에 대해 더 읽어보세요.
예시:
GRAPHQL_TOKEN=<your-token>
curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer $GRAPHQL_TOKEN" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
쿼리 문자열에 문자열을 중첩하려면 데이터를 작은 따옴표로 감싸거나 문자열을 \\
로 이스케이핑하세요:
curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer $GRAPHQL_TOKEN" \
--header "Content-Type: application/json" --request POST \
--data '{"query": "query {project(fullPath: \"<group>/<subgroup>/<project>\") {jobs {nodes {id duration}}}}"}'
# or "{\"query\": \"query {project(fullPath: \\\"<group>/<subgroup>/<project>\\\") {jobs {nodes {id duration}}}}\"}"
Rails 콘솔
GraphQL 쿼리는 Rails 콘솔 세션에서 실행할 수 있습니다. 예를 들어, 프로젝트를 검색하려면:
current_user = User.find_by_id(1)
query = <<~EOQ
query securityGetProjects($search: String!) {
projects(search: $search) {
nodes {
path
}
}
}
EOQ
variables = { "search": "gitlab" }
result = GitlabSchema.execute(query, variables: variables, context: { current_user: current_user })
result.to_h
쿼리 및 뮤테이션
GitLab GraphQL API를 사용하여 다음을 수행할 수 있습니다:
- 데이터 검색을 위한 쿼리.
- 뮤테이션을 통한 데이터 생성, 업데이트 및 삭제.
id
는 “Global ID”를 나타내며, 형식은 "gid://gitlab/Issue/123"
입니다. 자세한 내용은 Global IDs를 참조하세요.GitLab GraphQL 스키마는 클라이언트가 쿼리할 수 있는 객체 및 필드와 해당 데이터 유형을 개요로 나타냅니다.
예시: 현재 인증된 사용자가 액세스할 수 있는 그룹 gitlab-org
의 모든 프로젝트의 이름만 가져오기 (제한까지).
query {
group(fullPath: "gitlab-org") {
id
name
projects {
nodes {
name
}
}
}
}
예시: 특정 프로젝트 및 이슈 #2의 제목 가져오기.
query {
project(fullPath: "gitlab-org/graphql-sandbox") {
name
issue(iid: "2") {
title
}
}
}
그래프 탐색
하위 노드를 검색할 때는:
-
edges { node { } }
구문. - 간략한 형태의
nodes { }
구문.
그 아래에는 우리가 탐색하는 그래프가 있으므로 GraphQL이라는 이름이 붙었습니다.
예시: 프로젝트의 이름 및 모든 이슈의 제목 가져오기.
query {
project(fullPath: "gitlab-org/graphql-sandbox") {
name
issues {
nodes {
title
description
}
}
}
}
쿼리에 대해 더 알아보기: GraphQL 문서
권한 부여
GitLab에 로그인하고 GraphiQL을 사용하는 경우, 모든 쿼리는 인증된 사용자인 당신으로 실행됩니다. 더 많은 정보는 GraphQL 인증을 읽어보세요.
뮤테이션
뮤테이션은 데이터를 변경합니다. 레코드를 업데이트, 삭제 또는 새로 생성할 수 있습니다. 뮤테이션은 일반적으로 InputTypes와 변수를 사용하며, 여기에는 나오지 않는다.
뮤테이션에는 다음이 있습니다:
- 입력값. 예를 들어, 추가할 이모지 반응 및 어느 객체에 추가할지와 같은 매개변수가 있습니다.
- 반환문. 즉, 성공했을 때 어떤 결과를 얻고 싶은지에 대한 내용입니다.
- 오류. 언제나 잘못된 부분을 요청하세요.
생성 뮤테이션
예시: 차를 마시러 갑시다 - 이슈에 :tea:
반응 이모지 추가하기.
mutation {
awardEmojiAdd(input: { awardableId: "gid://gitlab/Issue/27039960",
name: "tea"
}) {
awardEmoji {
name
description
unicode
emoji
unicodeVersion
user {
name
}
}
errors
}
}
예시: 이슈에 댓글 추가. 이 예제에서는 GitLab.com
이슈의 ID를 사용합니다. 자체 운영 인스턴스를 사용하는 경우, 쓸 수 있는 이슈의 ID를 가져와야 합니다.
mutation {
createNote(input: { noteableId: "gid://gitlab/Issue/27039960",
body: "*sips tea*"
}) {
note {
id
body
discussion {
id
}
}
errors
}
}
업데이트 뮤테이션
만들어진 댓글의 결과 id
를 확인하세요. 더 빨리 차를 마실 수 있도록 편집해봅시다.
mutation {
updateNote(input: { id: "gid://gitlab/Note/<note ID>",
body: "*SIPS TEA*"
}) {
note {
id
body
}
errors
}
}
삭제 뮤테이션
우리 차가 다 마셔졌으니 댓글을 삭제합시다.
mutation {
destroyNote(input: { id: "gid://gitlab/Note/<note ID>" }) {
note {
id
body
}
errors
}
}
다음과 같은 출력이 나와야 합니다.
{
"data": {
"destroyNote": {
"errors": [],
"note": null
}
}
}
우리는 댓글 세부 정보를 요청했지만, 더는 존재하지 않기 때문에 null
을 받게 됩니다.
뮤테이션에 대해 더 알아보기: GraphQL 문서.
프로젝트 설정 업데이트
하나의 GraphQL 뮤테이션으로 여러 프로젝트 설정을 업데이트할 수 있습니다.
이 예는 CI_JOB_TOKEN
스코핑 동작에 대한 중요한 변경에 대한 해결책입니다.
mutation DisableCI_JOB_TOKENscope {
projectCiCdSettingsUpdate(input:{fullPath: "<namespace>/<project-name>", inboundJobTokenScopeEnabled: false}) {
ciCdSettings {
inboundJobTokenScopeEnabled
}
errors
}
}
인트로스펙션 쿼리
클라이언트는 인트로스펙션 쿼리를 통해 스키마에 대한 정보를 요청하여 GraphQL 엔드포인트를 쿼리할 수 있습니다.
GraphiQL 쿼리 탐색기는 다음을 위해 인트로스펙션 쿼리를 사용합니다:
- GitLab GraphQL 스키마에 대한 정보 획들.
- 자동 완성.
- 대화형
Docs
탭 제공.
예: 스키마에서 모든 타입 이름 가져오기.
{
__schema {
types {
name
}
}
}
예: Issue와 관련된 모든 필드 가져오기. kind
는 OBJECT
, SCALAR
또는 INTERFACE
와 같은 타입의 enum 값을 알려줍니다.
query IssueTypes {
__type(name: "Issue") {
kind
name
fields {
name
description
type {
name
}
}
}
}
인트로스펙션에 대한 DETAILS: GraphQL 문서
쿼리 복잡성
쿼리의 계산된 복잡성 점수와 제한은 클라이언트에게 노출될 수 있습니다.
queryComplexity
를 쿼리하여 클라이언트에게 제공될 수 있습니다.
query {
queryComplexity {
score
limit
}
project(fullPath: "gitlab-org/graphql-sandbox") {
name
}
}
정렬
일부 GitLab GraphQL 엔드포인트는 객체 컬렉션을 어떻게 정렬할 지 지정할 수 있습니다. 스키마가 허용하는대로만 정렬할 수 있습니다.
예: 이슈는 생성 날짜로 정렬할 수 있습니다.
query {
project(fullPath: "gitlab-org/graphql-sandbox") {
name
issues(sort: created_asc) {
nodes {
title
createdAt
}
}
}
}
페이지네이션
페이지네이션은 첫 열 개의 레코드를 요청하는 방법입니다. 더 많이 원한다면 다음 열 개를 서버로 요청할 수 있습니다. 기본적으로 GitLab GraphQL API는 페이지당 100개의 레코드를 반환합니다. 이 동작을 변경하려면 first
또는 last
인자를 사용하세요. 두 인자 모두 값이 필요하며, first: 10
은 첫 열 개의 레코드를 반환하고, last: 10
은 마지막 열 개의 레코드를 반환합니다. 페이지당 반환되는 레코드 수에는 일반적으로 100
의 제한이 있습니다.
예: 처음 두 개의 이슈만 검색하기. cursor
필드는 해당 위치에서 상대적으로 더 많은 레코드를 검색할 수 있는 위치를 제공합니다.
query {
project(fullPath: "gitlab-org/graphql-sandbox") {
name
issues(first: 2) {
edges {
node {
title
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
예: 다음 세 개를 검색하기. (커서 값 eyJpZCI6IjI3MDM4OTMzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTQgMDU6NTY6NDQgVVRDIn0
은 다를 수 있지만, 위에서 반환된 두 번째 이슈에 대한 cursor
값입니다.)
query {
project(fullPath: "gitlab-org/graphql-sandbox") {
name
issues(first: 3, after: "eyJpZCI6IjI3MDM4OTMzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTQgMDU6NTY6NDQgVVRDIn0") {
edges {
node {
title
}
cursor
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
페이지네이션 및 커서에 대한 DETAILS: GraphQL 문서