職場の方にその存在を教えてもらった、GraphQL というものに今回はトライしてみたいと思いますが、
GraphQL supports reading, writing (mutating) and subscribing to changes to data (realtime updates).
Major GraphQL clients include Apollo Client and Relay. GraphQL servers are available for multiple languages, including Haskell, JavaScript, Python, Ruby, Java, C#, Scala, Go, Elixir, Erlang, PHP, R, and Clojure.
On the 9th February 2018, the GraphQL Schema Definition Language (SDL) was made part of the specification.
⇧ Facebookによって開発されたそうな。最近、情報流出なんかで話題ですが、技術的にはすごいことやってるんですね。
まぁ、Google も情報流出してたとか言ってますし、なんだかな~って感じですかね。
とうわけで、今回はGraphQL にトライ。
タイトルからも分かる通り、2018年10月21日(日)現在、Exampleが未完成ということが判明...よって、まだ、実行ができていない感じです。
GraphQLって?
SQLっていうクエリ言語と同じく、GraphQLもクエリ言語という枠組みの中のものらしいですね。
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.
で、クエリ言語で有名なSQLのイメージが強いせいか、クエリ言語と聞くと真っ先にデータベースとのやり取りを思い浮かべてしまう情弱な私です。
問い合わせ言語(といあわせげんご、query language:略記QL)とは、コンピュータのデータに対して問い合わせをするためのコンピュータ言語である。
データの構造(データモデル)によってさまざまである。たとえば、関係データベースに対する問い合わせ言語は、関係代数の集合演算、比較、ソートといった機能を持つものが多い。
なお、コンピュータのデータベースを扱うためのコンピュータ言語をデータベース言語という。
問い合わせ言語とデータベース言語は、概念的に重なる部分もあるが、同義ではない。
⇧ Wikipedia様の説明によりますと、クエリ言語 ≠ データベース言語 じゃない、つまりデータベースだけ扱ってるわけじゃないのよ、他にも違った形式のデータともやり取りしてるのよ、と。
そんじゃ、GraphQLは、どうなのよ?
⇧ GraphQL の公式による、Architectureの説明では、メジャーな使い方としてはやっぱりデータベースとのやりとりがメインらしいんですが、GraphQL Serverというフロントサーバをデータベースの前に立てて、クライアントからのリクエストをデータベースに、データベース側からのレスポンスをクライアントにという中継役を担っている感じでしょうか?
■ 単一のデータベースに
■ 複数のデータベースに、プロキシーサーバ的な役回り?
■ 1つのデータベースを他のデータベースと共有
っていう3つの使い方ができるらしい。
クエリを投げると、GraphQL Server のリゾルバーが、後述するスキーマ定義を基にJSONオブジェクトを生成して、レスポンスとして返すみたいですね。
そして、データベースとどう連携するかの具体的な部分の説明が無いという...
GraphQL is the better REST らしい
RESTより良いって言われてもね~、そもRESTって?
⇧ 上記サイト様によりますと、REST(Representational state transfer)とは、HTTPのArchitectureを活用して、インターネット上のコンピューターとやり取りするって感じですかね?
んじゃあ、RESTよりイケイケなGraphQLの特徴って?
- リクエストとレスポンスの関係の改善
- データの固定化問題の解決
- 不要なデータのレスポンスの解決
- n +1 問題の解決
- フロント側とサーバ側の依存性の改善
- クライアントのデータを分析可能
- GraphQLスキーマ定義言語(SDL)によって、クライアントとサーバのデータ構造を決定
などなど。
詳細は、
⇧ の内容をGoogle 翻訳でチェケラ~。
The Schema Definition Language (SDL) が、核らしい
GraphQLの最もコアなコンセプトであるらしい。
GraphQL Server側で、スキーマを定義しておいて、クライアントは、スキーマに関連するクエリを GraphQL Server側 に送り、GraphQL Server側 は、クエリにマッチしたスキーマで構成されたJSONオブジェクトを、クライントに返すといった流れですかね。
なので、あらかじめ、サーバ側でスキーマを定義しておく必要があると。
JavaでGraphQL Server を試してみる
では、さっそく試してみますか。
https://www.graphql-java.com/documentation/ で、チュートリアルっぽいことは試せるんですが、クライント側の実装が不明と。
なので、今回は既に作成してるものを利用させていただきました。
https://github.com/graphql-java/graphql-java-db-example にアクセス。
⇧ 上記サイト様によりますと、
クライアント側で、graphiql.js を使ってますね。あとは、react.min.js とかのJavaScriptファイルを、html で読み込んでるので、それらの機能を使って、サーバ側(この場合は、Java)とやり取りしてる感じですかね。データベースとしては、sqlite を使ってるようです。
JOOQっていうORM(Object-relational mapping)フレームワークを利用してるようです。
OOQはHibernateやMyBatisなどと同じORMフレームワークです。
無償で使用できるOpen Source版と有償版(Express,Professional,Enterprice)があります。
有償版は商用データベース(Oracle,SQL Serverなど)も使え、Eメールによるサポートも受けられるようです。
エディションの違いはChoose your jOOQ Editionで詳しく説明されています。
他にも、サーバ側では、Gsonとか使ってるし、GraphQL Server としては、クライアントからのクエリを、サーバ側のスキーマを基に、JSONオブジェクトにデシリアライズする感じですかね。
とりあえず、
https://github.com/graphql-java/graphql-java-db-example にアクセスして、「Clone or download」をクリックして、URLコピーします。
そしたらば、Eclipseのワークスペースのディレクトリで右クリックし、「SVN チェックアウト(K)...」。
さきほどのURLの末尾に「/trunk」を付けて、「リポジトリのURL:」に入力。
「OK」で。
プロジェクトが、Eclipseのワークスペースにセットされました。
Eclipseを起動してみます。
まぁ、何ていうか、TortoiseSVNは、Eclipseと連動してるわけじゃないから、Eclipseにプロジェクトが認識されてないと。
なので、「ファイル(F)」>「インポート(I)...」。
「Gradle」>「Exsiting Gradle Project」を選択。
「参照...」で、git-hubからチェックアウトしたプロジェクトを選択。
「次へ(N)>」。
「次へ(N)>」。
「完了(F)」で。
Eclipseにプロジェクトとしてインポートされました。
そしたら、「gradlew.bat」を実行すれば良いんですかね。Eclipseの「パッケージ・エクスプローラー」上の「gradlew.bat」をダブルクリックすると、シェルが立ち上がって処理してくれます。
ファイアーウォール出たら、「アクセスを許可する(A)」で。
もし、「Gradle タスク」とかが表示されていない場合は、「ウィンドウ(W)」>「その他(O)...」で。
「Gradle」>「Gradleタスク」で。
「Gradle タスク」で、「build」>「build」上で右クリックし、「Gradle タスクの実行」。
「Gradle 実行」タブに切り替わって、結果が表示されます。
続いて、「Gradle タスク」タブに戻って、「application」>「run」で。
アプリケーションが起動するので、
ブラウザで、「http://localhost:3000/」にアクセスすると 、サンプルが表示されました。
をクリックすると、
実行結果が表示されるらしい。
なんかエラーっぽい?
queryを作らないといけないらしい、ですが、
⇧ 2018年10月21日(日)現在、まだ未実装だったという...TODOってなってるしね...実装できないのに、なんでGitHubで公開してるんじゃと。
⇧ query は絶賛制作中ということですかね...
致し方ないので、EclipseのほうでGradle Runしてたのを停止。
をクリックで実行を停止できるようです。
まぁ、とりあえず、来週あたりになってもExampleが完成してなかったら、他のSampleを模索してみますかね。Exampleでは、sqliteとかも使ってると思われますが、sqliteインストールせんで良いのか謎ですな、説明一切ないし。
というか、まだ、発展途上感が半端ないですね...
今回はこのへんで。
番外編
Javaとかのプロジェクトは、インポートの方法の選択で、「一般」とかを選んじゃうと、Javaのビルドとかされないから注意が必要ですかね...
ここからは、駄目な例。
「ディレクトリー(R)...」を選択。
git-hubからダウンロードしてきたプロジェクトを選択。
「完了(F)」で。
で、見事に、Javaのビルド・パスとか設定されないので、もれなく、Javaライブラリのimportとかされない状態になってしまうとさ。