GraphQL
Link
学習メモ
名前はよく聞くが使ったことなかった. 一通り使い方を学ぶ
「実践マイクロサービスAPI」を読む
GraphQL専門の本じゃないけど入門書としていいよという話を聞いたので, とりあえずこの本を読んでみる
この本の第8章 ~ 第10章がGraphQLの話
ハンズオン形式みたいな感じ. まえがきでも述べているが, 第1章と第3章を読んでおけば途中は飛ばしてもOK
実際, 途中の部分は読んでないが困ることはほとんどなかった
第4章 ~ 第7章はREST APIの話. OpenAPIとかを使ってみているらしい
各章のあらすじ:
第8章: GraphQLの導入と, GraphQLのスキーマを書いてみる
第9章: 書いたスキーマをモックサーバ上で動かし, リクエストの仕方を学ぶ
第10章: モックではなく GraphQL サーバを実装してみる by Python
所感:
GraphQLサーバの実装ってかなり複雑じゃない?という印象があったが, ライブラリ経由すれば, 自分で宣言した Query と Mutation についてリゾルバの実装に注力すればよく, 雰囲気がわかった
GraphQLを使えこなせれば 参照系APIの実装ではかなり役立ちそう
フロントtoバックでN+1問題を回避できるという宣伝をよく聞いていいたが, マイクロサービスアーキテクチャのシステムではバックtoバックでも導入できるとシナジーがありそう
更新系APIをGraphQLで実装したいかと問われると, どうだろう…
スキーマを使い回せるのはもちろん嬉しい
宣言的にクエリを書いて実装は隠蔽するというのは SQL に似た感触を覚えた. 複雑なクエリになってくるとパフォーマンス的にどんな感じになるのかはまだ分からないが…
DBでいうところの実行計画みたいなものを考えることもあるのだろうか
debugのときに欲しくなるというシチュはありそう
リゾルバ実装とクエリ実行の間はライブラリが担っているが, ここの信頼性が気になる
機能面としては結合テストすれば広く担保できるとは思うが, 非機能面はどうなるか
やはり実行計画が欲しい
運悪くひどい実行計画を引いてしまい, クエリ実行の際に実はDBアクセスや外部参照の回数がとんでもないことになってました, みたいな状況がこわい
DBとは違いコストベースで実行計画を建てることはないだろうから, ある日突然性能が悪化するみたいな状況はないと思うが…
Pagination の実装をサンプルでは自前でやってて, 簡単にできないものかと思った
これを使えばよさそう
スキーマ定義したのだからコーディングでも型の恩恵を受けたいと思ったが, ここでは活かされていないようで…
ID型の一意性がどこで有効活用されているのか? 例がなかった気がする
サンプルではProductとIngredientとでどちらもidとして単にID型を使っているが, 個人的な感覚ではこれは避けたい. 少なくとも専用のスカラ型をそれぞれ用意しておきたい
DDD的な観点で. APIでやり取りするスキーマではあまり気にしなくてもいい? 気にしたい
第9章で利用している graphql-faker が上手く動かず困った
とりあえず Docker で動かした
docker run -v=${PWD}:/workdir -p=9002:9002 apisguru/graphql-faker ./schema.graphql
「GraphiQL」 は初見で誤植かと思ったが正しかった
その他
Apollo Server の Get started をやってみると, node.js 上で簡単な GraphQL サーバを建てる練習になってよかった
書籍: 初めてのGraphQL
GraphQL に特化した本はググってもあまりなさそう
この本は標準的な入門書な感じがする
なので取り敢えず入手してパラパラ眺めてみる
実践練習
GraphQLを用いたサービスをイチから自作してみる
図書館のサービスを想定
図書館利用者のアカウント管理
書籍情報、本の在庫管理
etc
複数の言語で実装を練習してみたいので, マイクロサービスアーキテクチャにして, サービス毎に別々の言語を用いて実装する
library_user_service:
言語: TypeScript
ランタイムの選定 → Bun
候補: Node.js, deno, Bun
なるべくモダンなものを使ってみたい
過去に Bun を使ってみたとき, 手軽に素早く動かせて好印象だった. HTTP サーバも簡単
Apollo Server 自体は Bun 上でも動いた
GraphQL Server 構築ライブラリの選定 → GraphQL Yoga
まずは Apollo Server でやってみようと思ったが, カスタムルーティングを追加しようとしたり, middleware を挟もうとすると, framework integration したくなってくる
標準で Expressjs の integration がついているらしい. 依存関係が少ない状態を保っておきたいので, できればこれでやりたい
Expressjs 名前はよく聞いていていたが, 使ったことなかった
ドキュメントも整理されているが, しかしコードの書き方が若干古い感じがするな…
調べてみると Apollo Server 以外にも GraphQL Yoga というものがあるらしいと知る
ルーティングのカスタマイズ方法はわからないが必須要件ではなく, 色々充実していてモダンな感じなので, これを採用することにする
ドキュメントは GraphQL 初心者向けという感じではなく, 細かな手順は省略されいてるなと感じることがある. そのときには Apollo Server のドキュメントの似たような部分を読んだりして補う
book_service:
言語: Golang
サーバ: Echo + gqlgen
選定理由: 特に深い理由はない. デファクト・スタンダードっぽいのでとりあえず
GraphQL Yoga と同様 gqlgen にも GraphiQL playground が同梱されているので, ちょっとした動作確認が簡単にできる
Memo