FaceBookによって作られたGraphQL を試してみる、JavaのExampleで、ですが、Exampleが未完だった...

職場の方にその存在を教えてもらった、GraphQL というものに今回はトライしてみたいと思いますが、

GraphQL is an open source data query and manipulation language, and a runtime for fulfilling queries with existing data. GraphQL was developed internally by Facebook in 2012 before being publicly released in 2015. It provides a more efficient, powerful and flexible alternative to REST and ad-hoc web service architectures. It allows clients to define the structure of the data required, and exactly the same structure of the data is returned from the server, therefore preventing excessively large amounts of data from being returned.

 

GraphQL - Wikipedia

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, PythonRuby, 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.

GraphQL - Wikipedia

⇧  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.

GraphQL | A query language for your API

graphql.org

で、クエリ言語で有名なSQLのイメージが強いせいか、クエリ言語と聞くと真っ先にデータベースとのやり取りを思い浮かべてしまう情弱な私です。

問い合わせ言語(といあわせげんご、query language:略記QL)とは、コンピュータのデータに対して問い合わせをするためのコンピュータ言語である。

データの構造データモデル)によってさまざまである。たとえば、関係データベースに対する問い合わせ言語は、関係代数の集合演算、比較、ソートといった機能を持つものが多い。

なお、コンピュータのデータベースを扱うためのコンピュータ言語データベース言語という。

問い合わせ言語とデータベース言語は、概念的に重なる部分もあるが、同義ではない。

問い合わせ言語 - Wikipedia

⇧  Wikipedia様の説明によりますと、クエリ言語  データベース言語 じゃない、つまりデータベースだけ扱ってるわけじゃないのよ、他にも違った形式のデータともやり取りしてるのよ、と。

そんじゃ、GraphQLは、どうなのよ?

www.howtographql.com

⇧  GraphQL の公式による、Architectureの説明では、メジャーな使い方としてはやっぱりデータベースとのやりとりがメインらしいんですが、GraphQL Serverというフロントサーバをデータベースの前に立てて、クライアントからのリクエストをデータベースに、データベース側からのレスポンスをクライアントにという中継役を担っている感じでしょうか?

■ 単一のデータベースに

f:id:ts0818:20181010205557p:plain

■ 複数のデータベースに、プロキシーサーバ的な役回り?

f:id:ts0818:20181010205618p:plain

■ 1つのデータベースを他のデータベースと共有

f:id:ts0818:20181010205751p:plain

っていう3つの使い方ができるらしい。 

クエリを投げると、GraphQL Server のリゾルバーが、後述するスキーマ定義を基にJSONオブジェクトを生成して、レスポンスとして返すみたいですね。

f:id:ts0818:20181010222235p:plain

そして、データベースとどう連携するかの具体的な部分の説明が無いという...

 

GraphQL is the better REST らしい

RESTより良いって言われてもね~、そもRESTって?

wp.tech-style.info

qiita.com

www.topgate.co.jp

⇧ 上記サイト様によりますと、REST(Representational state transfer)とは、HTTPのArchitectureを活用して、インターネット上のコンピューターとやり取りするって感じですかね?

んじゃあ、RESTよりイケイケなGraphQLの特徴って?

  1. リクエストとレスポンスの関係の改善
  2. データの固定化問題の解決
  3. 不要なデータのレスポンスの解決
  4. n +1 問題の解決
  5. フロント側とサーバ側の依存性の改善
  6. クライアントのデータを分析可能
  7. GraphQLスキーマ定義言語(SDL)によって、クライアントとサーバのデータ構造を決定

 などなど。

詳細は、

www.howtographql.com

⇧  の内容をGoogle 翻訳でチェケラ~。

 

The Schema Definition Language (SDL) が、核らしい

GraphQLの最もコアなコンセプトであるらしい。

GraphQL Server側で、スキーマを定義しておいて、クライアントは、スキーマに関連するクエリを GraphQL Server側 に送り、GraphQL Server側 は、クエリにマッチしたスキーマで構成されたJSONオブジェクトを、クライントに返すといった流れですかね。

なので、あらかじめ、サーバ側でスキーマを定義しておく必要があると。

 

 

JavaでGraphQL Server を試してみる

では、さっそく試してみますか。

https://www.graphql-java.com/documentation/ で、チュートリアルっぽいことは試せるんですが、クライント側の実装が不明と。

f:id:ts0818:20181010222034p:plain

 

なので、今回は既に作成してるものを利用させていただきました。

https://github.com/graphql-java/graphql-java-db-example にアクセス。

github.com


⇧  上記サイト様によりますと、

 クライアント側で、graphiql.js を使ってますね。あとは、react.min.js とかのJavaScriptファイルを、html で読み込んでるので、それらの機能を使って、サーバ側(この場合は、Java)とやり取りしてる感じですかね。データベースとしては、sqlite を使ってるようです。

JOOQっていうORM(Object-relational mapping)フレームワークを利用してるようです。

qiita.com

OOQはHibernateやMyBatisなどと同じORMフレームワークです。
無償で使用できるOpen Source版と有償版(Express,Professional,Enterprice)があります。
有償版は商用データベース(Oracle,SQL Serverなど)も使え、Eメールによるサポートも受けられるようです。
エディションの違いはChoose your jOOQ Editionで詳しく説明されています。

