GraphQL 기초편 2
GraphQL의 기초편 - Schema와 유형
유형 시스템(Type System)
GraphQL 조회의 구조와 결과가 매우 비슷하기 때문에 서버의 상황을 몰라도 조회가 어떤 결과를 되돌려줄지 예측할 수 있다.그러나 우리가 필요로 하는 데이터에 대한 정확한 설명은 여전히 의미가 있다. 우리는 어떤 필드를 선택할 수 있습니까?서버에서 반환되는 객체는 무엇입니까?이러한 객체 아래에서 사용할 수 있는 필드는 무엇입니까?이것이 바로 schema를 도입한 원인이다.모든GraphQL 서비스는 그 서비스에서 검색할 수 있는 데이터를 설명하기 위해 종류를 정의합니다.검색이 올 때마다 서버는 schema에 따라 검색을 검증하고 실행합니다.
유형 언어(Type Language)
GraphQL 서비스는 어떤 언어로도 작성할 수 있으며 특정한 언어의 문법 문법(예를 들어 JavaScript)에 의존하지 않고 GraphQL schema와 소통할 수 있다. 우리는 자신의 간단한 언어를 정의했다. 이를'GraphQL schema language'라고 부른다. GraphQL의 검색 언어와 비슷해서 GraphQL schema와 언어 차이 없이 소통할 수 있다.
객체 유형 및 필드(Object Types and Fields)
GraphQL schema의 가장 기본적인 구성 요소는 대상 유형입니다. 이것은 서비스에서 어떤 유형의 대상을 얻을 수 있는지, 그리고 그 대상에 어떤 필드가 있는지 나타냅니다.GraphQL schema language를 사용하면 다음과 같이 표현할 수 있습니다.
type Character {
name: String!
appearsIn: [Episode!]!
}
[Episode!]!
는 Episode 배열을 나타냅니다.이것도 비어 있지 않기 때문에, appearsIn 필드를 조회할 때, 너도 항상 하나의 그룹 (0 개 혹은 여러 요소) 을 얻을 수 있다.그리고 에피소드 때문에!비어 있지 않습니다. 그룹의 모든 항목이 Episode 대상일 것이라고 항상 예상할 수 있습니다.매개변수(Arguments)
GraphQL 객체 유형의 각 필드에는 다음 length 필드와 같은 0개 이상의 매개 변수가 있을 수 있습니다.
type Starship {
id: ID!
name: String!
length(unit: LengthUnit = METER): Float
}
GraphQL에서 모든 매개 변수는 구명으로 전달되어야 합니다.이 예에서,length 필드는 매개 변수,unit를 정의합니다.매개 변수는 필수이거나 선택할 수 있습니다. 매개 변수가 선택할 수 있으면 기본값을 정의할 수 있습니다. 유닛 매개 변수가 전달되지 않으면 기본적으로 METER로 설정됩니다.
질의 및 변경 유형(The Query and Mutation Types)
당신의 schema 중 대부분 유형은 일반 대상 유형이지만, 하나의 schema에는 두 가지 특수한 유형이 있습니다.
schema {
query: Query mutation: Mutation
}
스칼라 유형
하나의 대상 유형은 자신의 이름과 필드가 있지만, 어떤 때는 구체적인 데이터로 해석될 수 있다.이것이 바로 표량 유형의 출처입니다.GraphQL 조회에 대응하는 잎 노드를 표시합니다.다음 질의에서 name 및 appearsIn 필드가 스칼라 유형으로 해결됩니다.
{
hero {
name appearsIn
}
}
{
"data": {
"hero": {
"name": "R2-D2",
"appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ]
}
}
}
GraphQL에는 기본 스칼라 유형 세트가 포함되어 있습니다.
대부분의 GraphQL 서비스 구현에는 스칼라 유형을 사용자 정의하는 방식이 있다.예를 들어, Date 유형을 정의할 수 있습니다.
scalar Date
열거 유형(Enumeration Types)
매거 (enum)라고도 부른다. 매거 유형은 특수한 표량으로 특수한 선택 가능한 값 집합에 제한된다.이것은 너로 하여금 1.이 유형의 매개 변수가 선택할 수 있는 값의 하나인지 확인하십시오.유형 시스템과 소통하면 한 필드는 항상 유한한 값이 집합된 값 중 하나이다.다음은 GraphQL schema 언어로 표현된 enum 정의입니다.
enum Episode {
NEWHOPE EMPIRE JEDI
}
이것은 우리가 schema의 어느 곳에서 에피소드를 사용했든지 간에 에피소드가 NEWHOPE, EMPIRE, JEDI 중 하나로 되돌아왔다는 것을 확신할 수 있음을 나타낸다.
목록 및 비어 있지 않음(Lists and Non-Null)
대상 유형, 표량, 매거진은GraphQL에서 유일하게 정의할 수 있는 유형 종류입니다.그러나 schema의 다른 부분에서 이 유형을 사용하거나, 검색 변수 성명에서 사용할 때, 이 값의 검증에 영향을 줄 수 있는 추가 형식 수식자를 적용할 수 있습니다.먼저 예를 살펴보겠습니다.
type Character {
name: String!
appearsIn: [Episode]!
}
여기서 String 유형을 사용하고 유형 이름 뒤에 느낌표를 추가합니다!비어 있지 않은 상태로 치수화합니다.이것은 우리 서버가 이 필드에 대해 항상 비공식 값을 되돌려줍니다. 만약 그 결과가 공식 값을 얻게 된다면, 사실상 GraphQL 실행 오류가 발생하여 클라이언트가 오류가 발생했다는 것을 알게 될 것입니다.목록의 작동 방식도 유사합니다. 이 필드가 이 형식의 그룹을 되돌려준다는 것을 표시하기 위해 형식 수식자를 사용할 수도 있습니다.GraphQL schema 언어에서, 우리는 유형 패키지를 네모난 괄호 ([와]) 에 넣는 방식으로 목록을 표시합니다.목록은 매개 변수에 대해서도 같은 운영 방식을 가지고 있으며, 검증 절차는 대응하는 값을 수조로 요구합니다.비공식과 목록 수식자를 조합해서 사용할 수 있습니다.예를 들어, 빈 문자열이 아닌 배열을 요구할 수 있습니다.
myField: [String!]
공백일 수 없는 문자열 배열:
myField: [String]!
인터페이스(Interfaces)
많은 종류의 시스템과 마찬가지로 GraphQL은 인터페이스를 지원합니다.하나의 인터페이스는 추상적인 유형으로 일부 필드를 포함하고, 대상 유형은 반드시 이 필드를 포함해야만 이 인터페이스를 실현할 수 있다.
interface Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
}
예를 들어, Character 유형을 구현할 수도 있습니다.
type Human implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
starships: [Starship]
totalCredits: Int
}
type Droid implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
primaryFunction: String
}
특정 객체 유형에만 존재하는 필드를 검색하려면 인라인 세션을 사용해야 합니다.
query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
name
... on Droid {
primaryFunction
}
}
}
{
"data": {
"hero": {
"name": "R2-D2",
"primaryFunction": "Astromech"
}
}
}
공동 유형(Union Types)
연합 형식과 인터페이스는 매우 비슷하지만, 형식 간의 어떤 공통 필드도 지정하지 않습니다.
union SearchResult = Human | Droid | Starship
우리 schema에서,Search Result 형식으로 돌아가는 곳이라면,Human, Droid, Starship을 얻을 수 있습니다.이 때,SearchResult 연합 형식으로 돌아가는 필드를 조회해야 한다면, 조건 세션을 사용해야만 임의의 필드를 조회할 수 있습니다.
{
search(text: "an") {
__typename
... on Human {
name height
}
... on Droid {
name primaryFunction
}
... on Starship {
name length
}
}
}
{
"data": {
"search": [{
"__typename": "Human",
"name": "Han Solo",
"height": 1.8
}, {
"__typename": "Human",
"name": "Leia Organa",
"height": 1.5
}, {
"__typename": "Starship",
"name": "TIE Advanced x1",
"length": 9.2
}]
}
}
이 경우 Human과 Droid가 공통 인터페이스 (Character) 를 공유하기 때문에 여러 종류에서 같은 필드를 반복하지 않고 한 곳에서 공통 필드를 조회할 수 있습니다.
{
search(text: "an") {
__typename
... on Character {
name
}
... on Human {
height
}
... on Droid {
primaryFunction
}
... on Starship {
name
length
}
}
}
유형 입력(Input Types)
우리는 매거진과 문자열 등 표량값을 매개 변수로 필드에 전달하는 것만 논의했지만, 너도 복잡한 대상을 쉽게 전달할 수 있다.이것은 변경 (mutation) 에서 특히 유용합니다. 왜냐하면 때때로 전체 대상을 새 대상으로 전달해야 하기 때문입니다.GraphQL schema language에서 입력 대상은 type이 아닌 input으로 보입니다.
input ReviewInput {
stars: Int! commentary: String}
이렇게 변경(Mutation)에서 입력 객체 유형을 사용할 수 있습니다.
//
{
"ep": "JEDI",
"review": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
//
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
//
{
"data": {
"createReview": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
}
참고 자료https://graphql.cn/learn/schema/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.