1. HOME
  2. ブログ
  3. IT技術
  4. GraphQL開発で覚えておきべき機能を紹介!

GraphQL開発で覚えておきべき機能を紹介!

はじめに

本日はGraqhQL開発で覚えておきべき機能についていくつか解説していきます。
GraphQL開発に始めてアサインされた方や紹介する機能を使用していないという方などのお役に立てれば幸いです。

※ railsで「GraphQL Ruby」を使用して説明します。

ご紹介する内容

フィールドの「description」について

フィールドのデフォルト値の設定方法

リゾルバの種類について

フィールドの「description」について

「description」とは、フィールドがなにを表すデータなのかを記述する説明文になります。
desctiptionを記述するとGraphQLツールでスキーマを閲覧する際に内容が表示され、フィールドの目的や使用方法を理解するのに役立ちます。

コードを読む際も、「あ〜こういうデータなのか」といった予備知識を持った状態でコードを読むことができ、コードリーディング時間を大幅に削減できます。
実際に「description」を定義し、GraphQLツールで表示を確認してみましょう。


例えば「全てのユーザー情報を取得する」usersクエリがあるとします。
ユーザー情報はUserTypeとして「description」は以下のように定義することができます。

QueryTypeでは以下のように定義します。
usersメソッドはusersフィールドのリゾルバです。Userモデルの全データを返しています。

これをGraphQLツールのGraphiQL-Railsで表示してみると以下のように表示されます。


このようにスキーマの構造を理解する助けになるため、ぜひ全フィールドに追加してみましょう。(※後から全て追加するのはかなり大変です)

フィールドのデフォルト値の設定方法

特定のフィールドの値がない場合にカスタムリゾルバを使用することでデフォルト値を設定することができます。
例えば以下のUserTypeのisMarriedフィールドに値がない場合はどうなるでしょうか?

クエリを叩いてみると、以下のようにisMarriedが万が一nullの場合「isMarriedはnull許可していないけどnullになってますよ」とエラーが発生してしまいます。

isMarriedをnull許容に設定すれば、エラーは出ませんが、isMarriedの値が存在する前提で処理をしたいといった要件がある場合は、デフォルト値を設定してみましょう。
isMarriedがnullであれば、「false」を返す設定をしてみます。

デフォルト値の設定例

UserTypeのclass内にフィールド名と同名のメソッドを定義すれば、カスタムリゾルバとして、個別にフィールドの処理をしてくれます。
この時に出てくるobjectは、isMarriedの上の階層のusersフィールドのリゾルバの「User.all」で取得したUserモデルのデータが入ってきます。

このように上位階層のリゾルバの処理結果が、下の階層のリゾルバに渡され、その値を参照することでフィールドごとに個別設定をすることができます。
デフォルト値を設定したことで以下のようにエラーにならずに処理結果を受け取ることができました。

リゾルバの種類について

リゾルバには以下のように2種類のリゾルバがあります。

  1. カスタムリゾルバ
  2. デフォルトリゾルバ

カスタムリゾルバとは、特定のフィールドや操作に対して明示的に定義する関数です。
usersフィールドのusersメソッドがそれに当たります。

デフォルトリゾルバとは、特にカスタムリゾルバが定義されていない場合にGraphQLシステムによって自動的に使用されるリゾルバです。
User.allによって、UserTypeのフィールドには特にリゾルバを設定しなくても値を取得することができました。
これは内部でデフォルトリゾルバが適用されているためになります。

デフォルトリゾルバは以下のような特徴があります。

オブジェクトにプロパティやメソッドがあれば、その結果を返す

 

つまり、UserTypeのフィールドそれぞれに個別のリゾルバの設定を書かなくても、Userモデルが同名のプロパティやメソッドを持っていれば、その結果を返してくれるということになります。
この振る舞いを使用する例を見てみましょう。

UserTypeに「fullNameフィールド」を追加します。

次にUserモデルにfull_nameメソッドを定義します。

クエリを実行すると、full_nameメソッドの処理結果を受け取ることができました。

このようにUserTypeにUserモデルに存在しないフィールドを追加した場合でも、Userモデルにメソッドを追加するだけでフィールドを拡張したり、特定のオブジェクトタイプの処理を独自クラスで行ったりすることができます。
ぜひこの振る舞いは覚えておきましょう。

最後に

今回はGraqhQL開発で覚えておきべき機能について紹介させていただきました。
私自身GraqhQLについて詳しくない時、「description」をほとんど書いておらず、後から追加するのに苦労しました。
リゾルバに関しても「そんな振る舞いがあったの知らなかった...」という方がいらっしゃいましたら少しでも参考なれば幸いです。

書いた人はこんな人

はっと(エンジニア)
はっと(エンジニア)
服部晋平と申します!
前職では映像業や配送業に携わっていました。
趣味は、バイクツーリングに行ったり、美味しいラーメン屋巡りです。
未経験という身で入社させていただいたので、人一倍努力して頑張っていきたいと思います!

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア