Nest.js+GraphQLにおける開発手法とORMに関する考察
はじめに
最近Nest.jsについて勉強を始めものすごく使いやすいフレームワークであるというふうに思っています。元々GraphQLを使っ位たいと思っていてNest.jsが相性が良さそうだと思いました。
そこでわかったのはNest.jsにはコードファースト・スキーマファーストの2種類の開発手法があるということ、Node.jsにはTypeORMとPrismaといった2つのORMが人気であること。組み合わせとしてはこの2つで4種類あるのですがどれを使うか迷っていましたがついに決めることができました。
この記事では結論を書いた後にそれぞれ触ってみた感想を書き最後にその結論に至った理由を説明していこうと思います。
結論
結論から書きます。
スキーマファーストとPrismaを選択しました。
以下でそれぞれを触った理由を書いていきます。
コードファースト
コードファーストは名前の通りコードを書いて行ってそのコードからNest.jsがGraphQLのスキーマを生成してくれるといったものです。モデルやDTOも全て自分が定義します。自分で定義するのでモデルにデータベースのテーブル定義とGraphQLのフィールド定義を同じ一つのクラスにまとめることができます。DTOも同時にバリデーションを実装できたりします。コードの生成はGraphQLのスキーマのみです。
スキーマファースト
コードファーストの逆でGraphQLスキーマを書きNest.jsがそのスキーマに応じてTypeScriptの型を生成してくれます。それぞれのクエリやミューテーション一覧のコードはもちろんインプットやモデルの型も生成してくれます。
ここからORMについて
TypeORM
公式サイト : https://typeorm.io
よくある感じのORMです。モデルを定義してデコレーターを使ってカラムを作っていくオプションはカラムデコレーターの中に入れる。リレーションもデコレーターで定義できます。
メリット
シンプルで無難。使いやすい。普段使っているGo用のORMであるGORMと文法が似ていて馴染みやすかった。
デメリット
リレーションを組む時のデコレーターで使わない変数をコードに入れないといけないのが個人的に気になってしまった。
Prisma
公式サイト : https://www.prisma.io/
GraphQLに似た独自のスキーマがありそのファイルでモデルの定義ができる。モデルの定義後はそのモデルをもとにそのモデル専用のコードがnode_modulesに生成されます。orm自体のコード以外にも更新や作成のための型も作られます。
メリット
デメリットとも捉えれるかもしれませんが他のORMと比べてAPIの量が非常に多いです。型定義もものすごくしっかりしていてPrismaでランタイム中に型によるエラー出せないのでは?というくらいです。Whereやリレーション先についてもしっかり型がついています。
デメリット
文法が複雑になりやすい印象があります。ちょっとしたことでもオブジェクトで書かないといけないことが多いです。他のORMと比べて文法が全然違います。
採用理由
先ほども書きましたがそれぞれを触ってみて結論としてスキーマファーストとPrismaを選択しました。
まず個人的に触っていて開発手法を決めると自ずとORMが決まると感じました。その組み合わせが
コードファースト→TypeORM
スキーマファースト→Prisma
です。コードファーストならモデルにフィールド情報とカラム情報を同時に書くことができるという大きなメリットがあります。スキーマファーストならいっそモデルを自分で定義する必要がなくなるのでPrismaと相性が良いと感じました。
そこで自分がコードファーストとスキーマファーストどちらで開発がしたいかと考えたときにGraphQL使うならスキーマファーストの方が良いと感じたためスキーマファースト+Prismaを採用することにしました。
APIの種類も多くそれぞれの名前も見たときに一瞬でわかるといった点も大きかったです。リポジトリの関数に対して任意の引数を定義することによってその関数の可能性を広げやすかったというのも採用理由の一つです。
どうしてもチュートリアルを少し進めてドキュメントを見ながら触ったくらいなのでそれぞれのメリット・デメリットの革新的な部分に気づくことができていませんが今後この組み合わせで開発をしていき共有したい発見があればまた更新します!
この記事が気に入ったらサポートをしてみませんか?