# GraphQLって何!
# ゴール
- GraphQLでどんなことができるのか理解する
- どんな登場人物がいるのか理解する
# GraphQLとは
- Facebookが開発したAPIにアクセスするためのクエリ言語
- クライアントからサーバへのアクセスをクエリ言語で操作できる
- SQLを叩くような感じでサーバにアクセスできる
# GraphQLを使った通信のイメージ

- サーバがGraphQLを用いてAPIを公開し、クライアントがGraphQLを用いてアクセスすることで利用できる
- 双方がGraphQLに対応している必要がある
- GraphQLでラップされているとはいえ単なるHTTP通信でしかない
- パラメータの構築などはGraphQLのライブラリがやってくれる
- なのでクエリを叩いているような感覚で通信処理を実装できる
# GraphQLの特徴
- エンドポイントが一つ
- POSTの
/graphqlしか使わない - 処理の振り分けは全てパラメータで行う
- POSTの
- オーバーフェッチ/アンダーフェッチがない
- 必要な情報だけを過不足なく取得できる
- 例えばユーザ一覧を取得するときに名前だけでいいのに部署や年齢を取得してしまうようなことがない
- モバイル環境を考えると通信するデータ量は少しでも削減したい
- 一度の通信で必要なデータを取得できる
- ネストするような情報でも一度の通信で取得できる
- 部署情報と所属する社員情報がほしい時にRESTだと2本必要だが1本で取得できる
# GraphQLの仕組み
# Query/Mutation
- 取得系の処理はQuery、操作系の処理はMutationを実行する
- RESTでいうところのGETはQuery

- RESTでいうところのPOST/PUT/PATCH/DELETEはMutation

- どのようなQueryやMutationを実行できるかはサーバ側で定義する
- クライアントはそれらを実行することになる
# Type
- GraphQLはデータの型を定義できる
- 型の種類
- StringやIntといった事前に定義された型
- UserやDepartmentなど独自に定義する型
- フィールドを持つことができる
- クライアントはサーバで定義された型に従ってほしいフィールドを指定する
- 指定したフィールドのみ取得できるためオーバーフェッチが発生しない

# Schema
- 実行可能なQueryやMutationの一覧、それらに紐づく型の情報をSchemaと呼ぶ
- この一覧を公開することでクライアントが何を実行できるのか知ることができる

# Resolver
- QueryやMutationが実行された時にどのような処理をするのかの定義したもの
- 処理の中ではビジネスロジックを実行したりDBアクセスを行うことになる
- 使用するプログラミング言語やライブラリのお作法にのっとって書くことになる
- Schemaに定義したQuery/Mutationと対になるように定義する

# Response
- GraphQLのレスポンスのフォーマットは基本的に
dataとerrorの2つのフィイールドとなる dataにはレスポンスの本体を格納する
errorにはエラーがあった場合にエラーの情報を格納する- 内容は特に決まっていないのでプロジェクトごとにどんな情報を返すか決める

- 内容は特に決まっていないのでプロジェクトごとにどんな情報を返すか決める