NestJS(×PostgreSQL)デビューした
経緯
私は普段、株式会社NEXSで基本的にフルスタックのWEBアプリケーションをNuxt3(×MySQL)で開発してます。が、最近他の企業のお手伝いをしたり、就職したり、今年2025年1月に新しい会社を作ったりと普段の環境とは違う開発が諸々あります。
で、最近は電子カルテの部門システムの開発をほぼ2名で行っているのですが、私の担当はバックエンドになりました。とはいえメインの打ち合わせや設計はもう一人の方に丸投げしたために、使用するフレームワークやらDBの選定も言われた通り、ということになりました。
バックエンドと言えば、最近はHonoとか人気なのかなあとか、Go言語を使って云々かなあ、とか話しましたが、あまり挑戦するタイミングでもないので、安定感の高そうなNestJSが無難かな、ということで選定されました。とはいえ、PHPに始まりNuxt3(API込)の開発をしてきた私はNestJSは初めてです。
NestJS
NestJSとは何ぞや、ですが、以下Wikipediaより。
NestJS (または単に Nest) は、プログレッシブ Web アプリ開発用のサーバーサイド Node.js ベースの Web フレームワークであり、MIT ライセンス...
記事によっては、"Express"と人気を二分する、とか書いてありますが、"NestJS"自体が"Express.js"の上に構築されているので、二分も何もないとは思いますが。
まあ詳しいことはここでは語りません。以下の記事等、記事はまあまああると思いますのでご参照ください。
所感
まずぱっと見はちょっと難しそうです、ただ使ってみると難しいことは特にありません。ただ、少なくとも日本語の記事がそんなに多くないのと、NestJSならではの特徴がさほど見受けられないために、将来的にどうなのか、と思うところはあります。比較的新しいながら、業界的には枯れた安定技術なのかもしれません。
印象としては「正統派」です。ファイル構造など色々めんどくさい理念が見えます。構造などはAngularに似ているようで、Angularを使ったことのある方には馴染みやすいそうですが、結局覇権を取れなかったAngularに共感できる方がどれだけいるかは謎です。ま、Google式、みたいな印象です。SOLID原則に忠実。
まずやるべきこと
私は最初日本語の記事を探しましたが、あまり役には立たなかったと思います。NestJSのモジュールのせいもあるとは思いますが、NestJSだけではなく、プラスで使うDBやORM次第のインストール方法の解説などが多く、入門には向かない印象でした。
というわけで、公式の記事を読むべきと思います。英語ですが、Google翻訳で読んでも全然問題ないです。手を動かしながら2,3ページ読めば概要はつかめます。まずはそこからと思います。結構わかりやすくシンプルです。
思うところ
まず2017年誕生当時からすればTypeScript前提、設定無しでTypeScript環境が使用できるのはメリットだったのかもしれません。が、今となってはこれはもはや当たりまえになっており、特にメリットではありません。
とするとNestJSの特徴はこのAngular寄りのモジュール構造なのかな?と思うのですが、はっきり言ってViewを持たないバックエンドにこの構造が必要だったのかは甚だ疑問です。
Service(Provider)に実装、Controllerにルーティングを書くようになっており、曰くこれがSOLID原則に適っているらしいのですが、実用的には不要部分が多すぎます。
例えばNuxt3で実装するAPIであれば、ファイル名とディレクト構造がそのままエンドポイントであり、そもそもControllerにルーティングを記載する、などといったことは不要です。わざわざコードを見ずともルーティングが理解できます。これをわざわざ一つのファイルに書き出すことが、現実的なメリットになる、というのは無理があるのではないでしょうか。私の感覚では、この理念が先走って実用をおろそかにすることろが実にGoogle的(Google開発ではない)だなと思います。
とはいうものの、Next、Nuxtを除けば、Nodeのバックエンド用の定番フレームワークはあまり見つからないので、NestJSという選択肢はまあまだ有効なのかなとは思います。
DBライブラリ選定
本題はどっちかというとこっちになるのかもしれない、でもこっちは言いたいことが複雑なので別記事にした方が良いのかもしれない。
兎も角、ORMを使わずDB操作するぜって方、NestJS×PostgreSQLでお勧めのライブラリはnode-postgresです。さらに言うと、これのNest拡張?のnest-postgresが良いと思います。
対象の有名ライブラリはおおよそ以下になると思います。
「pg(node-postgres)」「sequelize」「pg-promise」「postgresql」
ダウンロード数比較が以下で見れますが、pgが圧倒的です。
pg-promiseはまるでnode-postgresを非同期にしたような名前をしてますが、昔は実際そうだったと思うのですが、現在はpgも非同期に対応してます。あと、pg-promiseはESでうまく動かないケースがままあります。
pgはプレイスホルダ?の書き方が$1,$2,,,と書いていく方式で、多分この書き方しかなく、これが納得いかないのですが、まあ動くので良いかな。
最後に二言
ORMに頼るんじゃねえぞ?
アプリの基本であり根本はDBだ。
ORMは様々なDBに対する操作の統一には使ってもよいが、どのようなSQLが吐かれるかわからないまま使うべきではないと思うなあ。
PostgreSQLを使うと会社がつぶれる(なんてことは無いと思うけど、周辺環境が悪すぎる、MySQLが圧倒的に良い)、これはいずれ別の記事にしよう。
Discussion