Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL入門-Spring Bootで作ってみた/GraphQL Spring Boot...

Avatar for Y.Kaneko Y.Kaneko
December 13, 2019
4

GraphQL入門-Spring Bootで作ってみた/GraphQL Spring Boot Sample

Avatar for Y.Kaneko

Y.Kaneko

December 13, 2019

Transcript

  1. 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. --- https://graphql.org/
  2. GraphQLとは? • 必要なデータをクライアント側で指定できる // 名前だけ必要な時のリクエストの例 { getAllUsers { name }

    } // 色々なデータが必要な時のリクエストの例 { getAllUsers { name id occupation age birthday } } 通常のRESTなAPIはレスポンスに含まれるデータが決まっているが、 GraphQLの存在する世界では、クライアント側が APIを呼ぶ際にレスポンスに必要なデータを指 定する 「過剰な取得」と「過小な取得」をなくすことができる
  3. GraphQLの基本的な文法 スキーマ GraphQLを採用したAPIはエンドポイントの集合ではなく、 定義された「型」の集合と考える ※1 この型定義を『スキーマ』と呼ぶ ※1 Eve Porcello Alex

    Banks 著、尾崎 沙耶、あんどうやすし訳 『初めてのGraphQL』O'Reilly Japan, Inc ,2019, p.132 サーバー エンドポイント クライアント サーバー クライアント スキーマ サーバーとクライアント間での 「契約」 -> スキーマ駆動開発
  4. GraphQLの基本的な文法 スキーマ type Player { id: ID! # <- フィールド名:

    データ型で定義する name: String! # <- 型名の後の「!」はNon-Nullable、「!」がなければNullable => Kotlinと逆 team: Team # <- 組み込みのスカラー型(Int, Float, String, Boolean, ID)の他に、 # 自分で定義した型も使える positions: [Position!] # <- 複数の値を持つリストは[ ]で囲む } type Team { id: ID! teamName: String! field: Field! } 型定義の例 (プロ野球選手の情報を取得する APIを想定) この他にもEnumやInterface等、色々とありますが今日は割愛
  5. GraphQLの基本的な文法 クエリ # 実際にリクエストをするときは以下のような文字列のクエリをAPI にパラメーターとして送る { getPlayerByID(id: ID!) { id

    name # <- ここで、APIに返してもらいたいフィールドを指定する } } 定義された型に基づきデータを取得する問い合わせ言語 # どんなクエリが使えるかも「型」として事前に定義される type Query { getPlayerByID(id: ID!): Player # <- パラメーターと戻り値も型で定義される }
  6. Spring Bootで作ってみた resourcesにスキーマの定義ファイルを作成 type Player { id: ID! name: String!

    team: Team positions: [Position!] } type Position { id: ID! positionName: String! } type Query { getPlayerByID(id: ID!): Player getAllPlayers: [Player!] } schemas.graphqls
  7. Spring Bootで作ってみた スキーマで定義された型に対応するデータ型を作成 data class Player(val id: String, val name:

    String) enum class Team(val id: String, val teamName: String, val field: Field) { YANKEES(id = "1", teamName = "NewYork Yankees", field = Field.YANKEE_STADIUM), CUBS(id = "2", teamName = "Chicago Cubs", field = Field.WRIGLEY_FIELD), MARINERS(id = "3", teamName = "Seattle Mariners", field = Field.T_MOBILE_PARK), ANGELS(id = "4", teamName = "LosAngels Angels of Anaheim", field = Field.ANGEL_STADIUM); }
  8. Spring Bootで作ってみた スキーマで定義された Queryを解決するResolverを実装する @Component class QueryResolver( val playerRepository: PlayerRepository

    ) : GraphQLQueryResolver { // スキーマで定義されたQueryと同じ名前のメソッドを定義すると勝手に呼ばれる(Reflection) fun getPlayerByID(id: String): Player? = playerRepository.getPlayerByID(id = id) fun getAllPlayers(): List<Player> = playerRepository.getAllPlayers() }
  9. Spring Bootで作ってみた GraphQLResolver<T> を実装すると、勝手に解決してくれます @Component class PlayerResolver( val teamRepository: TeamRepository,

    val positionRepository: PositionRepository ) : GraphQLResolver<Player> { fun getTeam(player: Player): Team? { return teamRepository.getTeamByPlayer(player = player) } fun getPositions(player: Player): List<Position> { return positionRepository.getPositionByPlayer(player = player) } }