Contents
GraphQLとは(RESTとの比較)
GraphQLはデータクエリ言語として設計され、クライアントが必要とするデータの構造とフィールドを明確に指定できる点が特徴です。一方でREST APIでは、リソースごとに固定されたエンドポイントが必要であり、過剰なデータ取得(over-fetching)や不足したデータ取得(under-fetching)といった課題がありました。
REST APIの限界とGraphQLの特徴
| 比較項目 | REST API | GraphQL |
|---|---|---|
| 通信回数 | リソースごとに複数回必要 | 1つのエンドポイントで完了 |
| データ構造 | 固定されたレスポンス形式 | クライアントが指定できる柔軟な構造 |
| バージョン管理 | APIの変更に伴う破壊的変更リスク | スキーマを元に進化可能 |
GraphQLでは、以下のクエリにより必要なデータのみ取得可能です。
|
1 2 3 4 5 6 7 |
{ user(id: "123") { id name } } |
NestJSプロジェクト初期設定方法
NestJSでGraphQLサーバを構築するにはまず、Node.js環境とプロジェクトを作成します。以下に手順をまとめます。
Node.js環境確認とCLIによるプロジェクト生成
1. Node.js v18以降のインストールを推奨します
最新のnpmが動作していることを確認してください。公式ドキュメントでサポートされるバージョンを参照してください。
|
1 2 3 |
node -v npm -v |
2. CLIツールによるプロジェクト生成
NestJS CLIを使用して、プロジェクトテンプレートを初期化します。以下のようにコマンドを実行してください。
|
1 2 3 |
npx @nestjs/cli new graphql-server cd graphql-server |
3. プロジェクト構成確認
package.jsonとtsconfig.jsonが生成され、プロジェクトベースディレクトリ(src/)が作成されます。
GraphQLモジュールの導入手順
NestJSにGraphQLを統合するには、必要なパッケージをインストールし、GraphQLModuleを設定します。Apollo Serverを選択した理由は、Expressとの親和性と機能的な拡張性があるためです。代替案として@nestjs/graphqlのみでも利用可能です。
必要なパッケージのインストール
以下のコマンドでライブラリを追加してください。
|
1 2 |
npm install @nestjs/graphql apollo-server-express graphql |
TypeScriptでのスキーマ定義
GraphQLでは、データモデルをTypeScriptで定義し、GraphQL型に変換します。@ObjectTypeや@InputTypeなどのデコレータを使います。
型定義ファイルの作成場所と具体例
以下のように、srcディレクトリ内にmodelsフォルダを作成し、型定義ファイルを配置します。
|
1 2 3 4 5 |
src/ ├── models/ │ ├── user.model.ts │ └── create-user.input.ts |
@ObjectTypeの具体例(user.model.ts)
|
1 2 3 4 5 6 7 8 9 10 11 |
import { ObjectType, Field } from '@nestjs/graphql'; @ObjectType() export class User { @Field(() => String) id: string; @Field(() => String) name: string; } |
@InputTypeの具体例(create-user.input.ts)
|
1 2 3 4 5 6 7 8 |
import { InputType, Field } from '@nestjs/graphql'; @InputType() export class CreateUserInput { @Field(() => String) name: string; } |
Resolverの作成と実装
Resolverはクエリやミューテーションを処理するための関数です。現実的な例として、データソース(例:DB)から情報を取得して返しますが、本チュートリアルではモックサービスを使用します。
Query用Resolverの基本構造
src/resolvers/user.resolver.tsに以下のコードを記述してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import { Resolver, Query } from '@nestjs/graphql'; import { User } from '../models/user.model'; import { UsersService } from '../users/users.service'; @Resolver() export class UserResolver { constructor(private readonly usersService: UsersService) {} @Query(() => [User]) getUsers(): Promise<User[]> { return this.usersService.findAll(); } } |
モックサービスの実装例(users.service.ts)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import { Injectable } from '@nestjs/common'; import { User } from '../models/user.model'; @Injectable() export class UsersService { private users: User[] = [ { id: '1', name: '山田太郎' }, { id: '2', name: '佐藤花子' } ]; findAll(): Promise<User[]> { return Promise.resolve(this.users); } findOne(id: string): Promise<User> { return Promise.resolve(this.users.find(user => user.id === id)); } } |
GraphiQLでのクエリテスト方法
GraphQLサーバの起動とGraphiQLでのクエリテスト手順を説明します。
起動コマンド確認
以下のコマンドでサーバを起動してください。http://localhost:3000/graphqlにアクセス可能です。
|
1 2 |
npm run start:dev |
まとめ
本記事では、NestJSを使用してGraphQLサーバを構築する手順について以下のポイントを解説しました:
- GraphQLとは何か、REST APIとの違い(柔軟なデータ取得)
- NestJSプロジェクトの初期設定方法(CLI使用)
- GraphQLモジュールの導入手順(パッケージインストール)
- TypeScriptでのスキーマ定義(
@ObjectType,@InputTypeデコレータ) - Resolverの作成と実装(Query関数の例)
- GraphiQLでのクエリテスト方法
この記事を参考に、実際にコードを書きながらGraphQLサーバを作成してみてください。具体的な手順を踏むことで、NestJSによるGraphQL構築の基礎が理解できるでしょう。