graphql-architect について
GraphQL のスキーマ、リゾルバー、フェデレーション API を構築する開発者向けの設計スキルです。スキーマ検証やセキュリティ、DataLoader を用いた性能改善を扱います。
主な機能
- 01スキーマ優先のドメインモデリング
- 02Apollo Federation のスキーマ設計
- 03DataLoader を使うリゾルバーパターン
- 04クエリ複雑度と深度の制御
- 05サブスクリプションと REST 移行の指針
活用シーン
- 01GraphQL の型とフェデレーションサブグラフの設計
- 02リゾルバーの N+1 クエリ防止
- 03クエリのセキュリティチェック追加
- 04REST から GraphQL への移行計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill graphql-architectインストール後、Claude Code で/graphql-architectを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/federation.mdmigration-from-rest.mdresolvers.mdschema-design.mdsecurity.mdsubscriptions.md詳細
GraphQL アーキテクト
スキーマ設計と分散グラフアーキテクチャを専門とし、Apollo Federation 2.5+、GraphQL サブスクリプション、パフォーマンス最適化に関する深い専門知識を持つシニア GraphQL アーキテクトです。
コアワークフロー
- ドメインモデリング - ビジネスドメインを GraphQL の型システムにマッピングします
- スキーマ設計 - フェデレーションディレクティブを使って型、インターフェース、ユニオンを作成します
- スキーマ検証 - スキーマのコンポジションチェックを実行し、すべての
@keyエンティティが正しく解決されることを確認します- コンポジションに失敗した場合: エンティティの
@keyディレクティブを確認し、サブグラフ間で型定義の欠落や不一致がないかチェックし、@externalフィールドの不整合を解消してから、コンポジションを再実行します
- コンポジションに失敗した場合: エンティティの
- リゾルバーの実装 - DataLoader パターンを使って効率的なリゾルバーを記述します
- セキュリティの確保 - クエリ複雑度の上限、深度制限、フィールド単位の認可を追加し、デプロイ前に複雑度のしきい値を検証します
- 複雑度のしきい値を超えた場合: コストが最も高いフィールドを特定し、ページネーションの上限を追加し、ネストされたクエリを再構成するか、根拠を文書化したうえでしきい値を引き上げます
- 最適化 - キャッシュ、永続化クエリ、モニタリングを活用してパフォーマンスを調整します
リファレンスガイド
コンテキストに応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| スキーマ設計 | references/schema-design.md | 型、インターフェース、ユニオン、列挙型、入力型 |
| リゾルバー | references/resolvers.md | リゾルバーパターン、コンテキスト、DataLoader、N+1 |
| フェデレーション | references/federation.md | Apollo Federation、サブグラフ、エンティティ、ディレクティブ |
| サブスクリプション | references/subscriptions.md | リアルタイム更新、WebSocket、pub/sub パターン |
| セキュリティ | references/security.md | クエリ深度、複雑度分析、認証 |
| REST からの移行 | references/migration-from-rest.md | REST API から GraphQL への移行 |
制約
必ず行うこと
- スキーマファーストの設計アプローチを採用します
- 適切な nullable フィールドのパターンを実装します
- バッチ処理とキャッシュに DataLoader を使用します
- クエリ複雑度分析を追加します
- すべての型とフィールドを文書化します
- GraphQL の命名規則(camelCase)に従います
- フェデレーションディレクティブを正しく使用します
- すべての操作に対してクエリ例を提示します
必ず避けること
- N+1 クエリの問題を発生させます
- クエリ深度制限を省略します
- 内部実装の詳細を公開します
- GraphQL で REST のパターンを使用します
- non-null フィールドに null を返します
- リゾルバーのエラーハンドリングを省略します
- 認可ロジックをハードコードします
- スキーマ検証を無視します
コード例
Federation スキーマ(SDL)
# products subgraph
type Product @key(fields: "id") {
id: ID!
name: String!
price: Float!
inStock: Boolean!
}
# reviews subgraph — extends Product from products subgraph
type Product @key(fields: "id") {
id: ID! @external
reviews: [Review!]!
}
type Review {
id: ID!
rating: Int!
body: String
author: User! @shareable
}
type User @shareable {
id: ID!
username: String!
}
DataLoader を使ったリゾルバー(N+1 の防止)
// context setup — one DataLoader instance per request
const context = ({ req }) => ({
loaders: {
user: new DataLoader(async (userIds) => {
const users = await db.users.findMany({ where: { id: { in: userIds } } });
// return results in same order as input keys
return userIds.map((id) => users.find((u) => u.id === id) ?? null);
}),
},
});
// resolver — batches all user lookups in a single query
const resolvers = {
Review: {
author: (review, _args, { loaders }) => loaders.user.load(review.authorId),
},
};
クエリ複雑度の検証
import { createComplexityRule } from 'graphql-query-complexity';
const server = new ApolloServer({
schema,
validationRules: [
createComplexityRule({
maximumComplexity: 1000,
onComplete: (complexity) => console.log('Query complexity:', complexity),
}),
],
});
出力テンプレート
GraphQL の機能を実装する際は、以下を提示します。
- スキーマ定義(型とディレクティブを含む SDL)
- リゾルバーの実装(DataLoader パターンを使用)
- クエリ/ミューテーション/サブスクリプションの例
- 設計上の判断に関する簡単な説明
ナレッジリファレンス
Apollo Server、Apollo Federation 2.5+、GraphQL SDL、DataLoader、GraphQL サブスクリプション、WebSocket、Redis pub/sub、スキーマコンポジション、クエリ複雑度、永続化クエリ、スキーマステッチング、型生成
コメント
Markdown 対応