初めに
社内発表のため、Docker + NestJS + TypeORM + GraphQLでプロジェクトを作ってみました。
実行した結果は以下のGITHUBを参考してください。
Docker以外には全部新しい経験だったのでこのプロジェクトを作成した時に知っておくべきの知識をまとめてみました。
コードはここを参考
NestJS+GraphQLの組み合わせに関して重要な理解ポイント
NestJSとGraphQLが組み合わさると、通常MVCパターンで最初に構成されるNESTの使い方が少し変わってきます。MVCの中でControllerが消え、代わりにその場をResolverが担当します。GraphQLでResolverとはQueryとMutation(定義は↓参考)を提供するLayerであると考えれば簡単だが、Controllerの役割がURLとリソースを受け取る役割であれば、ResolverはGraphQLの特徴であるQueryとMutationを受けて、その結果をクオリでリターンする。
[QueryとMutationは?]
Query → SELECT分に使える. RESTでGETと該当
Mutation → INSERT, UPDATE, DELETEに使える。RESTではPOST,PUT,PATCH,DELETEに該当
NestJSに関して重要な理解ポイント
📌 MODULE
NESTJSで最も重要な部分の一つはモジュールです。
NestJSでは、アプリケーションを正常に実行するために、各モジュールを集めて、一つのルートモジュールを設定する必要があります。
例えば、注文アプリケーションを作成する場合、図のようにユーザーモジュール + 注文モジュール + チャットモジュールを組み合わせてNestJSアプリケーションを実行します。
モジュールをどう設計するかはどこまでもプログラマの自由ですが、逆にこれを悪く設計した時は
難しいプロジェクトになる可能性が高いです。
📌 プロジェクト構成
NESTJS基盤のプロジェクトを作成すると以下のようにapp.module.tsが作成されます。
👉 main.ts:サーバ駆動時に実行されるファイルである。
👉 app.module.ts: main.tsで唯一呼び出すモジュールである。 該当モジュールに使用したいDB接続、モジュール、GraphQL設定ができる。
👉 *.module.ts:使用するコントローラ、サービスまたはResolverなどのモジュールで使用するLayerを定義する。 該当モジュールを使用するためにapp.module.tsにインポートされなければならない。
👉 *.resolver.ts:queryまたはmutationを受けてサービスレイヤーに伝達する。
👉 *.service.ts:サービス、ビジネスロジックを処理する。
👉 *.entity.ts:DBに生成されるオブジェクトを定義する。
📌 @
Javaでは@はannotationと呼ばれますが、NESTJSではdecoratorです。
TypeORMの重要なポイント
📌 Active Record Pattern VS Data Mapper Pattern
TypeOrmの大きな特徴の一つは、作成パターンにActiveRecord PatternとData Mapper Patternがあります。Active Record Patternは、Model自体内ですべての Query Methodを定義し、Model Methodを使用してObjectを生成、削除、照会、修正できるようにする方式を意味します。
Data Mapper Patternは、「Repository」という別のClassで、すべてのQuery Methodを定義し、この「Repository」を使用してObjectを生成、削除、照会、修正することができます。
詳細は以下を参考してください。
まとめ
今回、Docker + NestJS + TypeORM + GraphQLの構成は色々新しい情報が多いし、boilerplateプロジェクトでもあって、良い設計とか詳しいところは全然気にしなかったです。
次はこのプロジェクトをRefactoringしながら、それぞれの技術の長点を最大活かせる方法に関して
工夫してみたいと思いました。