기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
GraphQL은 대규모로 단순성과 견고성을 유지하기 위한 몇 가지 설계 원칙으로 구성됩니다.
선언적
GraphQL은 선언적이므로 사용자는 쿼리하려는 필드만 선언하여 데이터를 설명(형태 지정)할 수 있습니다. 응답은 이러한 속성에 대한 데이터만 반환합니다. 예를 들어, ISBN 13 id
값이 9780199536061
인 DynamoDB 테이블에서 Book
객체를 검색하는 작업은 다음과 같습니다.
{
getBook(id: "9780199536061
") {
name
year
author
}
}
응답은 페이로드의 필드(name
, year
, author
)만 반환하며 다른 필드는 반환하지 않습니다.
{
"data": {
"getBook": {
"name": "Anna Karenina",
"year": "1878",
"author": "Leo Tolstoy",
}
}
}
이러한 설계 원칙으로 인해 GraphQL은 복잡한 시스템에서 REST API가 다루는 과다 가져오기와 과소 가져오기라는 고질적인 문제를 해결합니다. 그 결과 데이터 수집이 더 효율적으로 이루어지고 네트워크 성능이 향상됩니다.
계층적
GraphQL은 요청된 데이터를 사용자가 애플리케이션의 요구에 맞게 구성할 수 있다는 점에서 유연합니다. 요청된 데이터는 항상 GraphQL API에 정의된 속성의 유형과 구문을 따릅니다. 예를 들어, 다음 스니펫은 Book
9780199536061
에 연결된 모든 저장된 인용 문자열과 페이지를 반환하는 quotes
라는 새로운 필드 범위를 사용한 getBook
작업을 보여 줍니다.
{
getBook(id: "9780199536061
") {
name
year
author
quotes {
description
page
}
}
}
이 쿼리를 실행하면 다음 결과가 반환됩니다.
{
"data": {
"getBook": {
"name": "Anna Karenina",
"year": "1878",
"author": "Leo Tolstoy",
"quotes": [
{
"description": "The highest Petersburg society is essentially one: in it everyone knows everyone else, everyone even visits everyone else.",
"page": 135
},
{
"description": "Happy families are all alike; every unhappy family is unhappy in its own way.",
"page": 1
},
{
"description": "To Konstantin, the peasant was simply the chief partner in their common labor.",
"page": 251
}
]
}
}
}
보는 것과 같이 요청된 책에 연결된 quotes
필드는 쿼리에서 설명한 것과 동일한 형식의 배열로 반환되었습니다. 여기에 표시되지는 않았지만 GraphQL은 검색하는 데이터의 위치를 상관하지 않는다는 추가 이점이 있습니다. Books
및 quotes
는 별도로 저장할 수 있지만, GraphQL은 연결이 존재하는 한 정보를 계속 검색합니다. 즉, 쿼리는 단일 요청으로 다수의 독립형 데이터를 검색할 수 있습니다.
내관적
GraphQL은 스스로 문서화하는 내관적 성격을 지닙니다. 사용자가 스키마 내의 기본 유형과 필드를 볼 수 있는 몇 가지 내장된 작업을 지원합니다. 예를 들어, 다음은 date
및 description
필드가 있는 Foo
유형입니다.
type Foo {
date: String
description: String
}
_type
작업을 사용하여 스키마 아래에 있는 입력 메타데이터를 찾을 수 있습니다.
{
__type(name: "Foo") {
name # returns the name of the type
fields { # returns all fields in the type
name # returns the name of each field
type { # returns all types for each field
name # returns the scalar type
}
}
}
}
이 작업은 다음 응답을 반환합니다.
{
"__type": {
"name": "Foo", # The type name
"fields": [
{
"name": "date", # The date field
"type": { "name": "String" } # The date's type
},
{
"name": "description", # The description field
"type": { "name": "String" } # The description's type
},
]
}
}
이 기능을 사용하여 특정 GraphQL 스키마가 지원하는 유형과 필드를 확인할 수 있습니다. GraphQL은 이러한 내관적 작업을 다양하게 지원합니다. 자세한 정보는 내부 검사
강력한 유형 지정
GraphQL은 유형 및 필드 시스템을 통해 강력한 유형 지정을 지원합니다. 스키마에서 무언가를 정의할 때는 런타임 전에 검증할 수 있는 유형이 있어야 합니다. 또한 GraphQL의 구문 사양을 따라야 합니다. 이 개념은 다른 언어의 프로그래밍과 다르지 않습니다. 예를 들어 이전의 Foo
유형은 다음과 같습니다.
type Foo {
date: String
description: String
}
Foo
가 생성될 객체라는 것을 알 수 있습니다. Foo
의 인스턴스 안에는 date
및 description
필드가 있으며, 둘 다 String
기본 유형(스칼라)입니다. 구문상으로는 Foo
가 선언되었고 해당 필드가 범위 내에 존재한다는 것을 알 수 있습니다. 이렇게 유형 검사와 논리적 구문을 조합하면 GraphQL API를 간결하고 이해하기 쉽게 만들 수 있습니다. GraphQL의 유형 지정 및 구문 사양은 여기