GraphQL 기초편 2

7495 단어

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!]!
}
  • Character는GraphQL 대상 유형으로 일부 필드를 가진 유형임을 나타낸다.너의 schema 중 대다수 유형은 대상 유형일 것이다.
  • name과 appearsIn은Character 형식의 필드입니다.이것은 Character 형식을 조작하는GraphQL 검색의 모든 부분에서name과 appearsIn 필드만 나타날 수 있음을 의미합니다.
  • String은 기본 제공되는 스칼라 유형 중 하나입니다. 스칼라 유형은 단일 스칼라 객체로 처리되는 유형이므로 질의에서 두 번째로 선택할 수 없습니다.다음에 우리는 표량 유형을 상세하게 설명할 것이다.
  • String! 이 필드가 비어 있지 않음을 표시합니다.GraphQL 서비스는 이 필드를 조회한 후에 항상 값을 되돌려 줍니다.유형 언어에서 우리는 하나의 느낌표로 이 특성을 표시한다.
  • [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에는 기본 스칼라 유형 세트가 포함되어 있습니다.
  • Int: 기호 32비트 정수가 있습니다.
  • Float: 기호 쌍 정밀도 부동 소수점 값이 있습니다.
  • String: UTF - 8자 시퀀스.
  • Boolean:true 또는 false
  • ID: ID 스칼라 유형은 객체를 다시 가져오거나 캐시의 키로 사용하는 고유한 식별자를 나타냅니다.ID 유형은 String과 같은 방식으로 서열화됩니다.그러나 ID로 정의하면 사람이 읽을 필요가 없습니다.

  • 대부분의 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/

    좋은 웹페이지 즐겨찾기