GraphQL에서는 Query, Mutation, Subscription 세 가지 유형의 Operation Types(작업 유형)을 지원합니다. 이 중에서 먼저 살펴볼 Query type은 서버로부터 필요한 데이터를 요청하고, 해당 데이터를 받아오는 기능을 수행합니다. RESTful API에서의 GET 요청과 유사합니다.
RESTful API에서의 GET 요청과는 달리, Query type은 서버에서 제공하는 모든 데이터를 요청하는 것이 아니라, 클라이언트에서 요청한 데이터만을 반환하도록 설계됩니다. 이로 인해, 필요한 데이터만을 요청하고 받아올 수 있으므로, 네트워크 트래픽을 최소화하고, 데이터의 송수신 속도를 높일 수 있습니다.
GraphQL 스키마에는 적어도 하나 이상의 Query type이 포함되어야 합니다. 즉, 스키마를 작성할 때 Query type을 정의하는 것이 의무적입니다.
만약 스키마에 Query type을 포함하지 않으면, 클라이언트는 서버로부터 어떠한 데이터도 요청할 수 없게 됩니다. 따라서, Query type은 스키마 작성 시 가장 먼저 정의해야 하는 중요한 type 중 하나입니다.
Query type은 클라이언트에서 요청한 데이터를 반환하는 역할을 하기 때문에, 어떠한 Query field도 없는 Query type을 작성하는 것은 불가능합니다. Query type을 작성할 때는 적어도 하나 이상의 Query field를 포함해야 합니다.
import { gql } from 'apollo-server';
const typeDefs = gql`
type Query {
books: [Book!]!
book(id: ID!): Book
}
type Book {
id: ID!
title: String!
author: String!
}
`;
위 예제에서는 books
와 book
두 개의 Query fields를 정의하였습니다. books
field는 Book
type의 리스트를 반환합니다. book
field는 ID
인자를 받아 해당하는 Book
객체를 반환합니다.
Book
type은 id
, title
, author
fields로 구성되어 있습니다. id
는 반드시 있어야 하는 ID
scalar type입니다. title
과 author
는 각각 String
scalar type입니다.
이와 같이 Query type을 정의하고 나면, 클라이언트에서는 아래와 같이 Query를 작성할 수 있습니다.
query {
books {
id
title
author
}
book(id: "123") {
title
author
}
}
위 예제에서는 books
field로부터 id
, title
, author
fields를 가져오고, book
field로부터 title
, author
fields를 가져오고 있습니다. book
field에는 id
인자를 전달하였습니다.
이와 같이 Query type을 정의하면, 클라이언트에서 필요한 데이터를 쉽게 가져올 수 있으며, 필요한 데이터만 가져오기 때문에 불필요한 데이터 전송을 막을 수 있습니다.
GraphQL은 REST API와 달리, 모든 요청이 기본적으로 읽기 전용인 Query로 시작합니다. 하지만, 데이터를 수정, 생성, 삭제하는 작업이 필요한 경우 Mutation을 사용합니다. Mutation은 GraphQL에서 서버의 데이터를 변경할 때 사용하는 타입이며, CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
Mutation type은 type Mutation
과 같이 정의합니다. Mutation type에는 서버에서 수행할 수 있는 각각의 mutation 작업을 나타내는 field들이 포함됩니다. 각각의 mutation field에는 입력값과 결과값이 있습니다. 입력값은 해당 mutation에 필요한 데이터를 전달하는 데 사용되며, 결과값은 mutation을 수행한 후 반환되는 데이터를 나타냅니다.
예를 들어, 게시물을 작성하는 mutation이 있다면, mutation field는 "addPost"와 같이 정의될 수 있습니다. 이 mutation field는 새로운 게시물을 작성하기 위해 필요한 인자들과 게시물이 성공적으로 작성되었는지 여부를 나타내는 결과값을 반환합니다.
Mutation을 사용하면 클라이언트는 서버에게 변경을 요청할 수 있으며, 서버는 해당 요청에 대한 응답으로 변경된 데이터를 반환합니다. 이것이 GraphQL의 장점 중 하나입니다. 클라이언트에서는 필요한 데이터만 요청하고, 서버에서는 해당 요청에 대한 응답으로 필요한 데이터만 반환하는 것이 가능합니다.
import { gql } from 'apollo-server';
const typeDefs = gql`
type Query {
books: [Book!]!
book(id: ID!): Book
}
type Mutation {
addBook(title: String!, author: String!): Book!
updateBook(id: ID!, title: String, author: String): Book
deleteBook(id: ID!): ID!
}
type Book {
id: ID!
title: String!
author: String!
}
`;
export default typeDefs;
위의 예시 코드에서 Mutation
type은 클라이언트에서 서버로 데이터를 수정, 추가, 삭제할 때 사용하는 타입입니다. Mutation
type에는 addBook
, updateBook
, deleteBook
세 개의 fields를 정의하였습니다. 각각의 field에서는 입력으로 받은 데이터를 처리하고 결과를 반환합니다.
addBook
field는 title
과 author
인자를 받아 Book
객체를 생성하고, 생성된 객체를 반환합니다.
updateBook
field는 id
와 변경할 title
, author
값을 받아 해당 id
의 Book
객체를 업데이트하고, 업데이트된 Book
객체를 반환합니다.
deleteBook
field는 id
인자를 받아 해당 id
의 Book
객체를 삭제하고, 삭제한 Book
객체의 id
값을 반환합니다.
이제 클라이언트에서는 아래와 같이 Mutation을 작성할 수 있습니다.
mutation {
addBook(title: "The Great Gatsby", author: "F. Scott Fitzgerald") {
id
title
author
}
updateBook(id: "123", title: "1984") {
title
author
}
deleteBook(id: "456")
}
위 코드 예시는 addBook
field로 새로운 책을 추가하고, updateBook
field로 id가 "123"인 책의 제목을 "1984"로 수정하고, deleteBook
field로 id가 "456"인 책을 삭제합니다.
이와 같이 Mutation type을 정의하면, 클라이언트에서 서버로 데이터를 변경하는 요청을 쉽게 보낼 수 있습니다.