【入門】RailsエンジニアがNestJS触ってみた
イントロダクション
こんにちは。
筆者は、かれこれ4年程度Ruby on Rails(以下、Rails)をメインで使用するバックエンドエンジニアでした。
しかし、今回担当する案件ではNode.jsの環境で動く「NestJS」という新たなフレームワークと対峙することになりました。
今まではRailsに標準で組み込まれた魔法(ライブラリ)と、Rubyというインタプリタ言語の恩恵を受けながら雰囲気で開発を乗り切ってきましたが、NestJSの世界はそんなに甘くないようです。
そのため、公式ドキュメントでNestJSの最初の一歩を踏み出してみました。
Railsとの違いを吟味しながら記事を書いてみましたので、筆者と同じくRailsからNestJSへ転換する方の参考になれば幸いです。
NestJSとは
効率的で信頼性が高く、スケーラブルなサーバー側アプリケーションを構築するための進歩的な Node.js フレームワーク。
====================
???
ま、まあ意味くらいは分かりますよ。
Railsは、erbなどのフロントエンドも含めたディレクトリを生成する「フルスタックフレームワーク」ですが、NestJSは、Node.js(JavaScriptのサーバーサイド環境)で動く「サーバー側に特化したフレームワーク」ということでしょう。
公式ドキュメントには、こうとも書いてあります。
====================
Node.js のおかげで、JavaScript はフロントエンド アプリケーションとバックエンド アプリケーションの両方で Web の「共通語」になりました。
(中略)
ですが、Node (およびサーバーサイド JavaScript) 用の優れたライブラリ、ヘルパー、およびツールが多数存在しますが、どれもアーキテクチャの主な問題を効果的に解決するものはありません。
====================
確かに、フロントエンドでのJavaScriptには、Vue・React・Angularなど様々なフレームワークがあります。
しかし、サーバーサイドとしてのJavaScript、もといNode.jsにはこれといったフレームワークがパッと思い浮かびませんでしたね。
そこで、Node.jsにとって最適なアーキテクチャを与えたのがNestJSということでしょう。
インストールからプロジェクト作成まで
NestJSがどんなものなのか分かったところで、早速動かしていきましょう。
Hello Worldまで道のりも公式ドキュメントを参考に、yarnでインストールがしたかったのでQiitaの記事も参考にさせていただきました。
インストール方法はこの記事にも載せておきます。
yarn global add @nestjs/cli
続いて、nestでプロジェクトの作成。
$ nest new project-name
このコマンドは、Railsでいうところの「rails new」と同じでしょう。
ディレクトリ構成
ここで、生成されたプロジェクトのディレクトリ構成を見てみましょう。
はい。よく分からないファイルがたくさんありますね。
NestJSの構成をRailsのMVCモデルに当てはめると大体こんな感じみたいです。(多分)
Rails: ユーザ → route.rb → controller → (model) → DB等に接続
Nest: ユーザ → main.ts → controller → service → repository → DB等に接続
repositoryという層は、デフォルトでは生成されていませんが、公式ドキュメントの「TECHNIQUES → Database」の欄を見てみると登場します。
「controller・service・repository」、この構成のことを 「3層アーキテクチャ」 と呼ぶんだとか、、、
HelloWorldしてみる
プロジェクトの作成ができたら、起動してみましょう。
$ cd project-name
$ yarn run start
「yarn run start」は、Railsでいうところの「rails server(rails s)」ですね。
yarn run v1.22.19
$ nest start
[Nest] 33787 - 2022/12/13 15:29:38 LOG [NestFactory] Starting Nest application...
[Nest] 33787 - 2022/12/13 15:29:38 LOG [InstanceLoader] AppModule dependencies initialized +30ms
[Nest] 33787 - 2022/12/13 15:29:38 LOG [RoutesResolver] AppController {/}: +4ms
[Nest] 33787 - 2022/12/13 15:29:38 LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 33787 - 2022/12/13 15:29:38 LOG [NestApplication] Nest application successfully started +1ms
このようにログが出ていれば準備完了。
Rails同様、NestJSもデフォルトのポート番号は3000になっているので「localhost:3000」にアクセスすれば起動を確認できそうです。
Chrome等のWebブラウザで確認しても良いですが、NestJSはサーバー側のフレームワークということで、折角なのでAPIクライアントで確認します。
ちなみに、筆者はAPIクライアントに「insomnia」を使っています。
それではHello Worldしてみましょう。
OK!
ちゃんと出てますね!
ちょっといじってみる
このままHello Worldだけやって終わるのも味気ないので、少しだけNestJSの内部をいじってみます。
デフォルトでは、service層にある「Hello World!」という文字列をreturnするようになっていますが、これを計算した数値を表示するようにしてみましょう。
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return "Hello World!"; // ここを変える
}
}
書き換えます、、、
こんな感じでしょうか、、?
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
const num = 10 + 2;
return num;
}
}
oops!!
VSCodeに怒られてしまいました。
getHello関数にも戻り値の型指定が必要で、変数「num」はstringではないので戻り値の型を変えてあげましょう。
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): number {
const num = 10 + 2;
return num;
}
}
OK、これで安心、、、
と思いきや、controller層も怒られていますね、、、
ここもgetHello関数の型を変えてあげましょう。
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): number {
return this.appService.getHello();
}
}
それでは、プロジェクトを再起動して確認してみましょう。
yarn run start
OK!
想定通り、「12」が表示されました!
最後に
以上、「RailsエンジニアがNestJS触ってみた」でした。
最後まで読んでいただきありがとうございました。
まだ分からないことが多く手探りですが、今後開発を進めていくとNestJSのアーキテクチャやTypeScriptの型システムの素晴らしさを感じることができるのではないかと思っています。
これまで色々な企業様のRailsアプリケーションを触ってきて、新規開発要件を高速で形にできるRailsの素晴らしさを味わってきました。
しかし、どのアプリケーションも、時が経つと例外なく腐敗臭がしてきます。
そうなると、当然Rails以外の環境にリプレイスする必要が出てくるでしょう。
そして、その新たな環境がNode.jsのフレームワークを用いたものであったのなら、必要とされる人材は 「Railsを理解していて、NestJSが使えるエンジニア」。
そう、未来の私たちのことなのかもしれません。
(完)
Discussion