スキーマ駆動開発
2023春

株式会社オロ・スキーマ駆動エンジニア・すわ

Webアプリケーション

HTTPリクエスト

HTTPレスポンス

どんなデータをどんな構造で送受信するのか
≒ スキーマ
を、決める必要がある

ふつうの開発

設計書をつくる

コードをかく

スキーマ駆動開発

機械可読な設計書をかく

コードを生成する

きょうの話

Node.js用 Webサーバフレームワーク

で、スキーマ駆動開発を加速させる

Process

機械可読な設計書

OpenAPIを利用

コード生成

TypeScriptコードを自動生成

Fastifyで読み込む

スキーマに従って開発

1. 機械可読な設計書

OpenAPI Specification

という

「仕様書の仕様」

に従って

仕様書をかきます

paths:
  /api/auth:
    get:
      operationId: getAuthentication
      summary: トークン有効確認
      tags:
        - Authentication
      security:
        - AccessToken: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  user:
                    $ref: "#/components/schemas/User"
                required:
                  - user
        401:
          description: Unauthorized

ztrehagemさん(わたし)が作ったコード生成ツールを使って
Fastify向けのTypeScriptコードを生成します

 

@ztrehagem/openapi-to-fastify-schema
https://github.com/ztrehagem/openapi-to-fastify-schema

2. コード生成

$ npm install @ztrehagem/openapi-to-fastify-schema
$ npx openapi-to-fastify-schema ./path/to/your/openapi.yaml

3. Fastifyで読み込む

生成されたコードをFastifyで読み込むと……

  1. リクエスト&レスポンスに型チェックが効く !!!
     
  2. 実行時、リクエストがバリデーションされる !!!
fastify.withTypeProvider<JsonSchemaToTsProvider>().route({
  ...generatedSchemas.getUser,
  handler: async (req, reply) => {
    // Typed!
    req.params.userHandle;

    await reply.status(200).send({
      // Typed!
      user: {
        handle: "foo",
        name: "bar",
      },
    });
  },
});

スキーマ駆動でラクになる!

これ→

  1. もちろんFastify以外に対しても
    スキーマ駆動に活用できます
    FlatNavyではAPI呼び出し側のコード生成も
    しています

     
  2. 人間可読なドキュメントも
    生成できます
    Swagger Editor
paths:
  /api/auth:
    get:
      operationId: getAuthentication
      summary: トークン有効確認
      tags:
        - Authentication
      security:
        - AccessToken: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  user:
                    $ref: "#/components/schemas/User"
                required:
                  - user
        401:
          description: Unauthorized

スキーマ駆動開発
2023春

幸せな生活を手に入れよう

スキーマ駆動開発2023春

By Shigeki Suwa

スキーマ駆動開発2023春

  • 238