GraphQL의 Mutation

본 기사에서는 「 Spring Boot에서 GraphQL 구현 」로 사용한 샘플 앱을 예에 기술합니다.

Mutation 스키마 정의



우선 Mutation의 명명은 어플리케이션과 묶는 동사가 바람직합니다. 이번에는 id, name, pageCount의 3개를 인수로 되돌려 놓고 값은 Book형의 스키마를 정의해 보겠습니다.
※이후의 설명의 사정상, name 필드는 필수, 그 이외는 비필수가 되는 인수로 하고 있습니다.
※「!」의 자세한 것은 「GraphQL의 스키마와 형식 정의의 표현 마크의 의미」를 참조해 주십시오.

schema.graphqls
type Mutation {
    registerBook (
        id: ID
        name: String!
        pageCount: Int
    ): Book
}


서버측



서버측 구현은 다음과 같습니다. GraphQLMutationResolver를 implements해야합니다 (Java에서 구현하기 때문에 이렇게하고 있습니다. 다른 언어에서는 다른 모양이 될 것이라고 생각합니다). 또한 스키마 정의에서 설명한 대로 id, name, pageCount의 세 가지를 인수로 되돌려 놓은 값은 Book 유형의 해석기인 registerBook을 정의합니다.
※리졸버에 대해서는 「 GraphQL의 리졸버(Resolver)란? 」를 참조해 주십시오.

BookResolver.java
@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {

    public Book bookById(String bookId) {
        // 実際は何らかのデータストアからデータを読み込み返却するケースがほとんどだが、ここではダミー値を返却
        Book book = new Book();
        book.setId(bookId);
        book.setName("bookName");
        book.setPageCount(900);
        Author author = new Author();
        author.setId("0001");
        author.setFirstName("fName");
        author.setLastName("lName");
        book.setAuthor(author);
        return book;
    }

    public Book registerBook(String id, String name, int pageCount) {
        // 実際はここでデータ登録処理を行う

        // GraphQLのスキーマ定義に則りBookを返却。一般的には登録後のデータを返却する。
        Book book = new Book();
        book.setId(id);
        book.setName(name);
        book.setPageCount(pageCount);

        return book;
    }
}

Mutation 실행



실제로 Mutation을 던져 보겠습니다. 모든 인수를 설정하고 다음과 같이 던질 수 있습니다. 스키마 정의상 Book형이 되돌아오기 때문에, 여기에서는 Book형중의 id와 name를 응답으로서 받는 것 같은 쿼리로 하고 있습니다.
mutation {
  registerBook(id: "1", name:"bookName", pageCount:100) {
    id
    name
  }
}

응답은 다음과 같습니다.
{
  "data": {
    "registerBook": {
      "id": "1",
      "name": "bookName"
    }
  }
}

registerBook의 name 인수는 필수이므로 다음과 같은 쿼리는 구문 오류가 발생합니다.
mutation {
  registerBook(id:"1", pageCount:100) {
    id
    name
  }
}

반대로, name 이외의 인수는 비필수이므로, 다음과 같은 쿼리는 실행 가능합니다 (필수인수만의 지정).
mutation {
  registerBook(name:"bookName") {
    id
    name
  }
}

단일 Mutation으로 여러 데이터 등록



여러 데이터를 등록하기 위해 mutation에 다른 필드를 추가합니다. 여기에 registerAuthor를 추가합니다.

schema.graphqls
type Mutation {
    registerBook (
        id: ID
        name: String!
        pageCount: Int
    ): Book

    registerAuthor (
        id: ID
        firstName: String
        lastName: String
    ): Author
}

서버측도 다음과 같이 registerAuthor를 추가합니다.

BookResolver.java
@Component
public class BookResolver implements GraphQLQueryResolver, GraphQLMutationResolver {

    public Book bookById(String bookId) {
        // 実際は何らかのデータストアからデータを読み込み返却するケースがほとんどだが、ここではダミー値を返却
        Book book = new Book();
        book.setId(bookId);
        book.setName("bookName");
        book.setPageCount(900);
        Author author = new Author();
        author.setId("0001");
        author.setFirstName("fName");
        author.setLastName("lName");
        book.setAuthor(author);
        return book;
    }

    public Book registerBook(String id, String name, int pageCount) {
        // 実際はここでデータ登録処理を行う

        // GraphQLのスキーマ定義に則りBookを返却。一般的には登録後のデータを返却する。
        Book book = new Book();
        book.setId(id);
        book.setName(name);
        book.setPageCount(pageCount);

        return book;
    }

    public Author registerAuthor(String id, String firstName, String lastName) {
        // 実際はここでデータ登録処理を行う

        // GraphQLのスキーマ定義に則りAuthorを返却。一般的には登録後のデータを返却する。
        Author author = new Author();
        author.setId(id);
        author.setFirstName(firstName);
        author.setLastName(lastName);

        return author;
    }
}

쿼리는 다음과 같습니다.
mutation {
  registerBook(id:"1", name:"bookName", pageCount:100) {
    id
    name
    pageCount
  }
  registerAuthor(id:"1", firstName:"fName", lastName: "lName") {
    id
    firstName
    lastName
  }
}

쿼리 변수를 사용하여 Mutation 실행



"쿼리 변수"라는 것을 사용하여 Mutation에서 등록하는 값을 동적으로 바꿀 수도 있습니다. 쿼리는 다음과 같습니다.
mutation createBook($id:ID $name:String! $pageCount:Int) {
  registerBook(id:$id, name:$name, pageCount: $pageCount) {
    id
    name
    pageCount
  }
  registerAuthor(id:$id, firstName:"fName", lastName: "lName") {
    id
    firstName
    lastName
  }
}

쿼리 변수를 받으려면 구문상 mutation 다음에 임의의 mutation 이름이 필요합니다 (위에서 createBook이라고 함). 쿼리 변수는 머리에 "$"를 붙여 임의의 변수명이 됩니다.

GraphiQL, GraphQL Playground에는 쿼리 변수 창이 있으므로 그 창에서 변수에 설정하는 값을 JSON 형식으로 설정하여 실행합니다. JSON의 키 이름이 쿼리 변수 이름이 됩니다.


이상입니다.

좋은 웹페이지 즐겨찾기