Mutation 타입이란?
Mutation Type은, QueryType과는 달리, POST 및 PUT, DELETE과 같은 서버측의 DB 내용을 수정한다거나 새로 데이터를 추가하거나 하는 행위(Mutation)의 타입을 알려주는 겁니다.
자, 아까 타입 정의 코드에 추가해봅시다.
const typeDefs = gql`
type User {
id: ID
username: String
}
type Tweet {
id: ID
text: String
author: User
}
type Query {
allTweets: [Tweet]
// 여기 이 부분이 바로 Arguments에 해당합니다.
tweet(id: ID): Tweet
}
// this line
type Mutation {
postTweet(text: String, userId: ID): Tweet
deleteTweet(id: ID): Boolean
}
`;
GraphQL
복사
그렇다면 어떻게 mutation을 사용하나요?
저는 아폴로 서버를 로컬에서 돌리고 있습니다.
mutation {
postTweet(text: "Hello, first tweet", userId: "1") {
text
}
}
GraphQL
복사
이런 식으로 작성을 해주시면 됩니다.
Non Nullable Fields
다음 타입 정의 스키마를 살펴봅시다.
const typeDefs = gql`
type User {
id: ID
username: String
}
type Tweet {
id: ID
text: String
author: User
}
type Query {
allTweets: [Tweet]
tweet(id: ID): Tweet
}
type Mutation {
postTweet(text: String, userId: ID): Tweet
deleteTweet(id: ID): Boolean
}
`;
GraphQL
복사
우리(개발자들)는 데이터를 주고받을때, Null값에 대해 예민하게 생각합니다.
Null값은 연산이 안 되기도 하고, 코드의 맥락을 파악하기도 쉽지 않기도 하고.. 다양한 문제들을 발생할 여지가 많습니다
서버와 통신을 해서 데이터를 얻어올 때, null값을 줄 가능성은 적지 않습니다. 그렇기에 우리는 이건 null값이면 안돼!라는 것을 명시해줄 필요가 있습니다
그렇다면 어떻게 해야할까요? 윗 코드를 변형하겠습니다.
const typeDefs = gql`
type User {
id: ID!
username: String!
}
type Tweet {
id: ID!
text: String!
author: User!
}
type Query {
// allTweets는 항상 배열을 반환해야합니다.
// 그리고, Tweet!은 배열 내 원소가 있다면 원소의 타입은 항상 Tweet이어야한다.를 의미합니다.(원소가 없어도 괜찮음)
allTweets: [Tweet!]!
// 이상한 id(ex: "1111111")이면, 트윗이 없을 수도 있으니 nullable
tweet(id: ID): Tweet
}
type Mutation {
// arguments는 String과 ID을 사용, Tweet만을 반환
postTweet(text: String!, userId: ID!): Tweet!
// Boolean 값만을 반환
deleteTweet(id: ID!): Boolean!
}
`;
GraphQL
복사
이렇게 Scalar Type 뒤에 "!"를 붙임으로써, 해당 데이터는 해당 타입만이어야한다라고 정의해주면 됩니다.

