이 글은 GraphQL Docs를 읽고 정리한 글입니다.
모든 GraphQL 서비스는 쿼리가 들어오면 해당 스키마에 대한 유효성 검사 후 실행 되는 과정을 거친다.
GraphQL 스키마의 기본 구성 요소는 객체 타입이다.
type Character {
name: String!
appearsIn: [Episode]!
}
type Starship {
id: ID!
name: String!
length(unit: LengthUnit = METER): Float
}
Docs에서는 여러 종류의 타입을 나열했는데 여기에는 생소한 타입을 중점적으로 정리했다.
query
, mutation
이라는 특수한 타입 두 가지를 가진다.아래와 같이 쿼리하기 위해서는
쿼리
query {
hero {
name
}
droid(id: "2000") {
name
}
}
아래와 같이 hero
, droid
필드를 가진 Query
타입이 정의되어 있어야 한다.
GraphQL 서비스
type Query {
hero(episode: Episode): Character
droid(id: ID!): Droid
}
위의 예시는 Query 타입에 대한 것이지만 Mutation 타입도 유사한 방식으로 작동한다.
Enums
라고도 한다.아래의 예시를 보면 스키마에서 Episode
타입을 사용할 경우 인자가 NEWHOPE
, EMPIRE
, JEDI
중 하나가 된다는 것을 알 수 있다.
쿼리
enum Episode {
NEWHOPE
EMPIRE
JEDI
}
인터페이스는 이를 구현하기 위해 타입이 포함해야 하는 특정 필드들을 포함하는 추상 타입이다.
아래의 경우를 예로 들면, Character 인터페이스는 이를 구현한 모든 타입은 아래와 같은 인자와 리턴 타입을 가진 필드를 포함해야 한다는 의미가 된다.
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
}
union SearchResult = Human | Droid | Starship
input
을 사용한다. 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!"
}
}
실행 결과
{
"data": {
"createReview": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
}