#2-1 Interfaces, union types, input types (이어서 > 앱개발

앱개발

#2-1 Interfaces, union types, input types (이어서 정보

#2-1 Interfaces, union types, input types (이어서

본문

Interfaces

많은 유형의 시스템과 마찬가지로 GraphQL도 인터페이스를 지원합니다. 인터페이스는 인터페이스를 구현하기 위해 유형이 포함해야 하는 특정 필드 세트를 포함하는 추상 유형입니다. 

 

예를 들어, Star Wars 3부작의 모든 문자를 나타내는 인터페이스 Character를 가질 수 있습니다. 

interface Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}

즉, Character를 구현하는 모든 유형에는 이러한 인수와 반환 유형을 사용하여 정확한 필드가 있어야 합니다. 

 

예를 들어, 다음은 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
}

이 두 유형 모두 Character 인터페이스의 모든 필드가 있지만 해당 특정 유형의 문자에만 해당되는 추가 필드인 totalCredits, starships 및 primaryFunction을 가져 오는 것을 볼 수 있습니다. 

 

인터페이스는 객체 또는 객체 세트를 반환하려는 경우에 유용하지만 여러 유형이있을 수 있습니다.

 

예를 들어, 다음 쿼리는 오류를 생성합니다.

query HeroForEpisode($ep: Episode!) {

  hero(episode: $ep) {

    name

    primaryFunction

  }

}

variables

{

  "ep": "JEDI"

}

results

{

  "errors": [

    {

      "message": "Cannot query field \"primaryFunction\" on type \"Character\". Did you mean to use an inline fragment on \"Droid\"?",

      "locations": [

        {

          "line": 4,

          "column": 5

        }

      ]

    }

  ]

}

영웅 필드는 캐릭터 유형을 반환합니다. 즉, 에피소드 인수에 따라 Human 또는 Droid 중 하나 일 수 있습니다. 위 쿼리에서 primary 인터페이스를 포함하지 않는 Character 인터페이스에있는 필드만 요청할 수 있습니다.

 

특정 객체 유형의 필드를 요청하려면 인라인 조각을 사용해야합니다.

query HeroForEpisode($ep: Episode!) {

  hero(episode: $ep) {

    name

    ... on Droid {

      primaryFunction

    }

  }

}

variables

{

  "ep": "JEDI"

}

results

{

  "data": {

    "hero": {

      "name": "R2-D2",

      "primaryFunction": "Astromech"

    }

  }

}

이에 대한 자세한 내용은 쿼리 가이드의 인라인 조각 섹션을 참조하십시오. 

Union types

연합 유형은 인터페이스와 매우 유사하지만 유형간에 공통 필드를 지정하지 않습니다. 

union SearchResult = Human | Droid | Starship

스키마에서 SearchResult 유형을 반환 할 때마다 Human, Droid 또는 Starship을 얻을 수 있습니다. 유니온 타입의 멤버는 구체적인 객체 타입일 필요가 있습니다. 인터페이스 또는 다른 공용체에서 공용체 유형을 작성할 수 없습니다.

 

이 경우 SearchResult 공용 형식을 반환하는 필드를 쿼리하는 경우 모든 필드를 쿼리 할 수 있도록 조건부 단편을 사용해야 합니다.

{

  search(text: "an") {

    ... on Human {

      name

      height

    }

    ... on Droid {

      name

      primaryFunction

    }

    ... on Starship {

      name

      length

    }

  }

}

{

  "data": {

    "search": [

      {

        "name": "Han Solo",

        "height": 1.8

      },

      {

        "name": "Leia Organa",

        "height": 1.5

      },

      {

        "name": "TIE Advanced x1",

        "length": 9.2

      }

    ]

  }

}

Input types

지금까지는 열거 형이나 문자열과 같은 스칼라 값을 인수로 필드에 전달하는 방법에 대해서만 설명했습니다. 복잡한 객체도 쉽게 전달할 수 있습니다. 이것은 돌연변이의 경우에 특히 유용합니다. 돌연변이가 생기면 전체 개체를 전달할 수 있습니다. GraphQL 스키마 언어에서 입력 유형은 일반 객체 유형과 정확히 같지만 유형 대신 키워드 입력을 사용합니다. 

input ReviewInput {
  stars: Int!
  commentary: String
}

다음은 돌연변이에 입력 객체 유형을 사용하는 방법입니다. 

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {

  createReview(episode: $ep, review: $review) {

    stars

    commentary

  }

}

variables

{

  "ep": "JEDI",

  "review": {

    "stars": 5,

    "commentary": "This is a great movie!"

  }

}

results

{

  "data": {

    "createReview": {

      "stars": 5,

      "commentary": "This is a great movie!"

    }

  }

}

입력 객체 유형의 필드는 입력 객체 유형을 참조 할 수 있지만 스키마에서 입력 및 출력 유형을 혼합 할 수는 없습니다. 입력 오브젝트 유형도 필드에 인수를 가질 수 없습니다. 

 

 

 

공감
0
  • 복사

댓글 0개

© SIRSOFT
현재 페이지 제일 처음으로