jOOQ使用方法のまとめ

qiita.com

 

他にも、サーバ側では、Gsonとか使ってるし、GraphQL Server としては、クライアントからのクエリを、サーバ側のスキーマを基に、JSONオブジェクトにデシリアライズする感じですかね。 

とりあえず、

https://github.com/graphql-java/graphql-java-db-example にアクセスして、「Clone or download」をクリックして、URLコピーします。

f:id:ts0818:20181021120533p:plain

そしたらば、Eclipseワークスペースディレクトリで右クリックし、「SVN チェックアウト(K)...」。

f:id:ts0818:20181021134019p:plain

さきほどのURLの末尾に「/trunk」を付けて、「リポジトリのURL:」に入力。

f:id:ts0818:20181021140716p:plain

「OK」で。

f:id:ts0818:20181021140749p:plain

プロジェクトが、Eclipseワークスペースにセットされました。 

f:id:ts0818:20181021140853p:plain

Eclipseを起動してみます。

f:id:ts0818:20181021141054p:plain

まぁ、何ていうか、TortoiseSVNは、Eclipseと連動してるわけじゃないから、Eclipseにプロジェクトが認識されてないと。

f:id:ts0818:20181021141350p:plain

なので、「ファイル(F)」>「インポート(I)...」。

f:id:ts0818:20181021141601p:plain 「Gradle」>「Exsiting Gradle Project」を選択。

f:id:ts0818:20181021142710p:plain

 「参照...」で、git-hubからチェックアウトしたプロジェクトを選択。

f:id:ts0818:20181021142839p:plain

 「次へ(N)>」。

f:id:ts0818:20181021142944p:plain

「次へ(N)>」。

f:id:ts0818:20181021143348p:plain

「完了(F)」で。

f:id:ts0818:20181021143432p:plain

Eclipseにプロジェクトとしてインポートされました。

f:id:ts0818:20181021143817p:plain

そしたら、「gradlew.bat」を実行すれば良いんですかね。Eclipseの「パッケージ・エクスプローラー」上の「gradlew.bat」をダブルクリックすると、シェルが立ち上がって処理してくれます。

f:id:ts0818:20181021144151p:plain

ファイアーウォール出たら、「アクセスを許可する(A)」で。

f:id:ts0818:20181021144114p:plain

もし、「Gradle タスク」とかが表示されていない場合は、「ウィンドウ(W)」>「その他(O)...」で。

f:id:ts0818:20181021144812p:plain

「Gradle」>「Gradleタスク」で。

f:id:ts0818:20181021144934p:plain

「Gradle タスク」で、「build」>「build」上で右クリックし、「Gradle タスクの実行」。

f:id:ts0818:20181021145300p:plain

「Gradle 実行」タブに切り替わって、結果が表示されます。

f:id:ts0818:20181021145534p:plain

続いて、「Gradle タスク」タブに戻って、「application」>「run」で。

f:id:ts0818:20181021145702p:plain

アプリケーションが起動するので、

f:id:ts0818:20181021145824p:plain

ブラウザで、「http://localhost:3000/」にアクセスすると 、サンプルが表示されました。

f:id:ts0818:20181021150351p:plain をクリックすると、

f:id:ts0818:20181021145936p:plain

実行結果が表示されるらしい。

f:id:ts0818:20181021150317p:plain

なんかエラーっぽい?

f:id:ts0818:20181021151115p:plain

queryを作らないといけないらしい、ですが、

f:id:ts0818:20181021164833p:plain

⇧  2018年10月21日(日)現在、まだ未実装だったという...TODOってなってるしね...実装できないのに、なんでGitHubで公開してるんじゃと。

f:id:ts0818:20181021170404j:plain

⇧ query は絶賛制作中ということですかね...

 

 致し方ないので、EclipseのほうでGradle Runしてたのを停止。

f:id:ts0818:20181021170711p:plain をクリックで実行を停止できるようです。

f:id:ts0818:20181021170625p:plain

f:id:ts0818:20181021154509p:plain

まぁ、とりあえず、来週あたりになってもExampleが完成してなかったら、他のSampleを模索してみますかね。Exampleでは、sqliteとかも使ってると思われますが、sqliteインストールせんで良いのか謎ですな、説明一切ないし。

というか、まだ、発展途上感が半端ないですね...

今回はこのへんで。

 

番外編

 Javaとかのプロジェクトは、インポートの方法の選択で、「一般」とかを選んじゃうと、Javaのビルドとかされないから注意が必要ですかね...

ここからは、駄目な例。

f:id:ts0818:20181021141601p:plain

f:id:ts0818:20181021141926p:plain

ディレクトリー(R)...」を選択。

f:id:ts0818:20181021142027p:plain

git-hubからダウンロードしてきたプロジェクトを選択。

f:id:ts0818:20181021142149p:plain

「完了(F)」で。

f:id:ts0818:20181021142310p:plain

で、見事に、Javaのビルド・パスとか設定されないので、もれなく、Javaライブラリのimportとかされない状態になってしまうとさ。