Graphql JavaScript Nest.js プログラミング

NestJSとGraphQLの基礎

近年、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

  • 「依存性の注入」
  • 依存関係のあるオブジェクトを外部から渡す

 

 

まとめ

-Graphql, JavaScript, Nest.js, プログラミング