개인 개발 프로젝트/Graphql, MongoDB 실습

[Graphql, MongoDB 실습] 4. Graphql Mutation

종범2 2020. 8. 5. 22:06

Graphql Mutation

이전까지는 resolver에서 쿼리와 객체의 요소에 대한 쿼리를 처리하기 위한 로직을 작성하였다. 쿼리는 데이터를 조회하는 기능을 담당하고 데이터를 조작하는 로직은 resolver의 muataion 객체에 작성한다. 이를 실습하기 위해 다음과 같이 코드를 작성한다. muation 부분을 제외하면 이전 예제와 거의 동일하다.

 

models/content.js

const mongoose = require('mongoose');
const { Schema } = mongoose;
const contentSchema = new Schema({
  title: {
    type: String,
    required: true
  },
  content: {
    type: String,
    required: true
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model('Content', contentSchema);

MongoDB 데이터 조작을 위한 스키마를 정의한다.

 

graphql/schema/index.js

const { gql } = require('apollo-server');
const typeDefs = gql`
  type Query {
    contents: [Content]
  }
  type Content {
    _id: ID
    title: String
    content: String
    createdAt: String
  }
  input ContentInput{
    title: String
    content: String
  }
  type Mutation{
    createContent(contentInput: ContentInput): Content!
  }
`;

module.exports = typeDefs;

Content 타입과 쿼리 타입에 Content 객체 목록을 불러오는 contents라는 함수를 정의한다. Mutation에는 ContentInput Input을 받아 Content를 생성하고 반환하는 createContent를 mutation에 작성한다.

 

resolvers/index.js

const Content = require('../../models/content');
const { startSession } = require('mongoose');
const resolvers = {
  Query: {
    async contents(_, args) {
      try {
        const contents = await Content.find();
        return contents;
      } catch (err) {
        console.log(err);
        throw err;
      }
    },
  },
  Content: {
    _id(_, args) {
      return _._id;
    },
    title(_, args) {
      return _.title;
    },
    content(_, args) {
      return _.content;
    },
    createdAt(_, args) {
      return _.createdAt;
    }
  },
  Mutation: {
    async createContent(_, args) {
      try {
        const content = new Content({
          ...args.contentInput
        })
        const result = await content.save();
        return result;
      } catch (err) {
        console.log(err);
        throw err;
      }
    }
  }
};

module.exports = resolvers; 

createContent 함수에서는 인자로 받은 값을 이용하여 MongoDB의 contents document에 새로운 collection을 저장한다.

 

Playground 실행

애플리케이션을 실행하고 playground에서 다음과 같은 mutation를 작성한다.

mutation{
  createContent(contentInput:{
    title:"Title1",
    content:"Content"
  }){
    _id
    title
    content
    createdAt
  }
}

createContent라는 Mutation을 작성하고 인자로 contentInput Input을 전달한다. 반환된 값은 생성한 content 객체의 속성 값이다. 실행 결과는 다음과 같다.