Nest.js x TypeORMでinitializeが遅い時
何があったのか?
Nest.jsとTypeORMの構成でバックエンドを作成していた時に、異様にinitializeが遅い時があった。
TypeOrmModule dependencies initialized +0ms
詳しい構成としては、Nest.jsとTypeORMのwebサービスとmysqlのDBをDockerizeした構成。
普段の時は問題なかったが、データを更新するためのスクリプトを作成している時にローカルに大量のデータ(gzファイルで2GBくらい)入れたところ、TypeORMのモジュールの初期化がめっちゃ遅くなった。
現状、ファイルを保存するごとに再ビルドしてくれるようになっていたのだが、如何せんアプリの起動が遅すぎるので開発が全然進められずに困っていました。
何をやったか
最初はTypeORMモジュールで渡すEntityの指定の仕方を変えてみたり(ファイルのパスから定義配列に変える)、マイグレーションがおかしくなっていないかどうか確認してみたのですが、効果なく。。。
色々試したりしているところで、本番環境では問題なく動いているため、おそらくローカル環境の問題だろうということに気づき始め、ormconfig周りを調べ変更してみたところ。。。解決しました!
その設定というのがormconfigのsynchronize
でした。
結論、これがtrue
になっていたことが原因だったようで、これをfalse
にし、サービスを再起動してみたところ問題なくアプリが起動されました!
なぜこのようなことが起こったのか?
結局、synchronize
がtrue
のだとなぜこのようなことが起こるのかについてですが、そもsynchronize
とは
Setting synchronize makes sure your entities will be synced with the database, every time you run the application.
でも書かれているように、Entityファイルとデータベースとを同期してくれる設定です。これをONにすることで、Entityに何か変更があった際に自動でデータベースの方にも反映してくれるのですが、データ量が多いとどうやら初期の同期に時間がかかるっぽくこのような現象が起こったようです。
開発時はEntityを変更したら自動でDBの構成も変更してくれるので便利ですが、ローカルで大量のデータを使う際はオフにしておくのがよさそうですね!