기본적으로 REST API로 통신할 때는 GET/POST/PUT/DELETE를 사용했다.
서버와의 소통으로 CRUD를 진행한다고 가정했을 때
mutation 뜻 그대로 변형한다는 뜻이다. 그대로 읽어오는 것을 제외하고는 모두 mutation으로 데이터 요청을 한다.
즉, Database, data, cache, server에게 데이터를 변형하기 위한 요청이다.
graphQL에서는 REST API의 POST 요청은 모두 Mutation type
const typeDefs = gql`
type User {
id: ID
username: String
}
type Feed {
id: ID
text: String
creator: User
}
type Query {
allFeeds: [Feed]
feed(id: ID): Feed
}
// 단순히 data를 받아오고 싶다면 Query -> GET
type Mutation {
postFeed(text: String, userId: ID): Feed
}
// 데이터를 수정, 삭제, 생성 등 읽어오기 이외의 행위를 하고 싶다면 Mutation -> POST
`;
새로운 feed를 업로드 하기 위해서는 feed의 내용인 text가 필요하다.
지금은 인증/인가 없기 때문에 feed를 작성하는 user의 id명시한다.
해당 mutation이 완료되면 사용자에게 새로운 feed를 반환한다.
mutation이 생성되었다!
mutation에 작성한 postFeed도 확인할 수 있다.
postFeed를 살펴보면 위의 코드에서 작성한 arguments를 확인할 수 있다.
그리고 Feed에서 정의한 id, text, creator에 대한 데이터도 받을 수 있다.
query문을 작성할 땐 굳이 "query"라고 작성하지 않아도 된다.
Default로 query 요청이기 때문이다.
하지만 mutation을 호출하게 되면
반드시 mutation을 명시해야 한다.
mutation안에는 postFeed가 있으니 자동완성 되는 것을 확인할 수 있다.
postFeed에 arguments로 text, userId를 작성하여 새로운 feed를 생성할 수 있다.
const typeDefs = gql`
type User {
id: ID
username: String
}
type Feed {
id: ID
text: String
creator: User
}
type Query {
allFeeds: [Feed]
feed(id: ID): Feed
}
type Mutation {
postFeed(text: String, userId: ID): Feed
deleteFeed(id: ID): Boolean
}
`;
deleteFeed 같은 경우는 feed의 id값을 찾아서 삭제한다.
반환되는 값은 feed가 될 수 없다. 삭제되었으니깐
따라서 삭제되었다면 true, 삭제되지 않았다면 false를 반환할 수 있도록 Boolean타입을 명시한다.
이렇게 API 형태를 graphQL에게 설명하는 작업을 끝냈다.
또한 데이터에 어떤 일이 일어날 수 있는 작업들을 설명하는 로직도 작성했다.
사용자가 data를 받도록 하고 싶은 부분은 type Query
사용자가 data를 수정하고, 생성하고, 삭제하게 하고 싶은 부분은 type Mutation