スキーマ駆動開発の一つの役割の終わり 2025/09/22 Findy TECH BATON 株式会社COTEN / 秋山 雅之
2 スキーマ駆動開発の一つの役割の終わり 自己紹介 秋山 雅之 @aki202 株式会社COTENで世界史データベースを作っています。 Copyright COTEN inc. all rights reserved. 2
3 スキーマ駆動開発の一つの役割の終わり 境界とスキーマ 境界があるところにスキーマが要る フロントエンドと バックエンド 複数言語 複数クライアント Copyright COTEN inc. all rights reserved. 外部API 3
3 スキーマ駆動開発の一つの役割の終わり 境界とスキーマ 境界があるところにスキーマが要る フロントエンドと 複数言語 バックエンド フルスタックTypeScriptで ここの境界がなくなってきた 複数クライアント Copyright COTEN inc. all rights reserved. 外部API 3
4 スキーマ駆動開発の一つの役割の終わり コンポーネントからデータ層へのアクセス容易性 Next.js の RSC と Server Actions コンポーネントからデータ層へシームレスにアクセスできるようになった。 データフェッチはRSC(v13.4~)、ミューテーションはServer Actions(v14~)で行うことを公式が推奨。 Copyright COTEN inc. all rights reserved. 4
5 スキーマ駆動開発の一つの役割の終わり フロントエンドとバックエンドが別システムとして分断されていた事例 従来のよくある構成 フロントエンドとバックエンドが別居して いるケース。 定義したスキーマにフロントエンドとバッ クエンドが従属。型空間が2つある。 気にする点が色々あった スキーマと実装のずれ リリース前後のずれ 型一致 API クライアント スキーマ定義 (OpenAPI) コール 型一致 バックエンド 使用 React コンポーネント Copyright COTEN inc. all rights reserved. フロントエンド バックエンド 5
6 モーダリティとモードレスネス AppRouterがもたらした光景 AppRouter以後 全て単一のNext.jsに載せ、型空間が1つに。 見かけ上、フロントエンドから直接バックエ ンドの処理を呼べるように。 もはやAPIエンドポイントの定義が不要に なった。 型一致 React コンポーネント Copyright COTEN inc. all rights reserved. コール バックエンド 6
8 モーダリティとモードレスネス バリデーション バリデーションはカバー範囲外 「バックエンド側の入力データバリデーション」「フロントエンド側のフォームバリデーション」は 引き続き必要。そのため zod などを使ったスキーマ定義があった方がいい。 Copyright COTEN inc. all rights reserved. 8
9 モーダリティとモードレスネス 信頼境界 信頼境界 フロントエンド バックエンド 「信頼できる領域とできない領域を分ける境界線」 従来方式 React コンポーネント Server Actions React コンポーネント API クライアント プレゼンテー ション層 Copyright COTEN inc. all rights reserved. ユースケース 層 ドメイン層 DB Server Actions ドメイン層 DB 9
10 package by feature AppRouter moduler monolith モーダリティとモードレスネス 今やってる構成 App Router Moduler Monolith app/ … 中身は package by feature posts/ schema.ts … スキーマ定義(zod) actions.ts … Server Actions定義(バリデートしモジュール関数を呼ぶ) new/ page.tsx … フェッチ/ミューテーションはServer Actionsを呼ぶ form.tsx … バリデーション付きフォーム modules/ post/ index.ts … モジュールのエンドポイント Copyright COTEN inc. all rights reserved. 10
11 モーダリティとモードレスネス Webアプリケーションのスキーマをめぐる過去20年のパラダイムシフト 年代 〜2003 2004頃 2008頃 2014頃 2016頃 2018頃 2022頃 2023〜 技術 パラダイムシフト CGI, ASP HTMLをサーバ側で生成していた時代 部分的にデータの非同期取得が始まる(境界の発生 ) AJAX jQuery クライアントのリッチ化 SPA / BFF データフェッチやミューテーションは全て非同期に(境界の拡大 ) TypeScript フロントエンドにも型の概念が浸透し始める スキーマ駆動 OpenAPI/tRPC/GraphQLをベースにした型共有 RSC HTMLをサーバ側で生成していた時代に戻り始める(境界の再統合 ) Server Actions APIエンドポイントの定義自体が不要になる Copyright COTEN inc. all rights reserved. 11
13 まとめ スキーマ駆動開発の一つの役割の終わり まとめ RSC と Server Actions で TypeScript フルスタックならフロントエンドとバックエンドの境界が溶けてきた 一方、信頼境界を引く必要があり、データバリデーションのためにスキーマは必要 バックエンドが別システム / 複数言語 / 複数クライアントサポートなどの要件では 引き続きスキーマ駆動開発は大切 Copyright COTEN inc. all rights reserved. 13