Mutation 을 활용한다.

const typeDefs = gql`
  type Book {
    title: String
    author: String
    url: String
    bookId: Int
  }

  type Query {
    books: [Book]
    bookId(bookId: Int): Book
    bookTitle(title: String): Book
  }

  type Mutation {
    addBook(title: String, author: String, url: String): Book
  }
`;

const resolvers = {
  Query: {
    // books: () => books,
    books: () => {
      return JSON.parse(readFileSync(join(__dirname, "books.json")).toString());
    },
    bookId: (parent, args, context, info) => {
      const books = JSON.parse(
        readFileSync(join(__dirname, "books.json")).toString()
      );
      return books.find((book) => book.bookId === args.bookId);
    },
  },
  Mutation: {
    addBook: (parent, args, context, info) => {
      const books = JSON.parse(
        readFileSync(join(__dirname, "books.json")).toString()
      );
      const maxId = Math.max(...books.map((book) => book.bookId));
      const newBook = { ...args, bookId: maxId + 1 };
      writeFileSync(
        join(__dirname, "books.json"),
        JSON.stringify([...books, newBook])
      );
      return newBook;
    },
  },
};