[GraphQL] #4 Query type, Mutation type

김까치·2023년 4월 17일
0

GraphQL

목록 보기
4/5

Query Type

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!
  }
`;

위 예제에서는 booksbook 두 개의 Query fields를 정의하였습니다. books field는 Book type의 리스트를 반환합니다. book field는 ID 인자를 받아 해당하는 Book 객체를 반환합니다.

Book type은 id, title, author fields로 구성되어 있습니다. id는 반드시 있어야 하는 ID scalar type입니다. titleauthor는 각각 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을 정의하면, 클라이언트에서 필요한 데이터를 쉽게 가져올 수 있으며, 필요한 데이터만 가져오기 때문에 불필요한 데이터 전송을 막을 수 있습니다.


Mutation 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는 titleauthor 인자를 받아 Book 객체를 생성하고, 생성된 객체를 반환합니다.

updateBook field는 id와 변경할 title, author 값을 받아 해당 idBook 객체를 업데이트하고, 업데이트된 Book 객체를 반환합니다.

deleteBook field는 id 인자를 받아 해당 idBook 객체를 삭제하고, 삭제한 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을 정의하면, 클라이언트에서 서버로 데이터를 변경하는 요청을 쉽게 보낼 수 있습니다.

profile
개발자 연습생

0개의 댓글