0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

スキーマ駆動開発について調べたことをまとめました。

Posted at

1. スキーマ駆動開発の基本概念

スキーマ駆動開発では、スキーマ(APIの型やデータの形を定義する仕様)を先に定義することで、フロントエンドとバックエンドの開発が平行して行えるようになります。

2. GraphQLとスキーマ

GraphQLは、Facebookが開発したクエリ言語で、スキーマを中心としたAPIの設計を可能にします。

GraphQLのスキーマは、以下のように型を用いて定義されます。

type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}

User型:
UserはGraphQLのオブジェクト型です。
id, name, emailの3つのフィールドを持ちます。
ID!やString!の末尾の!はそのフィールドが非nullであることを意味します。

Query型:
QueryはGraphQLのルートクエリ型で、クエリのエントリポイントとして機能します。
この例では、userというフィールドを持ち、ID!型のidを引数として受け取ることで、特定のUserを返すことが定義されています。
このスキーマは、IDを受け取り、Userオブジェクトを返すクエリを定義しています。

2.1 単一エンドポイント

従来のRESTful APIがリソースごとに複数のエンドポイントを持つのに対し、GraphQLは通常、単一のエンドポイントで全てのデータの取得・変更を行います。

単一エンドポイントの特徴:
RESTful APIとの違い: RESTful APIでは、通常、リソースごと(例えばユーザー、記事、コメントなど)に異なるエンドポイントが存在します。例えば、ユーザー情報を取得するためのエンドポイント(/users)、記事を取得するためのエンドポイント(/articles)などが独立しています。

GraphQLのエンドポイント: 一方、GraphQLでは通常1つのエンドポイント(例: /graphql)を使用します。このエンドポイントを使用して、どのようなデータを取得するか、またはどのようにデータを変更するかを、クエリまたはミューテーションの形式で指定します。

なぜ単一のエンドポイントが役立つのか:
柔軟性: クライアントは1つのエンドポイントを通じて、必要なデータを精密に指定できます。このため、不要なデータの取得を避けることができ、効率的なデータ取得が可能となります。

APIのバージョン管理: 新しいフィールドや型を追加しても、既存のクエリに影響を与えないため、APIのバージョンアップが容易です。従来のRESTful APIの場合、新しいエンドポイントを追加するか、既存のエンドポイントを変更する必要がある場合が多いです。

簡潔なエラーハンドリング: 単一のエンドポイントを通じてエラー情報を一貫して取得できます。また、部分的なエラー(一部のフィールドが失敗しても他のフィールドが成功する場合など)もきちんとハンドリングできます。

開発とドキュメントの容易さ: エンドポイントが1つだけなので、開発やドキュメントの管理も一元化され、シンプルになります。

3. PythonでのGraphQLの実践例

PythonでGraphQLを使用する場合、grapheneというライブラリが利用できます。以下は、先ほどのスキーマをgrapheneで実装する例です。


import graphene

class User(graphene.ObjectType):
    id = graphene.ID(required=True)
    name = graphene.String(required=True)
    email = graphene.String(required=True)

class Query(graphene.ObjectType):
    user = graphene.Field(User, id=graphene.ID(required=True))

    def resolve_user(self, info, id):
        # この例ではハードコードしたデータを返しています。
        # 実際にはデータベースや他のAPIからデータを取得する。
        return User(id="1", name="John Doe", email="john.doe@example.com")

schema = graphene.Schema(query=Query)

このスキーマを使用すると、以下のようなクエリを投げることで、ユーザー情報を取得できます。

{
  user(id: "1") {
    name
    email
  }
}
  1. まとめ
    スキーマ駆動開発は、APIの設計と開発のプロセスを効率化するための有効なアプローチです。GraphQLはこのアプローチを実現するための強力なツールの1つで、適切な実践とともにAPI開発の品質と速度を大きく向上させることができます。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?