近年、NestJSとGraphQLはバックエンド開発の世界で注目を集めています。この記事では、これらの技術の基本を解説し、どのようにNestJSでGraphQLを使用するのかを探求します。
1. GraphQLの概要
GraphQLは、Facebookによって2015年に発表されたデータクエリ言語とランタイムです。REST APIとは異なり、クライアントは必要なデータのみをリクエストし、必要な形式でレスポンスを受け取ることができます。これにより、データの過剰取得や不足を防ぐことができます。
2. GraphQLスキーマ
GraphQLの核心的な部分は、スキーマ定義です。スキーマは、サーバが提供するデータの形式や利用可能なクエリ・ミューテーション(データの変更操作)を明確に定義します。スキーマは、型システムに基づいており、各クエリが返すデータの形や型を保証します。
graphql
type User {
id: ID!
name: String!
email: String! }
type Query { users: [User!]! }
オブジェクト型
- 1つ以上のフィールドからなる集合の型
- クライアントから取得可能なデータの構造
- オブジェクトをネストさせることも可能
graphql
type オブジェクト型名 {
フィールド名1: 型名
フィールド名2: 型名
スカラー型
単一のフィールドにつける型
GraphQLでは5つのスカラー型が存在
- Int:整数型
- Float:浮動小数店数型
- String:文字列型
- Boolean:論理型
- ID:ユニークな文字列型
リスト型
フィールドが複数の値のリストからなる場合に使用
graphql
type User {
tasks: [Task]!
}
定義方法 | 意味 |
[String]! | リスト自体は必ず存在するが、null要素を持つ可能性がある |
[String!] | リスト自体はnullの可能性があるが、null要素を持つことはない |
[String!]! | リスト自体は必ず存在し、null要素も持たない |
[String] | リスト自体はnullの可能性があり、null要素を含む可能性がある |
Query型
GraphQL APIが提供するQueryのエントリーポイントを定義
graphql
type Query {
getTasks: [Task!]!
getTask(id:Int!):Task
}
query{
getTasks{
id
name
dueDate
status
description
}
}
Mutation型
GraphQL APIが提供するMutationのエントリーポイントを定義
graphql
type Mutation {
createTask(id: Int!,name: String!): Task!
deleteTask(id: Int!): Task!
}
3. NestJSの概要
NestJSは、TypeScriptベースのNode.jsフレームワークで、効率的でスケーラブルなサーバーサイドアプリケーションを構築するためのモダンな方法を提供します。DI(Dependency Injection)、モジュール性、非同期処理をサポートしており、大規模なエンタープライズアプリケーションにも適しています。
4. Nest.jsのアーキテクチャ
NestJSのアーキテクチャは、以下の主要な構造要素で構成されています:
Modules
アプリケーションの一部として関連性の高い機能をカプセル化するもの。
graphql
@Module({
imports: [PrismaModule],
providers: [TaskResolver,TaskService],
})
export class TaskModule{}
- imports:モジュール内部で必要な外部モジュールを記述
- providers: @Resolver、@Injectableデコレータがついたクラスを記述
- exports: 外部のモジュールにエクスポートしたいものを記述
リゾルバー
GraphQL APIがどのような処理を行うかを定義
データの取得はQuery。(追加・更新・削除)はMutation
REST APIのControllerのような立ち位置
graphql
//リゾルバーをかく
@Resolver()
export class TaskResolver{}
@Query(() => [Task])
getTasks(){
//タスク処理
}
@Mutation(() => Task)
createTask(){
//タスク作成処理
}
Services
- アプリケーション固有のビジネスロジックを定義する
- リゾルバーから呼び出すことでユースケースを実現する
graphql
インジェクトデコレータをつける
@Injectable()
export class UsersService{
find(userName: number){
// Find user
}
}
DI
- 「依存性の注入」
- 依存関係のあるオブジェクトを外部から渡す